错误与状态模型
# 错误与状态模型
修订记录
| 版本 | 日期 | 修订说明 |
|---|---|---|
| v0.1 | 2026-05-01 | 建立当前设计基线;延续 kunora-wiki 作为 llm-wiki 方案的既有产品封板和工程设计,不推倒重来。 |
1. 文档目标
本文定义 kunora-wiki 自研模块共享 的错误对象、状态枚举、错误码、重试语义、降级策略和审计要求。
目标是让 CLI、workflow、API、adapter 和 AgentBridge 对失败有一致表达:什么失败可重试,什么失败必须人工处理,什么失败不能继续写入,什么失败只影响外部消费但不影响 Git 内容事实。
2. 通用状态枚举
2.1 OperationStatus
用于单次操作或工具调用。
| 状态 | 语义 |
|---|---|
passed | 操作完整成功。 |
failed | 操作失败,未完成目标。 |
partial | 部分成功,必须查看 errors 或 report。 |
skipped | 按规则跳过,不是错误。 |
denied | 权限或 policy 拒绝。 |
pending | 已创建但尚未执行。 |
running | 正在执行。 |
unknown | 状态无法判断。 |
2.2 PageStatus
用于页面和 manifest。
| 状态 | 语义 |
|---|---|
approved | 已审批,可正式展示或消费。 |
needs-review | 需要人工审查。 |
stale | 可能过期。 |
conflict | 存在同步或内容冲突。 |
feedback-open | 存在未处理反馈。 |
unknown | 状态无法判断,不得默认为 approved。 |
2.3 IndexTargetStatus
用于索引目标。
| 状态 | 语义 |
|---|---|
passed | 目标索引完成。 |
failed | 目标索引失败。 |
partial | 部分文档成功,部分失败。 |
skipped | 目标被配置禁用或无变更。 |
2.4 DriftStatus
用于发布、站点和索引对账。
| 状态 | 语义 |
|---|---|
in-sync | 状态一致。 |
outdated | 目标落后于 Git 或 publish manifest。 |
missing | 目标缺失。 |
mismatch | hash、URL 或状态不一致。 |
within-cache-window | 删除页仍在缓存窗口内,不算漂移。 |
unknown | 无法判断。 |
3. ErrorObject
所有模块返回 错误时必须使用 ErrorObject 或包含兼容字段。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | 是 | 机器可读错误码。 |
message | string | 是 | 人类可读说明。 |
severity | enum | 是 | info、warning、error、fatal。 |
retryable | boolean | 是 | 是否可在相同输入下重试。 |
module | string | 是 | 产生错误的模块。 |
operation | string | 否 | 失败操作。 |
details | object | 否 | 结构化上下文。 |
cause | string | 否 | 上游错误摘要,不包含敏感信息。 |
remediation | string | 否 | 建议处理方式。 |
规则:
message可以面向人,但不能作为程序判断依据。code必须稳定,作为程序判断依据。details不得包含 token、secret、完整认证头。- 外部产品原始错误必须转换为标准错误码。
fatal表示当前 run 不应继续执行写入副作用。
4. 错误码命名规则
格式:
<domain>.<reason>
示例:
config.invalid_schema
sync.conflict_detected
access.forbidden_scope
adapter.ragflow_unavailable
Domain 枚举:
| Domain | 适用范围 |
|---|---|
config | 配置加载、schema、配置影响。 |
path | 路径规范化和越界。 |
workspace | publish/**、state、manifest 读写。 |
sync | 三方 diff、source lock、source changes。 |
review | PR、checks、workflow summary。 |
display | 展示构建、site manifest、URL。 |
index | RAGFlow/Meilisearch 索引流程。 |
answer | Answer API、RAG 问答标准化。 |
access | Agent Access、scope、policy、tool 授权。 |
agent | AgentBridge、iteration task、RAGFlow 改写结果。 |
adapter | 外部产品 adapter。 |
runtime | 环境、依赖、超时、未知运行时错误。 |
5. 通用错误码
| 错误码 | retryable | severity | 说明 |
|---|---|---|---|
runtime.unknown | false | error | 未分类错误。 |
runtime.timeout | true | error | 操作超时。 |
runtime.dependency_unavailable | true | error | 外部依赖不可用。 |
runtime.rate_limited | true | warning | 触发限流。 |
runtime.cancelled | false | warning | 操作被取消。 |
runtime.invalid_state | false | error | 状态与预期不符。 |
path.invalid | false | error | 路径格式非法。 |
path.out_of_scope | false | error | 路径越权。 |
path.collision | false | fatal | 路径冲突,例如 publishPath 重复或父子嵌套。 |
schema.invalid | false | error | schema 校验失败。 |
schema.unsupported_version | false | error | schemaVersion 不支持。 |
hash.mismatch | false | error | hash 不匹配。 |
idempotency.conflict | false | error | 同一 idempotencyKey 对应不同 payload。 |
6. 模块错误码
6.1 ConfigManager
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
config.file_missing | false | error | 阻断依赖该配置的流程。 |
config.invalid_yaml | false | error | 阻断流程,要求修复配置 PR。 |
config.invalid_schema | false | error | 阻断流程。 |
config.duplicate_source_id | false | fatal | 阻断流程。 |
config.duplicate_publish_path | false | fatal | 阻断流程。 |
config.publish_path_nested | false | fatal | 阻断流程。 |
config.impact_requires_review | false | warning | 允许生成报告,但不自动同步。 |
6.2 WorkspaceStore
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
workspace.read_failed | true | error | 可重试;持续失败则阻断。 |
workspace.write_failed | true | error | 可重试;不得 fallback 到非受控路径。 |
workspace.path_out_of_scope | false | fatal | 阻断写入。 |
workspace.hash_failed | false | error | 阻断依赖 hash 的流程。 |
workspace.manifest_invalid | false | error | 报告并尝试重建;不能静默使用。 |
workspace.state_not_found | false | warning | 可按首次运行处理,需记录。 |
6.3 SyncEngine
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
sync.source_unavailable | true | error | 可重试;失败时不更新 source lock。 |
sync.source_ref_not_found | false | error | 阻断该 source。 |
sync.conflict_detected | false | warning | 不写冲突文件,生成报告。 |
sync.delete_conflict | false | warning | 不删除文件,生成报告。 |
sync.lock_update_failed | true | error | 不应标记同步成功。 |
sync.partial_source_failed | true | partial/error | 允许其他 source 继续,但 PR 必须标记 partial。 |
6.4 ReviewBridge
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
review.branch_create_failed | true | error | 不写 main,保留本地/report。 |
review.pr_create_failed | true | error | 保留分支和 report,提示人工处理。 |
review.pr_update_failed | true | error | 保留 report。 |
review.check_update_failed | true | warning | 不影响 Git 内容,但 PR 状态需人工确认。 |
review.permission_denied | false | fatal | 阻断。 |
6.5 DisplayBackend Adapter
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
display.build_failed | false | error | 不生成成功态 site manifest。 |
display.url_collision | false | fatal | 阻断发布。 |
display.page_missing | false | error | 生成漂移报告。 |
display.render_hash_mismatch | false | error | 生成漂移报告。 |
display.backend_unavailable | true | error | 可重试。 |
6.6 Index Adapter
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
index.target_unavailable | true | error | 标记该 target failed,不回滚 Git。 |
index.upsert_failed | true | error | 记录失败文档,目标可能 partial。 |
index.delete_failed | true | error | 记录失败删除,目标 failed 或 partial。 |
index.document_invalid | false | error | 跳过该文档并标记 partial。 |
index.outdated | false | warning | 漂移检测报告。 |
6.7 Answer API
| 错误码 | retryable | severity | 处理 |
|---|---|---|---|
answer.invalid_request | false | error | 返回 400。 |
answer.forbidden_scope | false | error |