跳到主要内容

错误与状态模型

# 错误与状态模型

修订记录

版本日期修订说明
v0.12026-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目标缺失。
mismatchhash、URL 或状态不一致。
within-cache-window删除页仍在缓存窗口内,不算漂移。
unknown无法判断。

3. ErrorObject

所有模块返回错误时必须使用 ErrorObject 或包含兼容字段。

字段类型必填说明
codestring机器可读错误码。
messagestring人类可读说明。
severityenuminfowarningerrorfatal
retryableboolean是否可在相同输入下重试。
modulestring产生错误的模块。
operationstring失败操作。
detailsobject结构化上下文。
causestring上游错误摘要,不包含敏感信息。
remediationstring建议处理方式。

规则:

  • 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路径规范化和越界。
workspacepublish/**、state、manifest 读写。
sync三方 diff、source lock、source changes。
reviewPR、checks、workflow summary。
display展示构建、site manifest、URL。
indexRAGFlow/Meilisearch 索引流程。
answerAnswer API、RAG 问答标准化。
accessAgent Access、scope、policy、tool 授权。
agentAgentBridge、iteration task、RAGFlow 改写结果。
adapter外部产品 adapter。
runtime环境、依赖、超时、未知运行时错误。

5. 通用错误码

错误码retryableseverity说明
runtime.unknownfalseerror未分类错误。
runtime.timeouttrueerror操作超时。
runtime.dependency_unavailabletrueerror外部依赖不可用。
runtime.rate_limitedtruewarning触发限流。
runtime.cancelledfalsewarning操作被取消。
runtime.invalid_statefalseerror状态与预期不符。
path.invalidfalseerror路径格式非法。
path.out_of_scopefalseerror路径越权。
path.collisionfalsefatal路径冲突,例如 publishPath 重复或父子嵌套。
schema.invalidfalseerrorschema 校验失败。
schema.unsupported_versionfalseerrorschemaVersion 不支持。
hash.mismatchfalseerrorhash 不匹配。
idempotency.conflictfalseerror同一 idempotencyKey 对应不同 payload。

6. 模块错误码

6.1 ConfigManager

错误码retryableseverity处理
config.file_missingfalseerror阻断依赖该配置的流程。
config.invalid_yamlfalseerror阻断流程,要求修复配置 PR。
config.invalid_schemafalseerror阻断流程。
config.duplicate_source_idfalsefatal阻断流程。
config.duplicate_publish_pathfalsefatal阻断流程。
config.publish_path_nestedfalsefatal阻断流程。
config.impact_requires_reviewfalsewarning允许生成报告,但不自动同步。

6.2 WorkspaceStore

错误码retryableseverity处理
workspace.read_failedtrueerror可重试;持续失败则阻断。
workspace.write_failedtrueerror可重试;不得 fallback 到非受控路径。
workspace.path_out_of_scopefalsefatal阻断写入。
workspace.hash_failedfalseerror阻断依赖 hash 的流程。
workspace.manifest_invalidfalseerror报告并尝试重建;不能静默使用。
workspace.state_not_foundfalsewarning可按首次运行处理,需记录。

6.3 SyncEngine

错误码retryableseverity处理
sync.source_unavailabletrueerror可重试;失败时不更新 source lock。
sync.source_ref_not_foundfalseerror阻断该 source。
sync.conflict_detectedfalsewarning不写冲突文件,生成报告。
sync.delete_conflictfalsewarning不删除文件,生成报告。
sync.lock_update_failedtrueerror不应标记同步成功。
sync.partial_source_failedtruepartial/error允许其他 source 继续,但 PR 必须标记 partial。

6.4 ReviewBridge

错误码retryableseverity处理
review.branch_create_failedtrueerror不写 main,保留本地/report。
review.pr_create_failedtrueerror保留分支和 report,提示人工处理。
review.pr_update_failedtrueerror保留 report。
review.check_update_failedtruewarning不影响 Git 内容,但 PR 状态需人工确认。
review.permission_deniedfalsefatal阻断。

6.5 DisplayBackend Adapter

错误码retryableseverity处理
display.build_failedfalseerror不生成成功态 site manifest。
display.url_collisionfalsefatal阻断发布。
display.page_missingfalseerror生成漂移报告。
display.render_hash_mismatchfalseerror生成漂移报告。
display.backend_unavailabletrueerror可重试。

6.6 Index Adapter

错误码retryableseverity处理
index.target_unavailabletrueerror标记该 target failed,不回滚 Git。
index.upsert_failedtrueerror记录失败文档,目标可能 partial。
index.delete_failedtrueerror记录失败删除,目标 failed 或 partial。
index.document_invalidfalseerror跳过该文档并标记 partial。
index.outdatedfalsewarning漂移检测报告。

6.7 Answer API

错误码retryableseverity处理
answer.invalid_requestfalseerror返回 400。
answer.forbidden_scopefalseerror返回 403。
answer.dataset_not_allowedfalseerror返回 403。
answer.ragflow_unavailabletrueerror返回错误,不生成虚假答案。
answer.no_answerfalseinfo返回 noAnswerReason 和 action。
answer.citation_missingfalsewarning/errorrequireCitations 时不能返回确定答案。
answer.session_forbiddenfalseerror返回 403。
answer.session_expiredfalsewarning要求创建新 session。

6.8 Agent Access API

错误码retryableseverity处理
access.unauthorizedfalseerror返回 401。
access.forbidden_toolfalseerror返回 403。
access.forbidden_scopefalseerror返回 403。
access.dataset_not_allowedfalseerror返回 403。
access.idempotency_conflictfalseerror拒绝请求。
access.feedback_dedupedfalseinfo返回已有 Issue 或反馈记录。
access.tool_faileddependserror包装底层错误。

6.9 AgentBridge

错误码retryableseverity处理
agent.task_invalidfalseerror不调用 RAGFlow。
agent.ragflow_output_invalidfalseerror不写文件。
agent.path_out_of_scopefalsefatal拒绝 change。
agent.missing_evidencefalseerrorrequireCitations 时拒绝 change。
agent.concurrent_changefalsewarning不写文件,生成报告。
agent.patch_apply_failedfalseerror不 fallback 整文件覆盖。
agent.pr_create_failedtrueerror保留分支和 report。

6.10 Adapter

错误码retryableseverity处理
adapter.github_unavailabletrueerror可重试。
adapter.github_permission_deniedfalsefatal阻断对应操作。
adapter.ragflow_unavailabletrueerror问答或索引失败。
adapter.ragflow_invalid_responsefalseerror不消费该响应。
adapter.search_unavailabletrueerror搜索失败。
adapter.search_invalid_responsefalseerror不消费该响应。
adapter.docusaurus_build_failedfalseerror发布失败。

7. HTTP 状态映射

错误类型HTTP 状态
invalid request / schema400
unauthorized401
forbidden tool/scope/dataset403
not found404
idempotency conflict409
rate limited429
dependency unavailable503
timeout504
unexpected server error500

规则:

  • HTTP 状态只表达传输/API 层结果,业务错误仍必须放入 ErrorObject
  • answer.no_answer 通常返回 HTTP 200,因为它是有效业务结果,不是系统错误。
  • partial result 可以返回 HTTP 200 或 207;MVP 推荐 HTTP 200 + status=partial,减少客户端兼容复杂度。

8. Retry 策略

错误类别是否重试规则
网络超时指数退避,最大重试次数由模块配置。
外部服务 5xx指数退避,记录 attempt。
rate limit尊重 Retry-After,否则指数退避。
schema invalid输入问题,重试无意义。
permission denied需要改权限或 token。
path out of scope安全错误,不能重试绕过。
hash mismatch / concurrent change需要重新生成任务或人工处理。
conflict detected需要人工或后续任务处理。
no answer应生成反馈或改进任务。

重试约束:

  • 可重试写入必须有 idempotencyKey 或稳定幂等键。
  • 重试不能改变 request scope。
  • 重试不能绕过权限校验。
  • workflow 重试必须记录 attempt。

9. 降级策略

场景降级方式禁止事项
RAGFlow 不可用Answer API 返回依赖不可用;可提供反馈入口不编造答案。
Meilisearch 不可用Agent Access search 返回错误;可提示使用 ask不用过期搜索结果伪装成功。
Index 失败Git 内容保持已审批;index manifest 标记 failed不回滚 Git 内容。
Docusaurus build 失败不发布站点;PR/check 标记失败不生成成功态 site manifest。
Sync source 不可用不更新 source lock;报告失败不使用旧来源冒充本次同步成功。
AgentBridge PR 创建失败保留分支/report,提示人工处理不直接写 main。

10. 状态传播规则

上游状态下游处理
sync.conflict_detectedSync PR 必须标记冲突;不能自动发布。
display.build_failedPublishManifest/SiteManifest 不得标记成功。
index.target_unavailableIndexManifest 标记 target failed;Answer API 使用上一版可用索引或返回不可用。
answer.no_answer返回 noAnswerReason 和 create_feedback/create_improvement_task action。
agent.concurrent_changeAgentBridgeReport 标记 rejected change,Release PR 不应包含该写入。

11. 审计要求

以下事件必须产生 audit event 或 workflow log:

  • 配置校验失败。
  • SyncEngine 检测到 conflict / delete_conflict。
  • ReviewBridge 创建或更新 PR 失败。
  • Display build 失败或漂移检测失败。
  • Index target failed / partial。
  • Answer API 返回 no answer、forbidden 或 dependency unavailable。
  • Agent Access 拒绝 tool/scope/dataset。
  • AgentBridge 拒绝 change、检测并发变更或 PR 创建失败。

Audit event 最少包含:

  • auditId
  • requestIdrunId
  • caller
  • scope
  • action
  • result
  • timestamp
  • error.code,如失败

12. 模块接入要求

每个模块设计必须说明:

  • 可能返回哪些错误码。
  • 哪些错误可重试。
  • 哪些错误会阻断写入。
  • 哪些错误只影响外部消费,不影响 Git 内容事实。
  • 错误如何进入 report、manifest、PR body 或 audit log。

未定义错误模型的模块不应进入实现。

13. 验收用例

用例预期
Agent 越权访问路径返回 access.forbidden_scope,retryable=false,审计记录 denied。
RAGFlow 不可用返回 answer.ragflow_unavailableadapter.ragflow_unavailable,不生成答案。
知识库无答案返回 answer.no_answer,HTTP 200,带反馈 action。
Sync 检测冲突返回/记录 sync.conflict_detected,不覆盖 publish 文件。
AgentBridge baseHash 不匹配返回 agent.concurrent_change,不写文件。
Docusaurus build 失败返回 display.build_failed,不生成成功态 site manifest。
Meilisearch upsert 部分失败IndexManifest target status=partialfailed,Git 内容不回滚。
同一 idempotencyKey 不同 payload返回 access.idempotency_conflict

14. 后续文档衔接

06-fixtures-and-tests.md 必须为本文定义的错误和状态提供测试夹具:

  • invalid schema fixture。
  • forbidden scope fixture。
  • sync conflict fixture。
  • dependency unavailable fixture。
  • idempotency conflict fixture。
  • no answer fixture。
  • partial index fixture。
  • concurrent change fixture。
对此页面有疑问?

问答功能将在后续接入 Answer API。当前可通过页面底部的反馈链接提交问题。

页面来源草稿
来源项目kunora-wiki
分支docs-publish
路径technology/components/kunora-wiki/development/common/04-error-and-status-model.md