CHAPTER 15 · 公开候选
最后一章不是写一份“项目完成说明”。你会打开统一入口的真实链接,用 A-13 只改四个白名单业务文件,运行受影响检查,实际回退到更新前哈希,再确定性地重新应用。
打开第 15 章练习入口。完整任务位于练习包内 tasks/chapter-15.md;网站只提供下载与阅读,不会替你执行本地文件。
1. 起点
第 8—14 章已经交出并验收了各自成果。现在要把人工采用的结果接成一个入口,并用新增材料 A-13 完成一次可回退的小更新。
先理解问题
可维护的判断标准不是目录看起来完整,而是下一位能从入口开始,知道读什么、写哪里、失败时如何恢复。A-13 更新把这件事变成一次真实演练:范围受限、检查可跑、回退等值、重放确定。
2. 只读输入
- 第 8—14 章通过检查的成果和人工决定
inputs/chapter-15/A-13.mdinputs/chapter-15/update-request.md
任何未验收、被退回或仍待确认的前章内容都不进入工作台。
建议阅读顺序
先读第 14 章 handoff 和人工决定,再读 A-13 与 update-request;最后才打开更新脚本。入口只接收已验收且被采用的成果。
3. 唯一写入位置
只写 workbench/handoff/,以及更新请求明确允许的 workbench/library/ 和 workbench/content-package/ 副本。不得改 inputs/、checkpoint 或前章证据。
写入位置是本章的安全边界。Codex 可以创建目录,但不能扩大到 inputs、checkpoint 或别章输出。
4. 本章唯一成果
交付 index.html、maintenance-log.md、test-record.md、rollback-point.json、rollback-proof.json、HANDOFF.md 和 maintenance-checklist.md,并证明 A-13 可更新、可检查、可回退。
rollback-proof.json 必须在实际回退并逐文件比对之后生成:顶层记录 exactRestoration: true 和回退命令的 directExitCode: 0;files 为四个白名单业务文件逐一记录 actualSha256 与 exact: true。其中 actualSha256 必须等于 rollback-point.json 中同一文件的 beforeSha256,不能只写一句“已经恢复”。
成果必须能打开、能回查、能由本章检查验证。只有一句“已经完成”不算交付。
5. 可复制给 Codex 的任务
只整合第 8—14 章已通过检查且被人工采用的成果,在 workbench/handoff/index.html 建一个离线统一入口,逐项链接资料库、内容包、记录页、批处理、事件证据和协作决定。先运行 node scripts/apply-update.mjs workbench,记录允许文件的更新前哈希到 rollback-point.json,再按 inputs/chapter-15/update-request.md 把 A-13 作为一次最小更新加入获准的资料库和内容包副本,写 maintenance-log.md,运行受影响检查并写 test-record.md。执行 node scripts/rollback-update.mjs workbench;直接记录退出码,逐一计算四个白名单文件回退后的 SHA-256,与 beforeSha256 比较,并把 exactRestoration、directExitCode、每个文件的 actualSha256 和 exact 写入 rollback-proof.json。只有全部逐字节恢复,才运行 node scripts/apply-update.mjs workbench --reuse-rollback-point 重新应用经检查的更新。脚本也接受把 --reuse-rollback-point 放在目标目录之前,但不得省略或猜测其他参数。写清从哪里开始、读什么、改哪里、何时回退、何时停止的 HANDOFF.md 和维护清单。最后运行 npm run check:15。
把代码块整段复制,不要拆掉输入范围、停止条件和检查命令。Codex 的总结不能代替产出文件。
6. 你必须亲手完成
从统一入口依次打开六类前章成果;检查 A-13 在资料库与内容包中的表达一致;亲手执行一次回退并比较结果;最后按 HANDOFF.md 判断下一位是否能在不询问背景的情况下开始一次小更新。
人工动作为什么不能省
你要亲手打开资料、交付、记录、批处理、事故、协作、维护七类入口;再实际运行一次 rollback-update 和重新 apply。文档写“可回退”而没有真实回退,不算完成。
7. 你应该看到
- 入口的本地链接全部可达,没有链接到未采用成果。
- A-13 只改变授权的资料库、内容包和维护记录。
- 记录页 v1.1 和其他未受影响检查仍通过。
- 回退后哈希与更新前完全一致,重新应用后检查再次通过。
rollback-proof.json中四个actualSha256都等于对应的更新前哈希,且没有把未执行的回退写成成功。
跟着做:从输入到可观察结果
1. 建立统一入口
把第 5 节任务整段交给 Codex,只整合前章已通过检查且被人工采用的成果。
**你应看到:**handoff/index.html 有 17 个本地链接,未采用和待确认内容不进入主线。
2. 应用白名单更新
脚本先记录四个业务文件 before 哈希,再把 A-13 加入资料库和文字内容包。
**你应看到:**只有 index.csv、update-log.md、facts.md、one-page-summary.md 四个既有文件变化。
3. 实际回退与重放
运行 node scripts/rollback-update.mjs workbench,再运行 node scripts/apply-update.mjs workbench --reuse-rollback-point。
**你应看到:**回退逐字节等于 before;重放逐项等于第一次 after。
4. 全链检查与交接
运行 npm run check:15 和 npm run check:all,再读 HANDOFF 的五个问题。
**你应看到:**17 个链接可达,记录页回归绿色,输出 LAB_ALL_PASS: inputs + Chapters 8–15。

