# 上下文治理契约 更新时间:2026-08-19(America/New_York) 本契约解决两个问题:执行者不需要读完整路线图就能继续工作;任何任务卡、交接状态或机器索引 变大、漂移或重复指针时,自动门禁会在领取前失败。它是执行规则,不是项目进度表。 ## 一、事实分层 每个问题只由一个层级回答,层级之间不互相复制内容: | 层级 | 唯一职责 | 默认是否读取 | | --- | --- | --- | | `EXECUTION_QUEUE.md` | 当前 task、parent manifest、专项命令、全局硬规则 | 是 | | `tasks/.md` | 一个行为或一个证据变化的输入、边界、验收和回滚 | 是 | | `tests/golden//manifest.json` | parent 状态、artifact hash、运行时、`nextTask` | 是 | | `docs/status/.md` | 上一项最小证据摘要和已知风险 | 是 | | 协议/生产/测试文件 | 任务卡点名的实现事实 | 按需 | | 长期计划、全量 ledger、历史 status | 背景、审计、归档 | 禁止默认读取 | 冲突优先级固定为:真实命令输出 > manifest/evidence > 任务卡 > 队列文字 > 长期规划和历史日志。 Markdown checkbox 不能覆盖失败命令或 hash 漂移。 ## 二、硬预算 预算按 UTF-8 bytes 检查,token 用 `ceil(bytes / 4)` 作保守估算。超过任一单项或总预算都不能领取。 | 输入 | 上限 | 约束 | | --- | ---: | --- | | 队列 | 4 KiB | 只保留一个当前指针,不保留历史任务表 | | 任务卡 | 8 KiB | 最多 12 个输入路径、8 条命令;不复制日志 | | parent manifest | 24 KiB | 只记录必要 artifact,最多 32 项 | | parent status | 6 KiB | 只保留命令、退出码、关键结果、风险和回滚 | | 四份输入合计 | 3,500 tokens | 由 `contextSizeReport` 和治理门同时检查 | | catalog 单行 | 2 KiB | 机器随机读取;执行者不得通读 catalog | 生成阶段的证据读取清单另外受 `maxFiles=12`、`evidenceBytes=8 KiB` 和基础文档扣除后的剩余上下文空间约束。 每个未选路径必须有 `inputSelection.excluded[].reason`,因此校验器不会成为首次发现超大上下文的地方。 全量 `next-task-plan.json`、parity map 和 gap audit 是生成器输入,不是执行上下文。索引保存源 hash 和 catalog offset;源 hash、catalog hash 或 offset 损坏时必须重新生成,不能回退读取大计划。 ## 三、原子任务粒度 默认“一项任务 = 一个可观察行为或一项独立证据”。以下任一情况出现就拆任务: - 同时改变 schema、生产消费、浏览器接线和发布证据; - 需要两个互不依赖的 fixture 或两个不同 owner family; - 正例、取消/重复/超限负例无法在同一 focused command 中清楚断言; - 任务卡需要列出超过 12 个输入或超过 8 条命令; - 任何一项失败会让另一项仍可安全交付。 复杂能力按适用门拆分,门之间通过 parent manifest 串联: | 门 | 只交付一件事 | 失败状态 | | --- | --- | --- | | C 契约 | schema、稳定 ID、预算、错误边界和 revision 规则 | `in_progress` | | P 生产 | Main/Worker/App/viewport 的真实消费路径 | `in_progress` | | N 负例 | 非法、重复、取消、迟到、超限不改变已提交状态 | `in_progress` | | B 浏览器 | Chromium 真实用户路径和可见结果 | `blocked` 或 `in_progress` | | R 资源 | dispose、重启、save/reopen、OPFS/GPU/内存归零 | `in_progress` | | E 证据 | focused command、报告、hash manifest、status、回滚 | 通过后才允许下一个 task | M16 及后续 gap 固定为一 gap 一个 task:最小 fixture、desktop/WASM 对比、save/reopen、负例和 manifest 证据必须属于该 gap;不要把“完成整个 family”写成一张卡。 ## 四、执行生命周期 ### 领取 ```bash npm --prefix web run test:context-governance node tools/web/print-task-context.mjs node tools/web/check-task-context.mjs ``` 只读取打印结果列出的四份文件和任务卡点名的最小实现入口。当前 task 必须等于 parent manifest 的 `nextTask`;不能从旧 Markdown 编号、完整 plan 或 status 列表推导任务。 ### 实施 先确认最小 fixture 和生产入口,再写 focused test/checker。每条验收命令都必须真实运行并记录 退出码;协议或测试文件存在不等于生产能力完成。浏览器、CI、验收和发布证据永久仅限 Chromium。 ### 成功交接 ```bash node tools/web/check-task-context.mjs --task --write node tools/web/check-context-governance.mjs ``` 只提交本任务的实现/测试、fixture、报告、manifest、status 和 `task-context.json`。manifest 必须 绑定所有产物的 SHA-256,并且 `nextTask` 是唯一的下一指针;长日志留在构件目录,不复制进 status。 ### 失败、阻断和恢复 命令失败、环境缺失、取消、超限、重复、迟到结果或 hash 漂移时保持 `in_progress` 或 `blocked`, 不得写成功报告、修改 Main revision 或推进 `nextTask`。修复后从同一 parent 重新运行;不要覆盖 parent 证据。任务卡、索引或队列指针不一致时先修复生成证据,再继续实现。 ## 五、提交前门禁 提交前至少运行: ```bash npm --prefix web run test:context-governance node tools/web/check-task-index.mjs node tools/web/check-task-context.mjs git diff --check ``` `check-context-governance` 会检查四份文档预算、任务卡必备章节和失败边界、禁止的长文档引用、 manifest 路径/构件数量、catalog 行边界以及唯一活动 task。门禁失败即停止,不通过手工删除输出 或修改 `nextTask` 绕过。 ## 六、维护规则 - 新增任务:先更新机器源并运行 `generate-task-index.mjs`,再用 `generate-task-card.mjs --task` 生成短卡;禁止手写 catalog offset。 - 完成任务:先写 manifest/status,再用 `check-task-context --write` 生成交接上下文;队列只跟随新 manifest。 - 规则变化:只修改本契约、`CONTEXT_BUDGET.md`、模板和治理测试;长期规划只增加链接,不复制规则。 - 发现重复或过大的历史文档:标记为背景/归档并从默认入口移除,不在任务卡中粘贴摘要。