| V01 |
只有对内/对外两个目标,身份来自配置映射 |
internal/httpapi/library_*.go;web/src/ReleaseTargets.tsx |
overview 对非法 scope 返回 400;真实归档 internal/external 各自解析到唯一 KB |
| V02 |
解析/索引/Wiki 就绪,验收绑定本版 |
v071/library_source_settlement.go |
结清检查在封存前执行、缺项阻断;页面注明依据哪次快照 |
| V04 |
完整固定版本:文档+处理结果+资源+索引+完整 Wiki |
internal/librarysnapshot/* |
真实快照 f992d64e…:4 文档/38 分块/122 索引/21 资源/31 Wiki 页/55,309,044 字节,部件摘要逐项校验 |
| V06 |
只同步知识数据,不含账号/会话/凭据 |
导出白名单(10 知识表 + 知识域索引 + 资源 + Wiki) |
部件清单无 users/sessions/api_keys |
| B01 |
每次生产写入前完整预备份,失败零写入 |
v071.ProductionBackupStore.Prepare + prebackup 阶段 |
真实 PG/ES 上预备份 3111e823…;故障注入后用它恢复并校验 |
| B03 |
每版保存完整 Wiki 与引用关联并校验 |
library_snapshot wiki 部件 + 摘要 |
真实快照 31 页逐页摘要;manifest 记录数量/字节 |
| S01 |
数据库/资源/索引/Wiki 真实落地并校验 |
v071.ProductionLibraryTarget.Apply/Verify |
本轮 sync libsync-internal-…1793221776816380302:database 67 行、resources 21、index 122、wiki 63 行全部 succeeded + verify succeeded;目标库 wiki 31 页 |
| S02 |
生产不再解析/Embedding/生成 Wiki |
index 阶段直接搬运归档 embedding |
真实 ES 写入归档 embedding,未调用模型 |
| S04 |
各阶段失败/超时/重启可追溯可恢复 |
library_jobs/library_job_stages + ReconcileLibraryJobs |
阶段与错误持久化;worker 清理"队列无对应作业"的孤儿 |
| S05 |
幂等与互斥(多 worker 安全) |
幂等表 + active 唯一索引 |
真实 PG:同目标第二作业被拒;同键同 digest 复用;换 digest 冲突 |
| R01 |
按指定版本手工恢复 |
POST /library/restores + library.restore |
真实跑通:撤旧授权→503;签发 restore 授权→202→succeeded,内容回到目标版本(evidence/B_restore.json) |
| R02 |
恢复失败显式异常、不回退测试库 |
Outcome.State=rollback_failed + 独立阶段 |
隔离测试 + 前轮真半写场景(partial.json) |
| P01 |
作业阶段与整体状态 |
library_jobs.state/stage;页面阶段条 |
阶段勾选只认当前作业证据;无作业显示"尚未开始" |
| P02 |
四类分项计数/字节/错误 |
stageSizesFrom(manifest) + library_job_stages |
真实数据:database 67/88086B、resources 21/53490166B、index 122/1624880B、wiki 63/105912B |
| P03 |
同步明细与异常 |
页面"同步明细"读阶段行 |
行来自持久阶段,刷新/重启可复现 |
| U01 |
发布管理为主要入口(两库+单作业区) |
web/src/ReleaseTargets.tsx |
按确认稿布局,父会话已在登录浏览器核验 |
| U02 |
权限边界 |
canWrite/canCapture,写操作需 engineer+ |
无权限不给封存入口;未接线显示通道状态 |
| U03 |
操作确认 |
封存按钮 + 作业号 + notice |
同一作业号重放返回已存作业并提示 |
| D01 |
保留策略(数量/天数) |
internal/libraryretention |
未设置=0 按"全部保留",不编默认值 |
| D02 |
占用测量 |
internal/librarysnapshot/usage.go |
版本数/去重内容/blob/未引用/清单;两份真实清单 55,309,693 字节 |
| D03 |
依赖保护 |
libraryretention.Build 的 Protected/ProtectedBy |
真实归档两版均因"最近测试封存"受保护 |
| D04 |
清理预览 |
Build 的 Candidates/ReclaimPreviewBytes |
keep=1 时仍 0 候选;回收预览只计独占字节 |
| D05 |
容量门禁 |
CheckCapacity + sync gate |
预算未设置→阻断;超预算→阻断并给预计字节 |
| D06 |
测试残留口径 |
未引用 blob 统计 |
真实归档未引用 blob 为 0(口径,不等于扫过全部残留) |
| S03 |
实例级维护窗口:关入口→排空→静默证明→停写者→写入→校验→开入口 |
internal/libraryfreeze + librarymaintenance + 迁移 070–072 |
前轮 7 场景真跑全绿(normal/kill/applyfail/partial/crossscope/recover_refuse/recover_ok),本轮 sync/drain 场景继续复用;quiesce 证据、post_stop_*、journal、gate drain.json 均可回看 |
| V03-a |
撤销一份共享贡献后,保留另一份贡献、清除撤销方独有正文/引用/实体边、目录正确 |
由 WeKnora 源侧执行(cleanupWikiOnKnowledgeDelete + EnqueueWikiRetract),治理侧只比对/搬运 |
本轮真实验收:kgmaint 隔离实例、原版 API 顺序入库两篇文档 → entity/fa-bu-zha-men 同页双来源(2097 字节)→ 真实 DELETE /api/v1/knowledge/{id} → 页面保留、来源只剩保留文档、A 独有正文(ZEBRA-A-7731/9910)清除、B 贡献仍在、引用 2→1 且只剩 B 的分块、目录不变、A 独有页面/摘要整页删除、索引页不再列出、实体边无死链。13/13 检查通过。证据:kg-candidate-e2e/evidence-wiki-final/s8-final-checks-r1.json + 06-wiki-*-r1.json + s3/s6-db-*.json |
| V03-b |
治理侧能把上述语义变化说清楚(不是页面级"无变化") |
internal/librarydiff/wiki.go CompareWiki;GET /library/overview 的 diff.wiki |
逐页比对正文/来源/引用/出入边/目录,输出 sources_removed、citations_before→after、changed;单测 wiki_test.go、视图单测 library_wiki_diff_test.go;页面逐行展示(wikiContributionLines + 测试) |
| U04 |
维护级别/进度/恢复错误真实呈现 |
MaintenanceCard(web/src/ReleaseTargets.tsx)、/api/v1/library/maintenance |
显示实例级/库级、持有 scope+作业、阶段、入口开/关、服务、开始/释放、进度(阶段名中文化)、恢复错误与处理记录;仅"窗口仍持有且作业失败"时给"按预备份恢复";无记录时"未接入 + fail closed"。组件测试 6 项 |