Faying Protocol/1.0 — §10 Error Handling
§10 Error Handling
本章把 §5.4 的錯誤碼和具體的失敗場景、協定回應、狀態遷移、復原路徑、可觀測性約束放在一起講。所有錯誤都用 §5.2 信封下的 ERROR 封包回覆,claims 體形如 { code, message, mandate_id?, recovery_hint? }。除 §5.4 的錯誤碼表外,錯誤處理以本章四節為準。
EH.1 錯誤場景與協定回應
下表給出 §5.4 所列全部錯誤碼(1001–1014 與 1099)的全景視圖,每行包含:觸發場景、協定回應、是否觸發 Revoke、是否觸發降級、是否必入稽核鏈、是否必入 HP 視野通道。本表與 §5.4 錯誤碼表一一對應。
| Code | 名稱 | 觸發場景 | 協定回應 | 觸發 Revoke | 觸發降級 | 入稽核 | 入 HP 視野 |
|---|---|---|---|---|---|---|---|
| 1001 | E_NO_MANDATE | 業務請求未攜帶 Faying Protocol 標頭 / Mandate | RP 立即拒絕;不建立 audit | ✗ | ✗ | ✗ | ✗ |
| 1002 | E_MANDATE_EXPIRED | now > Mandate.not_after | RP 拒絕 + MS 觸發該 Mandate Revoke | ✓ | ✗ | ✓ | ✗ |
| 1003 | E_SCOPE_VIOLATION | 呼叫動作 ∉ Mandate.scope.actions | RP 拒絕 + 記錄可疑事件;累計可疑次數觸發降級 | ✗ | ✓(累計) | ✓ | ✗ |
| 1004 | E_GRADE_INSUFFICIENT | RP 要求 grade 強於當前 Mandate.grade | RP 拒絕 + 提示升級(升級路徑需 HP human_witness) | ✗ | ✗ | ✓ | ✗ |
| 1005 | E_PRESENCE_STALE | presence.last_freshness 超過 max_staleness_ms 或 LivenessDetectionBudget | RP 拒絕;IF 主動停止 D 維度,等待 PRESENCE 校準;狀態機 Active → Degraded | ✗ | ✓ | ✓ | ✗ |
| 1006 | E_REVOKED | RR 標記 revoked | RP 拒絕;級聯拒絕同鏈呼叫;IF 立即回退 Rogue Fay | ✓(已撤銷) | ✗ | ✓ | ✓ |
| 1007 | E_ATTESTATION_INVALID | Attestation Chain 節點簽章校驗失敗 / 時間戳記不在父節點 validity window 內 / endorsement 子欄位被篡改 | RP 拒絕 + MS 觸發該 Mandate 的 Revoke | ✓ | ✗ | ✓ | ✓ |
| 1008 | E_RR_UNAVAILABLE | RR 查詢逾時 ≥ StaleBudget | RP 按 Default-Deny 拒絕;IF 暫停所有 D 維度;狀態機 Active → Degraded | ✗ | ✓ | ✓ | ✗ |
| 1009 | E_REPLAY | nonce 在 2 × max_message_lifetime 內對相同 subject 已被見 | RP 拒絕 + 安全告警;IF 立即 rotate 工作階段金鑰 | ✗ | ✗ | ✓ | ✓ |
| 1010 | E_HUMAN_WITNESS_REQUIRED | grade-up / FAYING_REQUEST 等需 HP 見證場景缺失或 human_witness 校驗失敗 | RP / MS 拒絕;等待 HP 見證後重新發起 | ✗ | ✗ | ✓ | ✗ |
| 1011 | E_ROGUE_DETECTED | 偵測到 D 維度違規(ego-deviation / 行為基線超閾等) | RP 拒絕 + 強制 Revoke;IF 立即回退 Rogue Fay | ✓ | ✗ | ✓ | ✓ |
| 1012 | E_BUDGET_EXCEEDED | 呼叫累計超過 Scope.budget / ResourceBudget | RP 拒絕 + 觸發降級或(極端情形)Revoke | ✓(極端) | ✓ | ✓ | ✗ |
| 1013 | E_ENDORSEMENT_INVALID | endorsed_scope ⊄ scope / endorsed_grade.autonomy > grade.autonomy / endorsed_lifetime 缺失或超長 / endorsement 子欄位被篡改 / DELEGATE 子 endorsement 不收斂於父 | MS 拒絕簽發 + 觸發該 Mandate 的 Revoke;IF 立即停止全部 endorsed 行為 | ✓ | ✗ | ✓ | ✓ |
| 1014 | E_FAYING_REQUEST_NOT_CONFIRMED | iFay 主動發起的 FAYING_REQUEST 在 BootstrapTimeout 內未獲 HP 明確認可 | MS 以 FAYING_REQUEST_RESP { status="timeout" } 返回;不產生任何 Faying 狀態變化;事件寫入 Attestation Chain | ✗ | ✗ | ✓ | ✗ |
| 1099 | E_PROTOCOL | 版本 / 格式 / 欄位缺失 / 不可解析 / DISCLOSURE mandatory_fields 缺失或不可解析 / 簽章輸入不合法 / 未在 §5.3 封包清單中顯式列出的 msg_type | RP / MS 拒絕;觸發自 DISCLOSURE 路徑時額外 push HP 視野 | ✗ | ✗ | ✓ | ✗*(DISCLOSURE 路徑 ✓) |
*註:E_PROTOCOL預設僅寫入稽核鏈;當其觸發自 §5.3.7 DISCLOSURE 的mandatory_fields缺失或不可解析路徑時,MS 必須額外推送至 HP 視野通道(與 §5.4 註釋一致)。
Trace:R2.1.1–R2.1.4(預設拒絕)、R3.2.1–R3.2.3(錯誤事件入稽核與 HP 視野)、R4.2.1–R4.2.3(撤銷可見性預算與可達性)、R11.1.4(endorsement 篡改觸發 E_ATTESTATION_INVALID + Revoke)、R11.2.1–R11.2.3(endorsement 收斂違反觸發 E_ENDORSEMENT_INVALID)、R1.3.3(FAYING_REQUEST 逾時未認可觸發 E_FAYING_REQUEST_NOT_CONFIRMED)、R13.3.1(DISCLOSURE mandatory_fields 缺失或不可解析觸發 E_PROTOCOL)。
EH.2 復原路徑
按「是否需要重新建立 Faying 狀態」將錯誤碼劃分為三類復原路徑。所有復原路徑必須在 EH.4 Default-Deny 收斂之內執行,不存在樂觀放行的中間視窗。
EH.2.1 可復原錯誤(無需重新 BOOTSTRAP)
| Code | 名稱 | 復原動作 |
|---|---|---|
| 1004 | E_GRADE_INSUFFICIENT | 觸發 GRADE_SWITCH-up(必帶 HP human_witness,詳見 §7.4);不允許跳過見證復原 |
| 1005 | E_PRESENCE_STALE | 重新傳送 PRESENCE 封包,復原 last_freshness;若仍失敗按 LivenessDetectionBudget 收斂至 Degraded → Suspended |
| 1008 | E_RR_UNAVAILABLE | 在 Default-Deny 視窗內 retry-with-backoff(不超過 StaleBudget);超過即轉入 Degraded,等待 RR 復原後重連 |
| 1012 | E_BUDGET_EXCEEDED | 觸發 GRADE_SWITCH-down 或等待預算視窗刷新;不允許透過「忽略預算」復原 |
EH.2.2 需 HP 重新見證的復原(必須重新走 BOOTSTRAP)
| Code | 名稱 | 復原動作 |
|---|---|---|
| 1002 | E_MANDATE_EXPIRED | 重新 BOOTSTRAP;新 mandate_id 必不等於舊 mandate_id(與 P10 撤銷不可逆一致) |
| 1006 | E_REVOKED | 不可復原;只能由 HP 主動發起新一輪 BOOTSTRAP,新 mandate_id 必不等於舊 mandate_id |
| 1007 | E_ATTESTATION_INVALID | 同上;觸發該 Mandate 的強制 Revoke 後才允許新 BOOTSTRAP |
| 1011 | E_ROGUE_DETECTED | 同上;通常伴隨 HP 直接介入與 ego-deviation 稽核 |
| 1013 | E_ENDORSEMENT_INVALID | 同上;觸發該 Mandate Revoke 後必須由 HP 發起新一輪 BOOTSTRAP(含合法 endorsement 欄位) |
EH.2.3 不構成 Faying 狀態變化(無復原需求)
| Code | 名稱 | 處理 |
|---|---|---|
| 1001 | E_NO_MANDATE | 呼叫方需先取得 Mandate 後再發起呼叫;本協定層不存在「無 Mandate 臨時放行」路徑 |
| 1003 | E_SCOPE_VIOLATION | 呼叫方需調整 action 以落入 Mandate.scope.actions;累計可疑觸發降級 |
| 1009 | E_REPLAY | 呼叫方應使用新的 nonce 重新發起;若為攻擊行為已寫入安全告警與 HP 視野 |
| 1010 | E_HUMAN_WITNESS_REQUIRED | 等待 HP 見證後重新發起;不允許由 IF / MS / SA 替代見證 |
| 1014 | E_FAYING_REQUEST_NOT_CONFIRMED | iFay 可在合法速率內重新發起 FAYING_REQUEST,但不得借此實施確認洪流(詳見 §9.10.7、附錄 B ConfirmationRateLimit) |
| 1099 | E_PROTOCOL | 呼叫方需修正封包結構後重新發起 |
共同硬約束:復原路徑不得繞過 §EH.4 Default-Deny 收斂;任何「我不確定但先放過去」的樂觀復原路徑在協定層均不存在。
EH.3 錯誤回應的可觀測性約束
所有 ERROR 封包必須滿足下述四條強約束:
- 稽核 5 元組:除
E_NO_MANDATE(無 Mandate 上下文)外,全部錯誤碼必須以(error_code, mandate_id, ts, RP_id, reason)五元組寫入 Attestation Chain / audit-log;該 5 元組與 §3.2、§EH.1「入稽核」列保持一致。 - HP 視野通道必推:錯誤碼集合
{E_REVOKED (1006), E_ATTESTATION_INVALID (1007), E_REPLAY (1009), E_ROGUE_DETECTED (1011), E_ENDORSEMENT_INVALID (1013)}必須 push 至 HP 視野通道;DISCLOSURE 路徑觸發的E_PROTOCOL (1099)同樣必推。RP 不得靜默吞掉。 - 不洩漏敏感資訊:錯誤回應中禁止攜帶 MS 內部狀態、Mandate 私鑰指紋、其他 HP 標識、IF 內部狀態機變數等敏感資訊;
message與recovery_hint欄位必須為協定層公開語意,不得透出實作細節。 - 稽核鏈可獨立校驗:寫入 Attestation Chain 的錯誤事件必須攜帶 §3.3 I-AC-1 / I-AC-2 所要求的簽章節點,使第三方可在不持有 MS 私鑰的前提下完成自葉到根的鏈式校驗(詳見 §6.3)。
Trace:R3.2.1(錯誤碼五元組寫入 audit-log)、R3.2.2(錯誤回應不得攜帶敏感資訊)、R3.2.3(指定錯誤碼必入 HP 視野)、R3.1.4(稽核鏈可追溯欄位)。
EH.4 Default-Deny 的統一收斂
任何無法明確歸類的錯誤、任一不可解析欄位、RR 不可達期間的任意呼叫,協定層一律按
E_PROTOCOL或E_RR_UNAVAILABLE拒絕;不存在「我不確定但先放過去」的合法路徑,亦不存在「按更寬鬆狀態處理」的樂觀復原路徑(含真實在線但被感知為失聯的視窗 B,詳見 §9.9)。
收斂規則的四個等價表述:
- 狀態機層:未在 §4.3 Mandate 狀態機 / §8.1 Lifecycle 狀態機中顯式列出的遷移一律拒絕。
- 封包層:未在 §5.3 封包清單中顯式列出的
msg_type、或信封欄位缺失 / 型別錯誤,一律以E_PROTOCOL拒絕。 - 錯誤碼層:未在 §5.4 / §EH.1 中顯式列出的失敗原因一律歸類至
E_PROTOCOL拒絕。 - 決策層:協定層僅以 Perceived-Disconnected 作為決策依據;視窗 A(真實失聯但被感知為在線)/ 視窗 B(真實在線但被感知為失聯)的樂觀放行路徑在協定層不存在(詳見 §9.9 悲觀推定原則、P17.1 / P17.2)。
Trace:R2.1.1–R2.1.4(預設拒絕)、R12.1.1–R12.1.3(雙語意 Perceived-only 決策)、R12.2.1–R12.2.3(悲觀推定 / 感知失聯期間拒絕)。