参考完成态:本地实跑记录
- 17 个相对链接全部解析到现有文件。
- A-13 只改变四个白名单业务文件,回退后逐字节恢复。
- 重放哈希与第一次一致,全练习检查通过;最终 ZIP 仍需从零独立复演并核对哈希。
证据文件:completed-example/handoff/index.html。这些记录只证明虚构练习在本地按规则跑通,不代表网站已发布、现实用户已使用或作者已批准。
8. 三个真实坑
坑 1:一次塞入所有扩展
更新请求只授权 A-13 和三类文件。增加新模块、字段或协作角色会被变更范围清单拦住。
坑 2:打开离线入口后就写“已经发布”
识别信号是:你只在本机打开了 handoff/index.html,却在交接里出现“发布完成、已经外发、现实用户可用”。立刻删掉这类越界结论,把状态恢复为“虚构、离线、练习”;真正发布必须另行获得作者批准并完成部署验收。
坑 3:交接责任与下一步不清
HANDOFF.md 必须回答开始、读取、写入、回退和停止五个问题。只有文件列表、没有责任边界不能通过。
这三个坑都由练习材料、代码或检查实际暴露,不是提醒语。
先看信号,再做补救
**识别信号:**有死链、超过四个既有业务文件变化、rollback 后实际哈希不等于 before,或离线练习被写成线上发布,说明维护闭环失真。**补救动作:**立即停止并保留当前哈希;只有当前文件仍匹配 after 时才运行确定性回退,逐文件比对成功后再重新应用,不能强制覆盖。
补救后仍不能让本章检查因正确原因通过,就按第 10 节停止并回退;不要手改日志或复制参考完成态绕过。
9. 复选框验收
- 统一入口的全部本地链接可达。
- A-13 只影响授权文件且前后表达一致。
- 受影响检查和记录页回归均通过。
- 回退精确恢复,重新应用后再次通过。
-
rollback-proof.json记录了真实退出码与四文件逐字节比对结果。 -
npm run check:15通过。
每一项都要靠打开文件或完成动作后再勾选;不要只凭 Codex 报告的 PASS。
10. 停止、回退与交接
入口有死链、更新越界、资料库与内容包不一致、回归失败或回退不等值时停止。使用 rollback-point.json 和 scripts/rollback-update.mjs 恢复,不靠手工猜。最终交接文件是 workbench/handoff/HANDOFF.md;本地检查或 AI 复演不能被写成另一位人类已经完成复演。
**停止条件:**入口死链、白名单外改动、A-13 两处不一致、回归失败、回退不等值、或出现现实发布声明。
**回退动作:**只有当前文件匹配 after 哈希时运行回退;不匹配时先保留现场并停止,不能强制覆盖。
**交接文件:**workbench/handoff/HANDOFF.md、index.html、维护与测试记录、回退点和回退证明。