Files
knowledge-governance/docs/STATE_MACHINE.md
T
zheromiku dcdc8d1ddd feat: 知识治理平台(含已验证发布/回滚契约)
全栈知识治理平台首次入库(P1-P10 + 发布链路模拟验证闭环):

- 治理核心:源目录/变更集/人工审核/发布批次/发布执行(fail-closed 闸口)
- 测试通道:WeKnora 测试 KB 上传/轮询/验收;poll 完成时写入
  parser_generation/index_generation,修复 manual/seed 路径发布闸口永久拦截
- 发布适配器 v071(本地 source=测试角色 / 云端 target=生产角色 模拟验证通过):
  * ES 导出/导入 mapping 自适应(.keyword 子字段、可选 tenant_id)
  * OSS locator 支持嵌套 scheme;chunks.seq_id 由目标序列分配
  * bundle 归档同身份重试原子替换;verifier 按 bundle chunk_type 计数
  * 回滚 job payload 支持 prior_execution_id(strict 解码)
- 三通道发布+回滚演练实测:publish 4/4 verified,检索命中,
  rollback 4/4 rolled_back,目标端 PG is_enabled=false、ES is_enabled=false
- 前端 A·Data-console 风格全站统一,120 用例通过
- 门禁:go vet / go test 全包通过,gofmt 干净
2026-09-30 10:54:06 +08:00

