feat: complete governed knowledge lifecycle
This commit is contained in:
@@ -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` 只返回脱敏文件名、分类计数和截断后的脱敏正文,不返回原始正文。
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
>
|
||||
> 2026-07-30 增量新增并发布五通道处理人配置:只有 `superadmin` 可查看当前租户处理人、检索合格候选并增删角色绑定;服务端排除 APP 用户、超级管理员、停用/删除和跨租户账号,写请求复核 `expectedTenantId`。生产五个角色均为 `2/2`,本通道正例、跨通道拒绝和一次正式回复已完成 `5/5`,2026-07-31 纳入受控内部公测签认。
|
||||
>
|
||||
> 2026-08-03 当前工作树完成数字资产全生命周期治理的本地实现与验证,尚未部署:先以按空间 `LEGACY/SHADOW/ENFORCED` 兼容层保护线上旧资料,再依次提供候选/生效双指针、不可变版本与审核辅助、generation 向量血缘、撤回与回滚、保留/法务冻结/异人清理、可续跑历史补链、影子对照和人工启用门禁。生产不得跳过兼容层直接执行七阶段,也不得在发布窗口执行物理清理或自动切换现有空间。
|
||||
>
|
||||
> 本文只维护当前结论、证据层级和剩余门槛。逐提交发布流水已从当前真相文档移除,需要追溯时使用 Git 历史;不得再用 2026-07-14/15 的“尚未发布”记录判断现网。
|
||||
|
||||
## 1. 当前结论
|
||||
@@ -26,10 +28,10 @@
|
||||
|
||||
| 层级 | 当前状态 | 证据与边界 |
|
||||
|---|---|---|
|
||||
| 已实现 | 是 | 已有阶段一主功能;当前工作树另实现大喇叭投放控制、反馈转人工、正式学习任务/随机组卷、案例经验治理、原生异常恢复和上传容量门禁;接口事实见 [API_INTEGRATION.md](API_INTEGRATION.md) |
|
||||
| 本地自动化/API 验证 | 是 | 当前工作树管理端生产构建、移动端类型检查和 `216/216` 单测通过;后端 Surefire 共 `107` 份报告、`838` 项测试,失败/错误/跳过均为 `0`;迁移静态清单通过,Docker/MySQL 幂等执行未完成 |
|
||||
| 本地浏览器/视觉验证 | 部分 | `390×844` 已实际点击员工“今日/练/问”、大喇叭登录门禁和直通车登录门禁,无横向溢出或重叠;管理端认证后的案例发布弹窗因后端/MySQL 未运行而未验证。既有生产公司消息回归和 Android ASR 证据不外推到本批增量 |
|
||||
| 已部署 | 部分 | 2026-07-25 至 2026-07-31 的既有生产基线已部署;当前工作树的四个 `aihr_20260802_*` 迁移及对应后端、管理端和移动端增量均未部署 |
|
||||
| 已实现 | 是 | 已有阶段一主功能;当前工作树另实现大喇叭投放控制、反馈转人工、正式学习任务/随机组卷、案例经验治理、原生异常恢复、上传容量门禁,以及数字资产兼容放量、版本、审核、向量代次、撤回/回滚、保留清理、历史迁移和影子启用全链路;接口事实见 [API_INTEGRATION.md](API_INTEGRATION.md) |
|
||||
| 本地自动化/API 验证 | 是 | 当前工作树管理端生产构建通过;后端完整测试 `851/851`,失败/错误/跳过均为 `0`;发布预检范围契约通过,生命周期迁移已在现有 MySQL 连续执行两次且资产数保持 `104`,未创建清理或迁移任务 |
|
||||
| 本地浏览器/视觉验证 | 部分 | `390×844` 已实际点击员工“今日/练/问”、大喇叭登录门禁和直通车登录门禁,无横向溢出或重叠;2026-08-03 已在当前工作树管理端登录并实际打开空间放量、迁移/清理、版本审核辅助和影子启用对话框,桌面布局无明显重叠或截断,未提交任何状态变更。窄屏管理端本轮未复核 |
|
||||
| 已部署 | 部分 | 2026-07-25 至 2026-07-31 的既有生产基线已部署;当前工作树的 `aihr_20260815_*` 至 `aihr_20260821_*` 生命周期迁移及对应后端、管理端均未部署,线上资料未发生本批变更 |
|
||||
| 生产基础验证 | 是 | 服务 `active`;根站、租户接口和移动首页 API 正常;媒体重试列/索引契约通过,4 个历史零片段任务均恢复为已完成且有片段/向量。当前未执行包含移动 H5 的完整包匹配 |
|
||||
| 生产完整业务验收 | 部分 | 公司消息已完成认证态全员文件消息和直通车闭环,单台 Android 标准基座已完成生产 ASR;训练写入、主管复盘、定向人群正反例、正式处理人绑定、其他真机媒体与严格试点窗口仍未完成 |
|
||||
|
||||
@@ -43,6 +45,14 @@
|
||||
- 运行门禁:资料暂存盘默认要求至少 10GiB 可用空间,生产 HTTP 请求启用 P50/P95/P99 指标;约 600 名用户不是 600 并发,压测模型和通过阈值仍待业务、实施和运维签认。
|
||||
- 发布边界:四个正式迁移已纳入 Runbook;本地 Docker 未运行,未执行 MySQL 首次/重复迁移、完整后端认证 API、签名 APK、真机或生产验证。
|
||||
|
||||
### 2026-08-03 数字资产生命周期本地实现边界
|
||||
|
||||
- 执行顺序已经重新编排,不是把自动化辅助作为七阶段之外的平行项目:阶段 0 兼容层必须先落地,随后七阶段能力按依赖进入同一发布计划;系统先生成清单、风险、差异、影响和建议,人工只负责业务判断、异人批准和最终启用。
|
||||
- 既有资料默认继续由 `LEGACY` 服务。历史补链必须先创建固定范围的 dry-run,只有无失败完成且知识空间、风险范围、批大小完全匹配的演练,才能生成正式任务;正式任务仍需人工逐批推进,单项失败进入 dead letter,不中断旧读链路。
|
||||
- 新上传或修订只推进候选版本,生效版本继续提供检索;发布、撤回、回滚和 generation 切换均保留审计证据。日常删除语义为可恢复撤回,物理清理另受保留期、法务冻结、引用影响和异人控制约束。
|
||||
- 生产启用固定为单空间 `LEGACY -> SHADOW -> ENFORCED`。SHADOW 期间构建隔离候选 generation 并记录真实问题对照;覆盖、索引、质量和样本门禁通过后,才允许人工确认启用,并保留七天 generation 回退窗口。
|
||||
- 本地浏览器仅执行只读查看和打开对话框。验收前后数据库均为资产 `104`、非活动删除状态 `0`、清理申请 `0`、迁移任务 `0`、影子样本 `0`、generation 启用 `0`;已有一个本地 SHADOW 空间保持不变。以上不能外推为生产部署或线上迁移完成。
|
||||
|
||||
### 2026-07-29 资料处理媒体恢复发布边界
|
||||
|
||||
历史图片/视频在视觉模型不接受原始分辨率/编码,或模型、ASR、关键帧链路没有返回可检索文字时,旧逻辑会留下状态 0、片段 0 的附件,页面长期显示“等待解析”,却没有从原件重新入队的入口。当前实现先对图片纠正方向、缩放和重编码;异步队列只有生成至少一个片段才进入完成态,零片段明确保持可重试失败。管理端可调用 `POST /api/knowledge/doc/processing-tasks/{attachmentId}/retry`,服务端按当前租户从原 OSS 对象重新暂存,通过附件状态 CAS 防止重复入队,并用 `source_attach_id` 关联新队列条目。
|
||||
|
||||
@@ -166,6 +166,13 @@ mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aih
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260812_pipeline_run_sampling_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260813_golden_calibration_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260814_knowledge_privacy_derivative_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260815_knowledge_rollout_compat_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260816_knowledge_version_pointers_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260817_knowledge_review_assistance_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260818_knowledge_generation_revision_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260819_knowledge_retention_deletion_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260820_knowledge_migration_orchestration_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/update/aihr_20260821_knowledge_shadow_gate_mysql8.sql
|
||||
mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/aihr_personal_knowledge_mysql8.sql
|
||||
```
|
||||
|
||||
@@ -173,6 +180,10 @@ mysql --default-character-set=utf8mb4 "$DB_NAME" < backend/script/sql/aihr_perso
|
||||
|
||||
随后按 `20260808 -> 20260809 -> 20260810 -> 20260811 -> 20260812 -> 20260813 -> 20260814` 执行质量监控、人工术语修订、AI 案例来源、规则演进、处理批次、黄金集校准和隐私派生迁移。`20260811` 只增加规则草稿、状态审计、影子对照和抽样复核;`20260812` 只增加 `pipeline_run` 与自动生成待人工复核样本的调度,不启用规则执法,不改变任何资产生命周期。`20260814` 只增加独立脱敏正文、脱敏文件名、派生 hash、隐私状态、规则版本和复扫摘要字段,历史版本默认保持 `NOT_PROCESSED`,不得通过 SQL 伪造脱敏完成或自动获批。完整迁移后仍须最后执行排序规则兼容迁移。
|
||||
|
||||
生命周期兼容发布继续按 `20260815 -> 20260816 -> 20260817 -> 20260818 -> 20260819 -> 20260820 -> 20260821` 执行:先建立按空间的 `LEGACY/SHADOW/ENFORCED` 兼容范围,再增加候选/生效双指针、审核辅助、不可变 generation 与回滚证据、保留和异人删除、历史迁移清单、影子指标与启用门禁。七个脚本均为增量结构迁移;不得在 SQL 阶段自动发布、撤回、删除或切换现有空间。迁移完成后所有空间仍应为 LEGACY 或保持迁移前显式模式,历史资料继续可见。生产发布必须先只读统计资产、版本、生产成员、fragment、OSS 和 Qdrant 数量并备份;先以单空间 dry-run 和 SHADOW 验证,达到门禁后由人工启用。正式迁移任务必须通过 `verified_dry_run_id` 绑定同知识空间、同风险范围、同批大小且无失败的已完成演练;创建正式任务不自动推进批次。任何补链失败都停留在迁移 dead letter,不得切断旧读路径。
|
||||
|
||||
生产物理删除不是部署步骤,也不得与 schema/JAR 发布同窗口批量执行。日常纠错只做 `withdraw`;`purge` 必须有业务/法务确认的保留分类、影响快照、异人批准和已到期 `execute_after`。发布后先运行 reconciliation 并处理不一致,再考虑清理。ENFORCED 启用后旧 generation 保留七天;窗口内指标恶化可从管理端回退上一代,超过窗口必须重新构建候选 generation 和重新通过门禁。
|
||||
|
||||
8 月 1 日受控内部试点的正式来源注册是独立的业务数据变更,不随通用 schema 自动执行。先逐一核对附件 `id + doc_id`、原文件 SHA-256、发文号/版本、生效日期和适用范围,再由已授权负责人执行 `backend/script/sql/ops/aihr_20260730_aug1_formal_source_registry_mysql8.sql`。执行后必须只读确认恰好 10 条 `FORMAL_POLICY + APPROVED` 记录;任何缺失都保持无正式依据,不得把访谈、经验萃取、AI 生成内容或草稿补进白名单。
|
||||
|
||||
顺序原因:场景补充依赖三张场景/Rubric 基础表;五维迁移依赖场景和 Rubric;五岗位题库之后的内容运营迁移为每个场景补齐唯一的初始 Rubric、五个稳定评分维度与训练时评分规则快照列,并只修正仍处于待训练状态的旧每日题场景编号,不重写已完成记录。紧随其后的成长目录迁移只在既有场景和会话表上增加岗位/层级/能力项/审核状态与会话快照,以及复盘会话专用的 `growth_confirmation_level/growth_confirmed_by/growth_confirmed_time`;它只允许记录主管对当前会话下一训练层级的确认,不改写原训练快照或人事结论,并补齐/修复派发请求的 `(tenant_id,request_key,ext_party_id)` 唯一键与最近内容过滤索引。它保留既有启停可用性和历史会话,不把迁移结果写成业务内容签字。生产环境不得设置 `AIHR_PRACTICE_RUNTIME_SCHEMA_BOOTSTRAP=true`:应用请求只读校验表、列和关键索引,任何缺失都必须先执行本节正式 SQL,不能由任一用户请求触发补列、补索引或状态回填。岗位/SOP/任务/资格迁移只补正式数据契约,不写业务行,也不代表岗位适用范围、任务规则或资格标准已经获得 HR 确认。住宅 SOP 和 Prompt 迁移只补内置内容,不代表内容已完成业务复核。知识会话迁移只新增短期上下文表,不生成业务对话。排序规则兼容迁移先对齐本批发布表,全量排序规则迁移再统一历史 `aihr_*` 表;两者都读取目标库 `aihr_knowledge_info.tenant_id` 的实际排序规则。服务记忆迁移创建候选、统一采集、兼容项目记录和版本留痕四张表;工作上报幂等迁移随后只补原表列与唯一索引;知识分类迁移新增空间内分类表及附件成员的可空 `category_id`,不迁移、删除或扩大任何空间授权与检索范围;正式知识来源治理迁移只创建附件级权威类型、生命周期、版本、生效期、适用范围和原文件哈希契约,不自动批准任何历史附件。移动端政策问答只使用有效的 `FORMAL_POLICY + APPROVED` 注册项,治理表缺失、来源未批准、已失效、版本或哈希为空时均按无正式依据关闭。银城大喇叭 M0 迁移创建消息、阅读和不可变 v1 快照三表,为已存在消息补一次快照,并补发布请求键/载荷哈希、撤回原因及 `(tenant_id,published_by,publish_request_key)` 唯一约束。紧接着 M1 定向迁移补充必读与目标载荷字段,以及规则快照、命中对象快照两表;它只决定提醒/必读对象,不改变全租户公开频道的可见性。直通车迁移创建点对点反馈表,并给正式租户 `000000` 幂等预置总裁、财务、人力、审计、运营五个处理角色;人员仍须由管理员按职责分配,业务匿名不抹除内部审计身份。公司文件迁移创建异步提炼表并给消息增加可空 `attachment_id`,不迁移或公开已有文件;紧随其后的多岗位解读迁移只在附件表增加生成状态、经引用校验的结构化结果和规则版本,并建立异步队列索引,不回填旧文件、不改变文件 READY 或消息发布状态。随后,消息追问迁移只给短期会话增加可空 `broadcast_message_id`;它不保存消息正文,并用于约束同一会话不能切换公司消息。历史普通会话保持 `NULL`。Agent 迁移只新增最小运行审计表,不保存问题、答案、密钥或模型推理。个人资料迁移最后创建独立 `aihr_personal_*` 表,并从当前租户既有 MinIO 配置派生私有 `personal-minio` 配置;`ruoyi-personal` bucket 必须由受控运维流程创建和验证,不能在文档或日志中输出访问密钥。它们同样对齐目标排序规则,兼容历史生产库与全新 MySQL 8 数据库。
|
||||
|
||||
Reference in New Issue
Block a user