11 KiB
title, status, created, updated
| title | status | created | updated |
|---|---|---|---|
| 运行数据生命周期与迁移语料库整改方案 | planned | 2026-09-14 | 2026-09-14 |
运行数据生命周期与迁移语料库整改方案
背景
合理性和当前数据画像见调研。本方案是 dev 数据根与投影整改 Wave 5 的详细子方案。
目标不是“为了省事删数据”,而是把不可控的历史运行库转化为:
- 少量可展示、可解释的当前数据;
- 少量可重复、可断言的迁移/回归语料;
- 大量自动过期的隔离测试数据;
- 可恢复后再销毁的旧卷。
目标
- dev 常驻项目控制在 6–10 个,均有 owner、用途、数据类别和过期/固定理由。
- test 不再积累跨轮测试数据;每轮使用独立 DB + state root,PASS 即删,FAIL 短期保留。
- 每次发布同时验证 clean install、受支持旧版本升级、选择性数据导入、reload/rebuild 和 rollback。
- 数据库 dump 与文件状态根成对归档,具备 storage identity、SHA manifest 和自动断言。
- 清理不产生孤儿 snapshot/run/blob/workspace,不误删共享 blob,不接触未授权 main/KB 数据。
- 最终成果在清理前进入独立 Final Artifact Vault 并取得 verified 回执;该回执不能替代完整备份和 migration corpus。
数据保留策略
| 环境 | 常驻内容 | 自动过期 | 明确保留 | 禁止事项 |
|---|---|---|---|---|
| dev | 3 个 workflow demo + 2–4 个当前 regression + 明确人工项目 | 普通 E2E 24h;失败运行 7 天;上一版 demo 14 天 | pinned 项目、当前/上一 release 对照 | 不按 ID/目录 mtime 直接删除;不把真实内容提交为 fixture |
| test | 无长期业务项目 | PASS 立即销毁;FAIL 3–7 天 | 最近 1 次失败环境用于排障 | 不连接 dev/test 共享库跑 destructive test |
| main | 真实业务/正式展示 | 暂不自动过期 | 由产品、审计、合规规则决定 | 本方案不授权清理或测试写入 |
| shared KB | 法规知识库 | 独立策略 | 现有 KB 备份体系 | 不随项目数据轮换 |
数据标识模型
新增数据集注册表或等价 SSOT:
dataset_id
class: operational_pinned | demo_current | regression_golden |
migration_baseline | ephemeral_test | quarantine
environment
source_schema / target_schema
source_commit
storage_identity
owner
retention_until
pinned_reason
contains_sensitive_data
manifest_uri / manifest_sha256
required_artifact_count / verified_artifact_count
status: building | verified | active | quarantined | expired | destroyed
项目至少增加 dataset_id、data_origin、retention_until、pinned_at/pinned_reason;自动测试创建项目时必须带 ephemeral_test origin 和 run namespace。未分类数据默认不可自动删除,而不是默认过期。
工具设计
1. dataset inventory
只读生成候选清单:项目关系行数、doc/run/session IDs、workspace、CAS 引用、最后活动时间、生命周期、是否有 ledger/fork/missing、敏感级别、推荐动作。输出 JSON + Markdown;不接受模糊环境名。
2. dataset export
按 dataset/project allowlist 导出关系闭包,不能只导 projects 表。必须同时打包:
- project/chat/task/workflow/governance/document/revision/notification/outbox/audit 关系;
- 账本 blob 与受控/自由文档文件;
- file reference 指向的 CAS blob;
- workspace/agent session 中经 allowlist 认领的文件;
- schema/version/storage identity/count/SHA manifest。
导出后在隔离区执行脱敏;真实账号 token、auth sessions、credential、原始敏感附件默认剔除或替换。
3. dataset restore --isolated-only
强制目标数据库名/端口/state root 满足隔离规则;拒绝 5433/5434/5435 及 agent_system_dev|test|main。实际执行 pg_restore,再导入文件包,不能只做 pg_restore --list。
恢复顺序:创建空库 → 恢复 source schema/data → 校验 source assertions → 执行 Goose up → 校验 target assertions → 重建 projection/index → restart/reload → 再次校验。
4. dataset rotate
生成计划而不直接删除:retain | replace | quarantine | destroy。执行必须使用 manifest ID、期望 storage UUID 和确认短语;禁止 --all、模糊 glob、未解析环境变量。
5. dataset gc
仅在数据库引用闭包和文件 manifest 都验证后执行:
- 删除明确 dataset/project 的关系闭包;
- 清理无引用 document content blob/CAS blob;
- 清理已归属 workspace/session;
setval/identity sequence 修复;- 输出 before/after counts、孤儿检查与可恢复位置。
首轮 dev 推荐不在旧库运行 GC,而是蓝绿新建后切换;GC 用于后续小规模过期数据。
6. artifact coverage
按服务端终态事件盘点应归档成果,并与 FAV verified receipt 对账。任何必需成果处于 requested/publishing/failed/missing,或 vault storage identity 不匹配时,受管 dataset/持久状态源不得销毁。普通计算 workspace 只有在终态事务已冻结精确 payload 后才可按 TTL 清理;准入、manifest、恢复和删除边界见最终成果保险库整改。
迁移测试矩阵
每个 release candidate 必须执行:
| 测试轨 | 输入 | 验证重点 |
|---|---|---|
| Clean | 空 PostgreSQL + 空 state root | migrations 1→latest、官方 workflow seed、storage identity、ready |
| Oldest | oldest-supported corpus |
跨版本 backfill、约束、ID sequence、文档 legacy repair |
| Previous | previous-release corpus |
常规升级、API/UI 兼容、性能 |
| Hazard | 最小异常 corpus | hard-break、projection missing/fork、旧消息 scope、高 ID、pending run |
| Import | latest schema + selected demo/regression package | 关系闭包、文件 SHA、权限、通知、版本账本 |
| Reload | import 后 app/pi rebuild + restart + 宿主级重载 | storage identity、mount、task 恢复、正文/overlay |
| Rollback | 切换失败后接回 quarantine 旧卷 | RTO、旧 storage identity、无新写丢失 |
| Artifact recovery | 已归档终态成果 + 空 scratch DB | manifest/SHA、删除账本、recover-as-collection、冲突预览、权限 fail closed |
迁移通过必须包含真实 restore,不接受仅跑 Goose 幂等测试;产品签字至少包含真实页面登录、项目列表、对话、文档打开/修改、刷新、退出重登和 rebuild 后恢复。
初次精简执行波次
| 波次 | 动作 | 完成判据 |
|---|---|---|
| D0 冻结与标注 | 先完成当前 split-brain 遏制;冻结 dev 写入;对 366 个项目 inventory;人工确认 pinned/敏感/owner | 100% 项目有建议动作;未分类项不删除 |
| D1 工具安全修补 | 移除备份脚本内默认凭证;backup 同时归档 DB+state;restore 强制 scratch 且真实恢复;加入 manifest/checksum/assertions | 恢复演练能从零创建隔离环境并通过 SHA/关系断言 |
| D2 构建 corpus 与成果覆盖 | 建 schema 25、28/29、32/33 三个最小迁移包;构建 143 等价脱敏 hazard;选择 6173 current regression;盘点保留项目的终态成果并生成 FAV coverage | 每包可重复生成/恢复;必需成果均 verified 或有批准的排除理由,不依赖真实 main/test 数据 |
| D3 新建 green dev | latest schema 空库 + 固定新 state root;导入选中的 6–10 项;执行 projection/CAS/sequence/integrity 校验 | 无 orphan;active 文档 aligned;ready/storage identity PASS |
| D4 全链验收 | clean/oldest/previous/hazard/import/reload/rollback;真实页面和真实 PI 跑主链 | 报告区分工程、PG、PI、浏览器、restart/rebuild 证据 |
| D5 原子切换 | 切换 dev 到 green identity;原 blue DB/文件根转只读 quarantine | 新环境持续观察 24–72h,无新增 blocker,可一键回接 blue |
| D6 延迟销毁 | quarantine 满 7–14 天,再次 restore drill、差异确认、用户批准后销毁 | 记录销毁 manifest、范围、时间和不可恢复性;不得顺带清 main/KB |
首轮建议保留/淘汰
保留
- 项目 143:临时 pinned,直到脱敏 legacy/hazard corpus 可替代。
- 项目 6173:作为最新完整受控正文/版本/UI/restart 回归样本。
- 项目 6159:作为 previous 对照保留一个发布周期,然后由 6173 替换。
- 三正式工作流各一个新生成的确定性 demo;生成成功后不保留同类失败尝试。
- 最近一次失败 E2E 的完整环境,最多 7 天,且与常驻 dev 隔离。
不直接保留
- 数百个无文档、无 run 或仅测试前置步骤的 planning/active 项目;
- 重复的 UI Round 中间项目和已由更新 PASS 覆盖的失败项目;
- 能由 unit/PG fixture 稳定重建的测试污染 workflow key、临时用户、session 和 run;
- 无引用 CAS/workspace,需在 mark-and-sweep 验证后删除。
该清单是初始建议,不是删除授权;最终 retain allowlist 应由 inventory 报告和用户确认生成。
验收标准
- dev 常驻项目 6–10 个,所有项目都有 dataset class/owner/retention。
- 旧 366 项目对应的 blue DB+state 已成对备份并实际恢复成功。
- green dev 从空库建成,选择性导入后 DB/file/storage UUID 一致。
- 三个 migration baselines 与 hazard corpus 均能升到 latest 并通过断言。
- 无 orphan task run、revision snapshot/version/event/report、CAS blob 或 workspace。
- 项目 143/6173 页面打开、修改、刷新、重登、rebuild 后恢复 PASS。
- 保留项目的应归档成果覆盖率为 100%,清空 workspace 后仍能定位并校验最终正文/最终回复。
- FAV 在空 scratch 库完成受控部分恢复;未声称或伪造权限、lease、pending task 等未归档状态。
- 新测试数据带 TTL,PASS 后自动销毁,失败数据按策略到期。
- test/main/shared KB 未被误操作;所有破坏性动作有精确 manifest 和延迟销毁记录。
不建议的方案
- 每次直接
docker compose down -v再凭记忆重建:无法证明保留数据和文件配对完整。 - 在 dev 库中写一份巨型级联 DELETE:当前关系与文件引用复杂,容易留下孤儿或误删共享 blob。
- 只保留最新时间的项目:会丢失最有价值的旧 schema/hazard 覆盖。
- 把整份真实旧库永久当 migration fixture:迁移慢、不可重复、可能含敏感数据。
- 把 FAV 当完整数据库替代品,或按
output.md/mtime 扫描猜测终态:会引入第三事实源并归档中间结果。 - 修改历史 Goose migration 迎合新空库:已发布迁移不可重写;修正必须新增 migration。
相关链接
- Research: 运行数据精简、迁移语料与演示数据保留策略
- Final Artifact Vault: 最终成果保险库与受控恢复
- Parent remediation: dev 数据根隔离与投影自愈
- Short-term: 运行数据生命周期方案
- gap-matrix:
RUNTIME-DATA-ROOT-SPLIT-BRAIN