同一個改動,兩個方向的承諾。CONTRACT STUDY / 13
合約變動,要分開看進與出。
比較兩份 OpenAPI 3.0.x,從 request 接受範圍與 response 回傳保證看差異。把分類、未知原因與引用來源放在一起,不連線服務,也不替真實 consumer 宣告相容。
01 / 這次合約如何改動?
BEFORE → AFTER · 3.0.x ONLY固定案例都是人工合成,不是外部服務或客戶資料。選案例後按比較。
YAML 1.2 core JSON-compatible grammar(包含 JSON 輸入,不是 strict JSON)。拒絕 aliases/anchors/tags/directives/多文件/merge/複雜鍵/重複鍵。每側 1,000,000 UTF-16 字碼單元,token depth 100/objects 200,000/entries 10,000/scalar source 100,000;先檢查 token,再建立文件。
02 / 先看覆蓋狀態,再看數量
| 方向 | 改動與原因 | 分類 |
|---|---|---|
| Request | 新增必填、number → integer、nullable true → false:收窄接受範圍。 | Breaking |
| Response | 必填變 optional、integer → number、nullable false → true:削弱回傳保證。 | Breaking |
| Request | Enum 新值:擴大接受集合。 | Non-breaking |
| Response | Enum 新值/新 status:可能影響 consumer 分支處理,不直接保證 breaking。 | Review |
Complete 表示已覆蓋的靜態子集,不是 compatible;仍可能有 breaking/review。Valid side 只表示 parser/root checks 通過,不是完整 OpenAPI conformance。Unknown 可以 findings.unknown = 0;逐側 issues 仍可能阻止完整結論。Invalid/limit/unsupported 沒有可比較結果,不是「沒有變更」。
支援邊界與固定判斷規則
僅 3.0.x。內部 $ref 有界解析:最多 16 hops/50,000 resolutions;missing/external/ref-only cycles/recursive schema 都可能 unknown,即使未變。$ref siblings 依 3.0 忽略並提示。Unsupported facets(composition/constraints/format/default/schema-valued additionalProperties)、serialization、headers、extensions 可能未變也 unknown;security/server 變動需審查。最多 50,000 比較 pairs、schema depth 64、5,000 findings;運算預算耗盡可保留明示不完整的 findings,finding/parser 超限不回傳截斷成功。
03 / 依方向與規則,回到來源
USE SITE ≠ DEFINITION ≠ CLIENT IMPACT04 / 只帶走縮減後的審查摘要
明確投影:狀態、靜態 codes/規則、結構 IDs、操作名稱、JSON Pointers/位置、引用使用點/計數與 limits。不含原始文件、AST、default/example/enum literal/description、server/security 值。IDs 不是值雜湊,但名稱/pointers 仍可能敏感,不是匿名化。
靜態差異,是審查起點,不是上線許可。
免登入。兩份文件只在目前頁面與專用 worker 記憶體處理;不執行 schema、不 fetch refs/endpoint、不上傳、不記錄輸入、不永久保存、不放進 query/hash/分享 URL。20 秒逾時、取消、編輯、重跑、清除或離開會終止 worker 並丟棄舊結果,沒有主執行緒解析 fallback。
已載入的樣本皆人工合成。位置採原始 UTF-16、end-exclusive;行/欄從 1 起算,保留 BOM/CRLF。共享定義的 findings 合併同規則/方向/definition,顯示前 20 個操作使用點與完整計數;這不是真實流量、所有 client 使用情況或傳遞影響樹。下載是主動行為,分享前請檢查。