feat: complete governed knowledge lifecycle

This commit is contained in:
key
2026-08-03 14:34:54 +08:00
parent a275f98fad
commit df77998e0c
41 changed files with 4921 additions and 225 deletions
+35
View File
@@ -299,8 +299,43 @@ POST /api/knowledge/quality/assets/{assetId}/publish
POST /api/knowledge/quality/assets/{assetId}/withdraw
GET /api/knowledge/quality/legacy/preview?afterAttachmentId=0&limit=50
POST /api/knowledge/quality/legacy/stage?afterAttachmentId=0&limit=50
GET /api/knowledge/quality/assets/{assetId}/versions
GET /api/knowledge/quality/assets/{assetId}/versions/{versionId}
GET /api/knowledge/quality/assets/{assetId}/versions/diff?fromVersionId=1&toVersionId=2
GET /api/knowledge/quality/assets/{assetId}/review-package
POST /api/knowledge/quality/assets/review-batches
POST /api/knowledge/quality/assets/{assetId}/rollback
GET /api/knowledge/quality/assets/{assetId}/impact
POST /api/knowledge/quality/assets/{assetId}/purge-requests
GET /api/knowledge/quality/purge-requests
POST /api/knowledge/quality/purge-requests/{requestId}/decision
POST /api/knowledge/quality/purge-requests/{requestId}/execute
POST /api/knowledge/quality/reconciliation-runs
POST /api/knowledge/quality/migration-runs
GET /api/knowledge/quality/migration-runs
POST /api/knowledge/quality/migration-runs/{runId}/next
GET /api/knowledge/quality/migration-runs/{runId}/dead-letters
POST /api/knowledge/quality/migration-dead-letters/{deadLetterId}/retry
GET /api/knowledge/quality/rollout/scopes
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/transition
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/generation-builds
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/generation-builds/refresh
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/shadow-comparisons
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/activation-gates
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/activate
POST /api/knowledge/quality/rollout/spaces/{knowledgeId}/generation-rollback
```
资料资产使用独立的 `published_version_id` 与 `candidate_version_id`。上传和重处理只推进候选指针,不能覆盖正在服务的生效版;发布在同一事务内切换生效指针、生产数据集成员和索引 outbox,旧版本转为 `SUPERSEDED` 并保留不可变片段。版本差异按正文 hash 与 chunk 序号生成可复算证据,回滚必须由登录审核人填写原因,且目标必须是曾经发布、仍有生产成员证据和不可变片段的历史版本。
审核包只提供风险、重复、冲突、质量问题和建议动作,不代替人工决定。低风险批量发布必须由人工显式发起、携带幂等 `batchKey`,逐项重新校验候选版本;`MEDIUM/HIGH/CRITICAL` 不进入批量发布。并发审核通过 `expectedVersionId` 拒绝已经换过候选版的陈旧操作。
撤回是可恢复的在线下线:立即停用生产成员并排队删除当前 generation 的向量,但保留版本和片段供审计/回滚。物理清理只能针对已撤回资产,先生成影响快照,再进入 `PENDING -> APPROVED -> EXECUTING -> EXECUTED/FAILED`;申请人与批准/执行人必须不同,`legal_hold`、`PERMANENT` 或未到 `execute_after` 一律拒绝。保留期为 `TEMPORARY=7`、`STANDARD=90`、`REGULATED=365` 天。独占 OSS、MySQL 版本/片段/证据和对应向量按审计请求清理,`aihr_deletion_request` 永久保留为墓碑;`reconciliation-runs` 用于发现 MySQL、OSS 元数据、向量计数和 chunk 向量血缘漂移。
历史补链使用迁移清单而不是无状态循环调用。每个 `migration-run` 冻结租户、可选知识空间、风险范围、dry-run、批大小和 manifest hash;`next` 只推进已持久化游标并记录批次证据。`LOW_RISK` 只扫描租户可验证 OSS 原件,`QUARANTINE_FIRST` 只扫描缺失原件且需要隔离的资料,`ALL` 扫描全部候选。失败附件进入显式 dead letter,最多按退避策略重试,不能因为单项失败回滚或隐藏仍由 LEGACY 服务的线上资料。正式任务必须提交 `verifiedDryRunId`,服务端只接受已完成且知识空间、风险范围、批大小完全一致的演练;管理端创建正式任务后仍需人工逐批推进,不会自动修改资料。
空间发布固定为 `LEGACY -> SHADOW -> ENFORCED`。SHADOW 仍服务旧链路,候选 generation 在独立 collection/generation 中全量构建;管理端可记录真实问题的双链路对照。启用门禁要求候选 generation 为 `READY`、至少 20 个样本、Top1 一致率不低于 90%、Top5 平均重合率不低于 80%、治理结果空集率不高于 1%,且无覆盖缺口、开放关键问题或索引死信。旧 transition 接口不能直接进入 ENFORCED;只有人工使用最新 `PASSED` gate 调用 `activate` 才能切换。原 generation 保留 7 天回退窗口,回退后恢复 SHADOW。
`publish` 必须带人工审核意见、用途、来源权威级别和来源版本。请求中的 `acceptedReasonCodes` 只能确认当前版本仍开放的软提示,服务端会再次统计开放问题,遗漏任何一项都拒绝发布;`HARD` 问题不能在发布动作中接受,必须修订原资料并生成新版本,或通过后续独立的显式纠错流程解决。规范性知识仅接受 `FORMAL_POLICY / COMPANY_POLICY / REGULATION / APPROVED_SOP` 且版本非空;同名已发布资料内容变化会产生 `VERSION_CONFLICT`,规范性知识必须再传 `supersedesAssetId`,服务端验证同租户、同来源名和旧资产仍已发布后,在同一事务内撤回旧版本并发布新版本。
规范化采用版本化的 NFKC、换行、控制字符和空白处理;解析正文和规范化正文作为不可变审计证据保留,不作为下游生产内容。`privacy-redaction-v1` 从规范化正文生成独立的 `redacted_content/redacted_source_name`,记录派生 hash、分类计数、隐私状态和规则版本,并对派生正文及全部派生 chunk 复扫。只有 `CLEAN/REDACTED` 派生版本参与结构化切片、异步语义分析、模型调用、发布和检索;重复文件复用的历史摘要、模型新生成的摘要/标签/归类理由以及上传 snippet 也必须在返回或保存前走同一脱敏规则,不能因 OSS 对象复用而绕过。残留敏感模式写入 `BLOCKED / PII_DETECTED` 并拒绝发布,已完成替换写入 `PII_REDACTED` 证据。`GET /assets/{assetId}/privacy-preview` 只返回脱敏文件名、分类计数和截断后的脱敏正文,不返回原始正文。