aps-agent/docs/round-67-approval-migration...

2.6 KiB
Raw Permalink Blame History

Round 67 审批迁移可恢复状态快照

更新日期:2026-08-03

  • 状态:R67-B1 本地完成,最终独立复审 AUDIT: PASS。
  • 分支:main,未提交、未推送、未合并、未发布。
  • 服务:8003 PID 21576、5173 PID 9808,均 healthy。

已完成

  • 文件审批源缺失保持空源语义;文件存在但 JSON、schema、record、交叉引用损坏明确 fail-closed。
  • 迁移 grant 统一保存 token_digest(raw token),原 token 不落数据库;迁移后可消费一次,重放失败。
  • grant 已离开 pending 时,依据 grant + terminal history 重建 APPROVED request,满足数据库外键。
  • 迁移使用与 ApprovalStore 同一 .lock,要求 APS_APPROVAL_MIGRATION_QUIESCED=1,持锁完成读取、单事务 flush、source hash 复核与 commit。
  • request/grant 不可变列与 payload 身份同时校验;目标状态只允许单调前进,不覆盖回退。
  • 兼容旧错误迁移:同时检查 expected digest、raw-token 主键和 confirm_id;一致 legacy 行原子修复,不一致整体回滚。
  • history 用完整 canonical payload digest 去重;同秒同状态但 payload 不同的合法事件保留。
  • 任一预检、事件构造、flush、source drift 或 payload 冲突均使三张审批表整体回滚。

验收

  • migration focused:29 passed。
  • approval 相关 suites:74 passed / 1 warning。
  • 全量黄金:1053 passed / 2 warnings(328.10 秒)。
  • Ruff、compile、git diff check:通过。
  • 真实临时 SQLite:P3 grant 迁移后 request=APPROVED;stored hash 等于 SHA-256;raw token 主键不存在;consume=true/false;损坏 JSON 明确报错且 DB 不变。
  • 最终独立审计:AUDIT: PASS。
  • 本轮无 JS 变更,未重复 Round 66 已完成的 Node 60 与 Web build;8003/5173 真实 HTTP 健康。

数据保护

  • server/data/approvals.json SHA-256:AC4AFF96C309FCDA0ADF38400074DF9BE4AF04364538CBA0B7519CB77733D1AE,验收前后不变。
  • world.json:C6E7FF090719DB505AF5C3B0D8ADD376CBA7843D6E6982A68C1BA02C342052FA,不变。
  • MOM world:6B64ADF6F29A43A518D89718610EE71FAD60E86D3F38CD5CFF26F1740CC53F7D,不变。
  • server/data/** 与 .env 无 Git 状态变化;所有迁移运行使用临时目录/SQLite。

剩余边界

  • R67-B2:TTL/expiry/CAS 改用数据库权威时钟,并做双节点时钟偏移测试。
  • 下一 P0 evidence:sap.sync.outbound 升为 P3 并绑定双人审批、before snapshot、payload digest、world fingerprint;随后处理 folder.schedule TOCTOU 与 Automation G4 payload 绑定。
  • 真实 MySQL 多主机、旧节点停写编排、网络断连/死锁恢复仍需外部部署环境验收。