业务目标
把 Git 跟踪内容同步到既有 Google Docs,同时保护文档 ID、tab 拓扑、未映射区段与权限。
- exact allowlist 与唯一
t.0 - changed mapped sections only
- 禁止 create / copy / delete / share / permission / tab topology
- live user message only
结论:ShipQ 中最能完整体现 DHF 的案例,是 Google Docs 内容同步的 partial-write → 受控回滚 → 独立回读 → 重新授权 → 成功续行。它同时激活 SAFE 的 S、A、F、E 四项控制。
比较跨系统状态、授权层数、远端变更风险、证据链长度、失败恢复深度。
| 候选 Case | 跨系统 | 授权 | 变更风险 | 证据 / 恢复 | 判断 |
|---|---|---|---|---|---|
| Phase 2 Google Drive package | Repo + Drive | task-scoped single-use | 创建远端资产 | receipt + readback;State Log 补记 | 高 |
| Level 2 smoothing Phase 0–3 | Registry + ledger + tests | owner acceptance + phase gates | 主要为本地政策状态 | 多阶段验证;无本次远端突变 | 高 |
| Gmail Phase 2 draft | Repo + Gmail | 一次性确认 | 未发送草稿 | partial readback;无 send | 中高 |
| Google Docs partial-write recovery | Repo + policy + live Docs + version history | 分类、manifest、revision、逐文档 owner 确认 | 写已生效但结构损坏 | receipt → freeze → restore → independent readback → new manifest | 最高 |
Repo source、动作政策、owner 即时授权、Google Docs 实时 revision 必须同时一致。
把 Git 跟踪内容同步到既有 Google Docs,同时保护文档 ID、tab 拓扑、未映射区段与权限。
t.0Canary 写入已经发生,但插入正文继承了后随段落的 H1 样式:内容存在,结构与样式错误。Writer 返回 readback_structure_mismatch。
Agent 生成只读 manifest 与 diff;Owner 对具体 digest 和 revision 确认,不是泛化许可。
Writer 分阶段写入并自动回读。若内容已经写入、但结构没有达到约定,系统会保存一张永久失败回执 readback_structure_mismatch,记录实际结果,并转入冻结与恢复流程。
Agent 不继续剩余目标;失败 receipt 被保留。恢复证据不等于新写权限。
Owner 手动恢复 pre-mutation 版本;Agent 随后独立检查 content 与 styles,确认没有未回滚写入。
Agent 修复 changed-heading selection、revision TOCTOU 与样式归一化并跑测试;HEAD 变化使旧 manifest 失效,因此必须生成新 digest,由 Owner 再次确认。
Agent 逐文档编排;Writer 逐阶段读回。成功 receipt-v3 全部 readback=full;最终状态写入治理记录。
| # | 动作 | 发起者 | 执行者 | 关键证据 / 停点 | 是否反复 |
|---|---|---|---|---|---|
| 01 | 将动作从 Level 2 recut 为受限 Level 1,并锁定 allowlist / forbidden mutations | Owner 决策 | Agent 修改本地政策;Owner 记录/接受 | Policy digest + State Log;不等于本次写授权 | 政策变更时才重做 |
| 02 | 读 live revision、生成 manifest 与 diff | Owner 请求同步 | Agent + manifest tool | source commit、document、heading、revision、digest | HEAD/revision 变化即重做 |
| 03 | 确认 canary 的 manifest digest 与 revision | Agent 展示确认项 | Owner 明确确认 | per-document confirmation | 每份文档 / 每个新 manifest |
| 04 | 按 stage 写入 skeleton / table insert / fill / style | 已消费的 Owner 授权 | Writer + Google Docs API | 每 stage 带 requiredRevisionId | 每个 stage 重复 |
| 05 | 每 stage 后 fresh readback 与结构断言 | Writer 自动触发 | Writer / Docs read API | stage receipt;revision、内容、结构、样式 | 每个 stage 重复 |
| 06 | Canary mismatch 后冻结后续写入 | Failure protocol | Agent / writer fail-closed | 失败 receipt;禁止 blind retry | 本案实际发生 1 次 |
| 07 | 恢复 pre-mutation 原生版本 | Owner 裁决 | Owner 在 Docs UI 执行 | version history + restored revision | 本案实际发生 1 次 |
| 08 | 独立验证恢复后的 content / styles | Agent 提起只读复核 | 独立 readback 路径 | content_restored=true、styles_restored=true | 回滚后必须执行 |
| 09 | 本地修复 writer 并加回归测试 | Owner 允许继续 | Agent | selection、TOCTOU、paragraph style commits/tests | 直到本地门禁通过 |
| 10 | 新 manifest、新 digest、新 revision 再授权 | Agent 生成并展示 | Owner 确认 | 旧确认不能复用 | 发生 HEAD/revision 漂移就循环 |
| 11 | 成功 canary、Owner UI 接受、再处理其余有变化文档 | Owner 放行继续 | Agent 编排;Writer/API 执行 | per-stage receipt v3 + owner acceptance | 按文档重复;零变化则跳过 |
| 12 | 最终全目标回读、receipt 汇总与治理记录 | Agent 收口;Owner 为治理责任人 | Agent + read API | 3 written / 2 no-write / 0 unrolled write | 终局一次;失败则回相应停点 |
Canary write → structure mismatch → freeze → Owner rollback → independent readback → writer fix → new manifest → new authorization → canary retry。
后续结构检查曾因 table 顺序和 hard-wrap 段落分组假设报错;归一化合法表示后重新读回,才确认真实结构正确。验证器本身也必须被验证。
每个有变化文档都按多个 write stage 执行;每个 stage 后 fresh revision/readback。Canary 先行,Owner 接受后才进入其余文档。
若检查后、写入前 revision 已变化:拒绝写入 → 重新生成 manifest → Owner 重新确认。仓库证明此门禁存在,但没有证据显示最终成功执行触发过该分支。
风险出现后,路线从“实现”切到“冻结—恢复—再验证”,有新事实与授权后才返回执行。
S 定义完成,A 决定推进权,F 证明现场,E 保证可恢复。
把“同步文档”收窄成可判定动作。
t.0授权绑定具体动作快照。
用现场证据替代“应该成功”。
失败是受控状态迁移。
| 关键时刻 | S | A | F | E | 推进条件 |
|---|---|---|---|---|---|
| 写入前 | 范围与 DoD | 确认 manifest + revision | HEAD / digest / revision | 预定义 rollback | 四者同时成立 |
| 结构失败 | 断言指出违约 | 旧授权不覆盖重试 | mismatch receipt | 停止、保全证据 | 不得继续 |
| 回滚后 | 恢复 pre-mutation | Owner 执行恢复 | 独立 content + styles readback | 确认无残留 | 只证明已恢复 |
| 再次执行 | 新 writer + manifest | 重确认 digest / revision | 新测试与 receipt v3 | failure protocol 保持 | 不复用历史 green |
SAFE 判断在哪里停;RECOVER 规定停下后如何恢复事实、状态与重新推进的资格。
Recognize the partial or uncertain outcome:识别已经发生或无法确认的副作用。
End further mutation:立即停止后续写入。
Capture the failed receipt and scope:保留失败回执和影响范围。
Obtain the last trusted state:取得最后一个可信状态。
Verify restoration independently:独立验证 content 与 styles 已恢复。
Escalate for fresh authority:提交新 HEAD、manifest、digest 与 revision,取得新授权。
Resume only from proven state:只从已证明状态恢复执行。
安全属性是每个失败态都有唯一、可审计、不扩大影响面的出路。
这个案例覆盖 TRUST 五域;价值来自可信状态变化,不是更多流程。
“结构错”“已恢复”“成功”是不同事实。
Canary 失败立即停止,避免缺陷扩散。
只写变更区段,不碰零变化文档,也不盲目重试。
预绑 revision 与 rollback,失败后无需猜测。
Manifest、receipt v3、failure protocol 沉淀为可审计门禁。
此页只读解释,不触发任何远端动作。
docs/designs/harness-state.md:1242–1274:staged execution、最终 scope、receipt-v3、rollback 终态。docs/requirements/google-docs-content-sync-policy-v2.json:allowlist、trigger、write / failure protocol。docs/plans/2026-08-04-gdocs-sync-style-fix-and-resume-plan.md:根因、错误分类、停止与回滚。scripts/google_docs_sync_write.py 与 tests:mismatch、revision guard、receipt persistence。0c7ca95、4871257、35e1245、2951965:hardening 与最终记录。main,HEAD 162b7af;新远端写入仍需重查授权、revision 与目标状态。