# P2.1 来源数据底座验收 ## 范围 本阶段只验证统一来源领域模型和PostgreSQL Migration 2: - 来源连接、来源对象、内容对象、来源版本、测试发布五层身份分离; - 来源内`stable_external_id`唯一; - 全局内容对象仅按完整64位小写十六进制SHA-256去重; - 来源变化、内容获取、测试导入、处理和检索状态分开保存; - 新表初始为空,不读取或导入PP、AList、钉钉数据; - 不连接测试或生产WeKnora。 ## 静态与单元验证 在项目根目录执行: ```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/... ``` 在`web/`执行: ```bash npm test -- --run npm run typecheck npm run build ``` 全部命令必须返回exit code 0。 ## 一次性数据库验收 在唯一命名的临时数据库中依次验证: 1. 执行Migration 1和Migration 2; 2. 再执行一次Migration 2,确认`IF NOT EXISTS`允许安全重跑; 3. 插入一条完整的来源→版本→内容→测试发布链; 4. 同一来源内重复`stable_external_id`必须被拒绝; 5. 不同来源可使用相同`stable_external_id`; 6. 重复SHA-256必须被拒绝; 7. 非64位、小写十六进制之外的SHA-256必须被拒绝; 8. 未声明状态值必须被拒绝; 9. 执行Migration 2 down,五张P2表必须按外键依赖反序删除; 10. P1的`jobs`表必须保留; 11. 删除临时数据库。 禁止在当前持久本地数据库中执行down验收。 ## 当前本地数据库只读验收 ```bash docker compose exec -T postgres psql -U governance -d governance -At -c \ "SELECT string_agg(version::text, ',' ORDER BY version) FROM schema_migrations;" ``` 期望: ```text 1,2 ``` ```bash docker compose exec -T postgres psql -U governance -d governance -At -c \ "SELECT COUNT(*) FROM pg_tables WHERE schemaname='public' AND tablename IN ('source_connections','source_items','content_objects','source_item_versions','test_publications');" ``` 期望:`5`。 ```bash docker compose exec -T postgres psql -U governance -d governance -At -c \ "SELECT (SELECT COUNT(*) FROM source_connections),(SELECT COUNT(*) FROM source_items),(SELECT COUNT(*) FROM content_objects),(SELECT COUNT(*) FROM source_item_versions),(SELECT COUNT(*) FROM test_publications);" ``` 在正式导入来源前期望:`0|0|0|0|0`。 ## 数据保留与运行状态 - Migration前必须创建非空PostgreSQL原生备份,并通过`pg_restore --list`校验; - 只替换API容器,PostgreSQL、普通Worker、Release Worker和Web容器ID不得变化; - Migration后原有`jobs`数量和代表任务状态必须保持; - `/health`必须返回`{"status":"ok"}`; - API启动日志不得包含Migration错误; - 不执行`docker compose down -v`、卷删除、提交、推送或外部部署。