# R2.2 任务报告

完整只读审计见 [UniDesk #1871](https://github.com/pikasTech/unidesk/issues/1871#issuecomment-4952489758)，执行任务为 qt_aef9f6210a0b4b76bb6a84d99cbf8cc4。

## 实测基线

- 当前已部署 NC01 SQLite 为 1,277,952 bytes，228 runs、242 findings、234 metadata；全部 run 为 blocked。
- 仅 2 个 run 有 state_dir/report SHA 和 locator，合计 5 个 artifact。
- 历史 runtime YAML 声明多个私有 SQLite/PVC，但不能在未观测运行实例时把它们伪装为现役迁移源。
- SQLite 无 TTL；artifact bytes 不在数据库中，仍由 PVC/stateDir 与 web-observe GC 管理。

## 目标持久化模型

- 复用 config/platform-db/postgres-nc01.yaml 的 NC01 Host PostgreSQL，新建 Monitor 专用 role/database/export/Secret consumer。
- PG 保存 runner identity、run、finding、run payload、artifact locator 和必要 timeline；时间使用 timestamptz，JSON 使用 jsonb，定义 FK、唯一约束和 scope 索引。
- artifact bytes 继续留 runner PVC；PG 保存 node/lane/PVC/stateDir/relativePath/SHA/size 等不可变定位信息。
- latest 明确定义为所选 scope 内 updated_at DESC、run_id DESC；不再扇出多个 SQLite。
- 迁移工具只导出/导入已有事实，不合成缺失 run、finding、report 或 artifact。

## 切换

1. 从 resolved YAML registry 生成真实迁移源清单并记录 SQLite fingerprint/integrity/schema/rows。
2. 在受控短停写窗口做一致快照和 artifact existence/SHA 枚举。
3. 每 source 单 PG transaction 幂等导入，冲突即失败。
4. 校验行数、关键字段、latest 与 locator 可达性。
5. 一次发布把 writer/query 切到 PG，并拒绝 SQLite fallback。
6. 回滚只允许在接管确认前回到冻结 snapshot；确认后不再写回或服务 SQLite。

## 前置阻塞

受控只读状态显示 NC01 Host PG 服务和既有对象存在，但已有应用凭据 SCRAM 认证失败。实施前必须通过 owning YAML/Secret 流程修复并验证，禁止手改密码或复用其它应用凭据。
