Error Center
OceanWay 错误发生、低敏指纹、影响聚合与处置边界
Error Center 将不同服务观察到的失败整理为可归因、可聚合、可审计的运维对象。它不是把全部日志复制进 PostgreSQL,也不能根据异常文本自动修改 Run、Gateway、Asset 或账务状态。
| 属性 | 结论 |
|---|---|
| 当前状态 | 目标契约已定义,尚未实现;不属于首个 Outbox/Run Explorer 纵切的退出门禁 |
| 数据 Owner | oceanway-core Operations 模块 |
| 产品 Owner | oceanway-admin Error Center UI 与 Workforce Query BFF |
| 输入 | 领域错误事实、Core 已接受的低敏 Operational Observation 与受控 Telemetry Reference |
| 输出 | Error Occurrence、Fingerprint Group、影响摘要及 Alert/Incident 关联 |
两层错误对象
Error Occurrence
一次错误发生或观察至少记录:
errorId
source / evidenceKind
layer / phase
normalizedCode / severity
certainty / retryDisposition / compensationDisposition
messageTemplateKey / sanitizedParameters / technicalDetailRef?
occurredAt? / sourceClaimedObservedAt? / acceptedAt? / derivedAt?
requestId? / traceId? / correlationId? / operationId?
runId? / runStepId? / executionAttemptId?
gatewayPool? / gatewayDeploymentId?
gatewayInvocationId? / gatewayTaskId?(严格互斥)
attemptRouteBindingRef? / attemptRouteBindingSchemaVersion?
attemptRouteBindingDigestAlgorithmVersion? / attemptRouteBindingDigest?
gatewayRouteSnapshotRef? / gatewayRouteSnapshotSchemaVersion?
gatewayRouteSnapshotDigestAlgorithmVersion? / gatewayRouteSnapshotDigest?
assetVersionId? / reservationId? / meterEventId?
causeErrorId?字段不存在必须保持缺失,尤其是未认证入口错误不能伪造 Organization、Actor 或 Operation。technicalDetailRef 只指向受权限和保留策略控制的证据,不把原始错误页、请求 Body 或 Provider Payload 复制进普通记录。
evidenceKind 使用严格判别联合。只有 operational_observation 的 Accepted Error Observation 分支必须额外携带 observationId / acceptedAt / source.service / source.workloadPrincipalId / source.environment / source.region? / source.instanceId? / source.deploymentId? / surface / errorNormalizationPolicyVersion / errorFingerprintVersion / errorFingerprint。这些 source.* 来自 Core 已验证并原样保存的 Accepted Envelope;不存在 deploymentRevision 同义字段。domain_fact | operations_runtime | telemetry_reference | derived_summary 分支禁止三个 Fingerprint/Policy 字段,且不进入 Error Fingerprint v1 Group。
Gateway 执行字段只能由同一条 Accepted Error Observation 中已通过 Core校验的 ErrorOccurrence@1.gatewayExecution展平,不能从同 Run的其他 Observation、Timeline邻项或日志补造。一旦发生 Binding或可能存在 Provider Side Effect,Run/Step/Attempt、Gateway Pool/Deployment、Binding/Route完整四元组与一个且仅一个 Invocation/Task Anchor必须完整;四元组半联合、未知算法、同 Ref/Schema异 Digest、不完整或错配的提交进入 Quarantine,不进入普通 Error Center。
messageTemplateKey 必须来自 Contracts 注册表,参数逐字段白名单、限长并按输出上下文编码;不能保存任意“已脱敏”自由文本。acceptedHealthWindows[] 会随查询时点和 Producer 状态变化,属于 Query/Projection Metadata 或 derived_summary,不写入不可变 Error Occurrence。
时间字段不能互相降级替代:domain_fact 与 operations_runtime 使用对应 Owner 写入的 occurredAt;operational_observation 必须携带 Core acceptedAt,可选 sourceClaimedObservedAt 只作为来源声明;telemetry_reference 与 derived_summary 的 derivedAt 只表示引用或摘要生成时间。Observation 不得补造 occurredAt,claimed time 不得进入分组排序、趋势桶、健康窗口、Retention 或 Freshness。完整条件矩阵见可观测性与错误链。
Error Fingerprint Group
Fingerprint 只对 operational_observation 的同一条 Accepted Error Observation 计算;Core Operations Projector 是唯一 Writer,Producer、Gateway 或日志提供的现成值一律不接受。其他四类 Error Occurrence 不计算也不加入 v1 Group。算法由 Contracts 冻结 errorNormalizationPolicyVersion + errorFingerprintVersion、固定输入、UTF-8 NFC、RFC 8785 Canonical JSON、SHA-256 编码和测试向量,详见事件与 Observation 契约。v1 输入严格只有规范错误码、Layer、Phase、受信 source.service、外层 Surface 与两个版本;不能从相邻 Gateway Diagnostic、Telemetry 或当前 Deployment 状态补字段。下列内容不能参与指纹:
- Request、Run、用户、组织等高基数 ID;
- Prompt、输出、邮箱、文件名或媒体内容;
- Provider 动态任务 ID、完整错误正文和签名 URL;
- Secret、Credential Digest、Authorization Header 或 JWT。
分组键必须包含 Fingerprint Version;旧新版本不能静默混组。分组代表“具有相同稳定特征”,不等于已经证明共同根因。backendModelId、Provider Model/Credential、Supply/Channel 和 Provider Attempt 详情不进入普通 Error Center;确需调查时通过 Case/JIT 授权的 technicalDetailRef 访问 Gateway 私有证据。
错误确定性
Error Center 必须保留提交确定性,不能把所有异常都变成“可重试”:
certainty | 含义 | 默认方向 |
|---|---|---|
rejected_before_dispatch | 在任何外部副作用前拒绝 | 修正输入或授权后可创建新请求 |
not_submitted | 已知未提交到下一执行边界 | 可按原 Operation 的幂等规则恢复 |
submitted | 已提交,结果尚未确认 | 查询原任务,不能盲目重发 |
provider_accepted | Provider 已确认接收 | 等待、查询或取回原结果 |
unknown | 无法证明是否产生外部副作用 | 进入 Reconciliation,不自动重试 |
retryDisposition 与 compensationDisposition 由领域规则给出,页面不能仅凭 HTTP Status 或日志关键词推导。
来源与 evidenceKind
- 领域事件可以证明业务聚合进入了某个错误状态;
- Accepted Observation 可以证明某个服务看到了某个失败且 Core 已持久化,但 Edge 到 Intake 仍是 best-effort,可能缺失;
- Logs 和 Trace 是可采样、可过期的诊断线索;
- Error Group 是可重建聚合,不是 Run 或账务事实源;
- Alert/Incident 是运维治理事实,不能反向篡改原错误。
每条记录必须使用 ADR-030 统一五值 evidenceKind:domain_fact | operational_observation | operations_runtime | telemetry_reference | derived_summary,并显示 Source、evidenceKind、Schema Version、新鲜度、完整性和 accepted health windows。Delivery、Attempt、Receipt、Checkpoint、Source Snapshot、Revision Gap 与 Quarantine 统一属于 operations_runtime;Checkpoint 只保存版本/快照状态,不含标量位置。错误分组与影响统计属于 derived_summary。Edge 首期没有 Coverage 的权威分母,因此页面不得显示“覆盖率 100%”或由接受数量推算覆盖百分比。日志缺失不等于错误没发生,Observation 存在也不等于 Run 已失败。
页面结构
列表按 Fingerprint 分开展示领域/运行事实的发生时间与 Observation 的 first_accepted_observation_at/latest_accepted_observation_at,并展示趋势、受影响 Surface/Pool/Deployment、Run/Organization 的脱敏数量、当前确定性分布、Alert/Incident 状态与 Owner。Observation 列表和趋势桶固定按 (acceptedAt, observationId) 排序/归桶;sourceClaimedObservedAt 只在详情 Timeline 中标为“来源声明时间”。Metrics 只使用低基数标签;高基数影响统计通过授权的定向查询计算。
详情页包含:
- 稳定错误分类和代表性脱敏摘要;
- 受影响范围、Projection Version/Freshness 与 Snapshot anti-join、Revision Gap、Quarantine 完整性;
- 与发布、配置、路由变化的时间相关性;
- 代表性 Operation/Run 与受控 Telemetry 引用;
- 已有关联 Runbook、Alert、Incident 和 Reconciliation Case;
- 需要人工判断的未知或矛盾事实。
页面只能陈述“时间相关”或“共享维度”,没有验证证据时不能自动宣称某次发布是根因。Gateway、Asset、Metering 与 Settlement 没有对应领域事实时必须显示“未接入/未知”,不能从 Error、Observation、Log 或 Trace 推断其状态。
权限与隐私
Support、SRE、Supply、Billing 与 Security 只能看到各自职责内的字段。跨租户影响摘要默认聚合;查看单个租户或技术证据需要由 Core 唯一签发的 Signed Workforce Grant。跨租户、技术证据和 Case-scoped 内容查询 Audit fail-closed:不可变 Audit 追加失败时不返回数据。客户内容访问必须使用 Case-scoped SensitiveDebugGrant,与当前基础 Query Grant、绑定 Workload、活跃 Case 和审批范围取交集,并对每次内容释放执行两阶段 Audit;它与普通 Error Center 查询分离。
Error Center 不展示或导出 Prompt、媒体原件、完整输出、Secret、Credential Digest、Provider Credential、支付材料、完整请求/响应 Header 或长期可访问 URL。
与当前阶段的关系
首个 Outbox/Run Explorer 纵切只需要让 Publisher、Projector、Query 自身的结构化失败和 Quarantine 可见,不要求先完成通用 Error Group、Alert 或 Incident 系统。进入本页面实施前应先完成:
- Operations Read Model 与版本化 Projection;
- Edge 的低敏 Observation Contract 与 accepted health window;Gateway Observation 在对应执行阶段单独接入;
- 统一
errorId在响应、日志与 Observation 间的传播; - Workforce 查询授权和 Audit;
- 低基数指标与受控 Telemetry Reference。
验收门禁
- 同一 Error Occurrence 不因重复摄取而重复计数。
- Contracts 固定测试向量、Key 重排、Unicode NFC、版本隔离与 Producer 派生字段拒绝全部通过;同一 Source 重建得到相同指纹,且不包含客户内容、高基数 ID 或 Secret。
-
unknown不触发自动重发或强制终态。 - 五值
evidenceKind的证据边界清晰,accepted health windows 不冒充端到端 Coverage。 - 反向时钟样本(claimed time 与
acceptedAt顺序相反)、未来 claimed time 和 Retention 边界样本均证明:Observation 排序、趋势桶、首次/最近时间、健康窗口、Retention 与 Freshness 只使用acceptedAt;相同接受时间以observationId稳定排序。 - Contracts/Projector 负向测试拒绝
operational_observation缺少acceptedAt、携带伪造occurredAt,以及其他不符合evidenceKind时间矩阵的记录;Operation Summary 不持久化 claimed time。 - 跨租户详情需要 Core Signed Workforce Grant,Audit fail-closed,且不泄露无权对象是否存在。
- 页面不能直接改 Run、Gateway、Asset、Reservation 或 Ledger。
- Error Center 故障不会阻断客户模型请求。