dcdc8d1ddd
全栈知识治理平台首次入库(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 干净
100 lines
3.4 KiB
Markdown
100 lines
3.4 KiB
Markdown
# P2.2 PP历史账本离线接管验收
|
||
|
||
## 范围
|
||
|
||
本阶段将旧PP同步器的append-only本地账本接入治理数据库:
|
||
|
||
- 不请求PP、AList、钉钉或WeKnora网络API;
|
||
- 不修改旧同步项目及其账本、manifest或下载文件;
|
||
- 不下载、上传、移动或删除源文件;
|
||
- 不启用新PP定时Connector;
|
||
- 不将离线历史记录宣称为当前WeKnora已验证状态。
|
||
|
||
## 折叠与恢复契约
|
||
|
||
1. 按旧脚本的`source_url_hash`稳定键折叠;
|
||
2. 只接受`completed`和带Knowledge ID的`content_alias`终态;
|
||
3. 单次账本只能包含一个KB;
|
||
4. 所有终态字段必须完整,source locator和SHA必须是64位小写十六进制;
|
||
5. 任何仅有中间状态、没有终态的source key都会阻断整批导入;
|
||
6. 缺SHA终态只能从匹配locator hash的manifest恢复;
|
||
7. 恢复前验证账本大小、manifest大小、实际文件大小和实际SHA;
|
||
8. 超过旧连接器50MiB单文件限制时阻断;
|
||
9. alias必须指向同一快照内的completed canonical,并且SHA、Knowledge ID一致;
|
||
10. 输出只含聚合数字,不输出KB ID、source ID、Knowledge ID、URL或本地文件路径。
|
||
|
||
## 预期真实账本口径
|
||
|
||
```text
|
||
events=1093
|
||
source_items=559
|
||
completed=530
|
||
content_aliases=29
|
||
recovered_sha256=75
|
||
verified_bytes=871524116
|
||
content_objects=530
|
||
versions=559
|
||
publications=530
|
||
```
|
||
|
||
`recovered_sha256=75`必须建立在75个文件逐字节重算全部匹配的前提上。
|
||
|
||
## 数据库映射
|
||
|
||
```text
|
||
1 source_connection enabled=false,secret_ref/base_url为空
|
||
559 source_items external + pp_public_tag + unchanged
|
||
530 content_objects verified,完整SHA唯一,不保存local_spool_ref
|
||
559 versions raw摘要只保留legacy_status、source_ids和alias canonical hash
|
||
530 publications uploaded + completed + unpublished
|
||
```
|
||
|
||
29个alias只建立自己的SourceItem和Version,共享canonical ContentObject,不重复创建TestPublication。
|
||
|
||
## 幂等和事务
|
||
|
||
- 整批导入在单个PostgreSQL事务内完成;
|
||
- 只允许`INSERT ... ON CONFLICT DO NOTHING`;
|
||
- 禁止UPDATE和DELETE;
|
||
- 第一次真实导入期望新增`1/559/530/559/530`;
|
||
- 第二次相同导入期望新增`0/0/0/0/0`;
|
||
- 任一步失败必须回滚整批。
|
||
|
||
## 自动验证
|
||
|
||
在项目根目录运行:
|
||
|
||
```bash
|
||
/home/zheromiku/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.0.linux-amd64/bin/go test ./... -count=1
|
||
/home/zheromiku/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.0.linux-amd64/bin/go vet ./...
|
||
/home/zheromiku/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.26.0.linux-amd64/bin/go build ./cmd/...
|
||
```
|
||
|
||
真实数据库集成测试必须在唯一临时数据库中设置`TEST_DATABASE_URL`后运行;普通无环境测试显示SKIP不等于集成测试通过。
|
||
|
||
## 本地库读回验收
|
||
|
||
必须验证:
|
||
|
||
```text
|
||
schema_migrations=1,2
|
||
jobs=2
|
||
source_connections=1
|
||
source_items=559
|
||
content_objects=530
|
||
source_item_versions=559
|
||
test_publications=530
|
||
content_alias versions=29
|
||
unique publication knowledge IDs=530
|
||
forbidden raw fields=0
|
||
```
|
||
|
||
530条历史Publication的`retrieval_state`必须是`unpublished`。只有未来通过目标WeKnora只读API确认对象存在、状态和检索行为后,才能改为`enabled`。
|
||
|
||
## 备份与运行边界
|
||
|
||
- 导入前创建PostgreSQL原生自定义格式备份;
|
||
- 备份必须非空、权限600并通过`pg_restore --list`;
|
||
- 导入只使用短期容器,不重启Compose五个长期服务;
|
||
- 不执行`docker compose down -v`、卷删除、commit、push或外部部署。
|