290 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 知识治理平台状态机与术语契约
## 目的
本文件冻结治理平台的状态维度、存储枚举、API枚举、页面中文和终态含义。一个对象不得用单一`status`混合来源变化、人工审核、上传、解析、检索和发布状态。
原则:
```text
数据库/API使用稳定英文枚举。
页面使用中文业务文案。
completed是当前统一的“成功完成”内部终态;页面可显示“成功”或“已完成”。
unknown、空字符串、未配置不能伪装成healthy或completed。
未来状态先写在“保留值”,未对应迁移和实现前不得持久化。
```
## State dimensions
| 维度 | 负责回答的问题 | 当前主要对象 |
| --- | --- | --- |
| Scope policy | 资料希望进入哪里? | 目录规则、文件覆盖规则 |
| Source change | 来源事实发生了什么? | SourceItem、CatalogChangeItem |
| Review | 人工是否批准? | PublicationReview |
| Content | 原始内容是否取得和验证? | ContentObject、SourceItemVersion |
| Job | 后台执行器是否仍在处理? | jobs |
| Ingest | 是否已提交到测试目标? | TestPublication |
| Processing | WeKnora解析/索引是否完成? | TestPublication |
| Retrieval | 是否允许被检索? | TestPublication/目标系统 |
| Acceptance | 测试结果是否通过? | AcceptanceResult |
| Release | 生产发布批次/执行进行到哪里? | ReleaseBatch、ReleaseExecution |
| Settings | 设置版本能否使用? | UISettingsRevision |
### Job
Current storage/API values:
```text
pending | running | retry | completed | failed | cancelled
```
| 值 | 页面中文 | 含义 | 是否终态 |
| --- | --- | --- | --- |
| `pending` | 等待执行 | 已创建,等待Worker领取 | 否 |
| `running` | 执行中 | 已被Worker持有有效租约 | 否 |
| `retry` | 等待重试 | 上次失败但仍可按退避重新执行 | 否 |
| `completed` | 已完成 | 本地Job处理器完成;不自动等于目标系统最终成功 | 是 |
| `failed` | 执行失败 | 达到最大尝试次数或遇到不可重试错误 | 是 |
| `cancelled` | 已取消 | 被明确取消,不得再被Worker领取 | 是 |
规则:
```text
Worker只领取pending、retry或过期running任务。
cancelled任务不可以被重新领取。
completed仅代表该Job完成;test.upload完成后仍必须由test.poll确认Processing终态。
```
### Scope policy
Current user-facing desired-policy vocabulary:
```text
unset | internal | external | blocked
```
| 值 | 页面中文 | 当前持久化解释 |
| --- | --- | --- |
| `unset` | 未设置 | 没有显式目录/文件覆盖规则;当前有效范围由来源默认或历史数据决定。它不是可写的`Visibility`数据库值。 |
| `internal` | 对内 | 期望进入对内测试知识库。 |
| `external` | 对外 | 期望进入对外测试知识库,后续仍需人工审核。 |
| `blocked` | 禁止导入 | 期望不再导入;不得因此自动删除生产知识。 |
historical compatibility value: both
`both`是历史兼容持久化值,页面只读显示“对内 + 对外”。目录页顶部不提供新增`both`操作。`mixed`和`unknown`是目录汇总显示值,不是文件期望策略。
### Source change
| 存储/API值 | 页面中文 | 含义 |
| --- | --- | --- |
| `unchanged` | 无变化 | 与基线相比无来源差异。 |
| `added` | 新增 | 来源新发现。 |
| `updated` | 已更新 | 现有来源身份出现新修订或新内容证据。 |
| `deleted` | 已删除 | 仅限权威来源明确删除。 |
| `unavailable` | 来源不可用 | 权限、接口或扫描失败;绝不是删除信号。 |
Catalog ChangeSet使用不同的动作值:`add`、`update`、`move_scope`、`delete`、`no_change`。它是比较计划动作,不直接等同于`SourceItem.source_change`。
### Review
```text
pending | approved | rejected | not_required
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `pending` | 待审核 | 必须等待文档工程师判断。 |
| `approved` | 已批准 | 可以进入后续封批条件判断,不代表生产已发布。 |
| `rejected` | 已驳回 | 不得自动重新入批。 |
| `not_required` | 无需审核 | 仅适用于明确规则允许的情形。 |
### Content
```text
unknown | downloading | verified | invalid | over_limit | failed
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `unknown` | 内容待获取 | 尚未取得可验证字节。 |
| `downloading` | 正在获取 | 正在受控下载/导出。 |
| `verified` | 内容已校验 | 大小、格式、内容SHA-256已验证。 |
| `invalid` | 内容无效 | 格式或文件魔数不符。 |
| `over_limit` | 超出限制 | 内容存在但超出当前导入策略。 |
| `failed` | 获取失败 | 内容获取或验证失败。 |
### Ingest
```text
pending | uploading | uploaded | failed
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `pending` | 等待上传 | 尚未提交目标。 |
| `uploading` | 上传中 | 已开始向测试目标提交。 |
| `uploaded` | 已上传 | 目标已接收对象;不代表解析完成。 |
| `failed` | 上传失败 | 上传步骤失败。 |
### Processing
```text
pending | processing | finalizing | completed | failed | stalled
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `pending` | 等待解析 | 目标尚未开始处理。 |
| `processing` | 解析中 | 正在解析、切片或向量化。 |
| `finalizing` | 索引与增强中 | 基础解析可能完成,索引/Wiki/图谱仍未完成。 |
| `completed` | 解析完成 | 远端最终处理完成;仍需独立Acceptance。 |
| `failed` | 解析失败 | 远端报告失败。 |
| `stalled` | 处理停滞 | 超过配置阈值未见进展。 |
### Retrieval
```text
unpublished | enabled | disabling | disabled | enabling | failed
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `unpublished` | 未发布 | 尚未允许检索。 |
| `enabled` | 已启用检索 | 已读回确认允许检索。 |
| `disabling` | 正在停用检索 | 请求已发出,尚未确认。 |
| `disabled` | 已停止检索 | 已读回确认停止检索,可恢复。 |
| `enabling` | 正在恢复检索 | 请求已发出,尚未确认。 |
| `failed` | 检索状态异常 | 停用/恢复失败或读回失败。 |
### Acceptance
```text
pending | passed | failed | manual_required
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `pending` | 等待验收 | 尚未检查。 |
| `passed` | 验收通过 | 指定检查通过。 |
| `failed` | 验收失败 | 指定检查失败。 |
| `manual_required` | 需人工确认 | 自动检查不足以得出结论。 |
### Release
当前批次状态:
```text
draft | sealed | cancelled
```
当前执行状态:
```text
pending | running | completed | failed
```
当前执行条目状态:
```text
pending | staged | activated | verified | failed | rolled_back
```
规则:
```text
sealed只表示发布清单冻结,不表示已发布。
ReleaseExecution.completed必须建立在逐项验证成功之上。
ReleaseExecution.failed不自动表示整体生产已恢复;需按R4回滚策略判断。
```
### Settings
```text
validated | active | retired | failed
```
| 值 | 页面中文 | 含义 |
| --- | --- | --- |
| `validated` | 已验证待启用 | 配置校验通过,尚未成为运行版本。 |
| `active` | 当前活动版本 | 运行时读取的唯一设置版本。 |
| `retired` | 已退役 | 被后续活动版本替代,保留审计。 |
| `failed` | 验证失败 | 配置未通过,不得启用。 |
## Transition rules
### Job transitions
```text
pending → running
running → completed | retry | failed | cancelled
retry → running | cancelled
pending → cancelled
```
`completed`、`failed`、`cancelled`均为终态。后续“重试”必须创建或重置受控Attempt,不能把已完成任务静默改回pending。
### Scope policy transitions
```text
unset → internal | external | blocked
internal | external | blocked → internal | external | blocked
both只能保留和读取,不由当前目录页新增。
```
Scope改变只更新期望状态;S7完成前不得把它视为立即上传或删除命令。
### Processing transitions
```text
pending → processing → finalizing → completed
pending | processing | finalizing → failed | stalled
stalled → processing(仅由确认重试后的远端进展恢复)
```
### Release transitions
当前实现只允许:
```text
pending → running → completed | failed
```
## Reserved future values
以下值已在产品术语中保留,但当前数据库、API和UI不得写入:
```text
rolling_back
rolled_back
rollback_failed
snapshotting
verifying
applying
```
`rolling_back` must not be persisted before R4。
R1、R2、R4完成后,Release状态机会扩展这些值,并新增Production Snapshot与Release ChangeSet关联。
## C2验收边界
C2完成:
```text
分维度状态术语冻结
completed与页面“成功”含义统一
Job cancelled枚举、数据库约束和终态语义补齐
历史both策略的兼容边界明确
未来发布状态不提前持久化
```
C2不完成:
```text
取消Job的用户界面/API(后续按业务需求另立工作包)
SourceFile内容Hash、ChangeSet确认、生产快照和三级回滚
Scope策略的实际执行链(S7/P3)
Release rolling_back实际状态(R4)
```