Why: make requirements, experiments and implementation revisions reviewable while retaining bounded continuous authorization. Evidence: task-card SELF receipts include expected red regressions and 104 passing governance checks; full candidate verification follows. Impact: add project delivery policy and generated task fields; make post-merge reminders read-only. Refs: .task/feature-iterative-delivery.md; policy/delivery.md
6.1 KiB
开发门禁的执行与证据
本文件细化根 AGENTS.md 的启动、验证和回收规则。通用语义以固定的
deps/development-guidelines 为准;门禁实现及回归用例随本仓版本管理。
需求表、设计试验、迭代调整、阶段产物与人工评审按 迭代交付 执行。
任务卡记录批准来源与对象版本;本地 evidence 仅记录命令,不能证明人工批准。
启动与恢复
从当前检出运行一次启动检查,使用每次唯一、仓外的绝对收据路径:
RECEIPT=/tmp/my-task-precheck.json CMD="make precheck" make evidence
make task-start NAME=feature/my-task PRECHECK_RECEIPT=/tmp/my-task-precheck.json
第一步先捕获原始执行,再创建任务卡;收据保存完整脱敏输出、退出码、执行位置和对象。 第二步核验收据与当前仓库/基线,再创建工作区并导入;不靠事后重跑冒充首次检查。 同一收据不可覆盖。首次检查失败时处理原因,使用新路径重新启动。主干在两步间前进时, 重新确认新的启动基线,不能把旧收据移花接木到新对象。
恢复已有任务仍先捕获本次启动检查,再在原任务工作区用
IMPORT_RECEIPT=/tmp/my-task-resume.json make evidence 导入;不重新建分支。
工作区忙或落后时先由 owner 保存现场并同步;远端不可达时只继续不依赖新鲜基线的阅读和分析。
堆叠任务使用 PARENT=feature/parent PARENT_PR=<父PR链接>。父分支须包含本批主干 R0;
卡片同时记录父分支、父 SHA 和父 PR。父先合入,子同步最新 main 并改回 main 为 PR base。
被测对象
make task-sync 在父仓合并后按固定 gitlink 物化未修改组件,并核对实际组件工作树。
组件 feature 分支若与新指针不同,先保留其分支,交给 owner 显式同步并更新组合;
不能用自动 checkout 丢弃组件分支现场。任何失败都保留现场并阻止同步成功声明。
make test-worktree 核对递归子模块:未初始化、冲突、指针漂移及子仓未保存改动均拒绝。
它是组合测试和构建的前置检查。父仓未提交改动可以局部测试,但证据必须记录实际对象状态;
正式验收使用已提交的固定对象,不能仅写一个与工作树不同的 HEAD。
本地记录与独立证据
本地 make evidence 一律生成 SELF。SRC=GATE/REPLAY 不可把本地执行升级为权威来源。
GATE 引用受信平台的运行链接、执行身份、完整 SHA 和结果;REPLAY 引用独立审阅者的
环境、命令、对象和结果。审核者核验这些来源,不能只读作者填入的标签。
收据中的摘要检测损坏,不是签名或身份凭据。保存的是完整脱敏输出及其 SHA-256; 命令含敏感值时展示脱敏形式,并记录原命令摘要。执行前后对象分别记录;命令改变 HEAD 时不把执行前 SHA 冒充执行后对象。不能读取执行后状态时明确记录缺项。
凭据从环境或受保护文件引用,避免出现在命令字面量。脱敏是补充防护,不是允许输出秘密。 执行脚本不通过 shell tracing 暴露环境;管道任何一段失败应传回非零退出码。 工具写入失败本身也必须报错,不能只保留一个看似成功的退出状态。
回收
仅在登记的任务 worktree 根目录回收。owner 先确认全部写者已退出、任务成果与证据已保存,
以 TASK_WRITERS_STOPPED=1 make task-finish 明确确认;
脚本检查主检出/子目录误用、Git 操作和锁、父子仓修改及未跟踪/ignored 文件;
子模块另有登记 worktree 时拒绝回收,避免删除其他检出依赖的 Git 管理目录。
可再生缓存由 owner 按已识别路径单独处置;无法确认用途的文件保留。
任务合入需以本次成功获取的权威目标验证。合入提交不能证明未提交文件已经落盘。
Git 对含子模块的工作区需要显式删除选项时,只有全部现场检查通过才允许该路径;
它不豁免任何脏状态、忽略文件、独有提交/引用或锁检查。普通删除失败不转入强删兜底。
保留无法确认安全的目录和分支,输出下一步处理依据。
子仓 pin 之外的 refs/stash/reflog 历史采取保守拒绝,即使其中部分可能已在远端:
owner 须先独立确认其保存与归属,工具不把缓存的远端引用当作唯一数据已经备份的证据。
远端分支删除与本地回收分别报告,失败不能声明两者全部完成。
回收后由所有者执行 make task-close 闭合卡片;回收命令不顺带改写共享主检出。
post-merge 仅提示,不自动调用闭合。make task-close 会提交、推送并可能创建 PR,
执行者先按迭代交付规则核对该动作的授权及所选任务,保留未授权的其他任务现场。
回收命令使用待删目录之外的 RECEIPT 保存输出,清理结果由后续闭合记录引用。
CI 凭据边界
候选代码执行前结束有凭据的源码获取阶段。获取只访问受信主机及登记的组件仓, 不根据候选提供的任意 URL 携带 token;认证配置限单次进程,不写全局 Git 配置或 remote URL。 测试/构建阶段检查配置中不存在凭据,并使用不含 checkout token 的环境。
仓内测试只能证明脚本边界。runner 隔离、token 权限、工作流来源和平台分支保护 由平台维护者验证;没有对应 GATE/REPLAY 时标未验证,不由本地测试推断。
持续回归
make test-governance 在临时真实 Git 仓库中覆盖回收、组件同步、离线启动、收据捕获/导入、
管道失败、假凭据脱敏、写路径及 CI 凭据隔离;临时 remote 均为本地路径,禁止使用真实秘密。
它纳入 make test,新机制必须有正常、拒绝和故障分支。历史临时测试记录仅作定位线索。
普通文档核对真实入口和相对链接;规范升级检查条文、命令、模板与能力矩阵是否一致。 机制未变可按固定版本复用证据,变更的机制重新运行对应负例。