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(悲观推定 / 感知失联期间拒绝)。
