工程工作流
状态:已实现
最后复核:2026-08-15
长期讨论:GitHub Discussions
工作契约
- **Milestone(里程碑)**是阶段目标和进度容器。
- Issue 是唯一任务契约,其可观察验收标准约束实现和 QA。
- 一个内聚 outcome 对应一个 Codex 任务:一个 Issue、一个
issue/<number>-<slug>分支、一个仓库外 worktree 和一个 PR。 - 每个实现只有一个 tracked-file 写入者。负责统筹的工程 Agent 只承担治理与协调;每个 Issue 都在独立 worktree 任务中实现。
当 Issue 的 outcome、范围、可观察验收标准、验证命令、安全或风险约束和依赖均已明确,必要决策已解决,且规模足以由一个内聚 PR 完成时,Issue 才是 Ready。
角色
- Implementer(实现者): 唯一写入者。每个代码任务都必须在实现全程使用已安装的
ponytail:ponytailskillfull模式。Implementer 负责自检、发布 Issue 分支、维护 Draft PR、修复 finding,并在冻结最终 SHA 前完成文档影响扫描。 - Reviewer(审查者): 在同一最终 SHA 上执行只读审查。先审查正确性、架构、安全、回归风险、测试缺口、文档语言与实现/测试/图表的语义一致性,并单独报告 Documentation Consistency Review;涉及订单、风控或状态时,必须检查资金安全、fail-closed、恢复、对账和审计语义。随后运行已安装的
ponytail:ponytail-reviewskill 查找不必要复杂度。Ponytail 绝不替代标准审查。Reviewer 不修复文件,并分别报告结果。 - QA(质量验收): 不运行 Ponytail。QA 使用真实命令,依据 Issue 的可观察验收标准验证精确的最终 head SHA,并报告 SHA、环境、命令、结果和未验证项;同时确认本次范围内面向人的文档以简体中文为主。QA 必须构建文档 HTML 并人工检查目录、关键页面和图表渲染;涉及资金或交易状态时,还必须验证 fail-closed、恢复、对账和审计的可观察验收标准。QA 可以生成已忽略的构建产物,但绝不编辑源码、测试、配置、文档或其他 tracked file。
- 用户: 唯一 merge authority(合并权威)。
Reviewer 和 QA 的 finding 都返回 Implementer。subagent 审查是证据,不等于 GitHub required approval;使用同一 GitHub 身份的 Agent 绝不伪装成独立审批者。
PR 流程
- 创建 Issue,fetch
origin/main,并在仓库外 worktree 中创建对应分支。 - 首次 push 后,默认创建目标为
main的 Draft PR,并写入Closes #<number>。只有 Issue 明确记录依赖关系且用户授权 stacked workflow 时,分支才可从依赖 PR 的冻结 head 创建,并以依赖分支为临时 PR base;PR 正文必须标明依赖 PR 和后续 retarget 计划。 - Implementer 完成 Issue 验收标准、运行仓库检查、更新 PR 证据并冻结 head SHA。
- Implementer 按
DOCUMENTATION_POLICY.md阅读相对 PR base 的完整 diff,更新背离的正文/图表,运行文档校验、测试和构建,并在 PR 记录Documentation Impact与证据。 - Reviewer 针对该 head SHA 与当前 PR base 的 merge-base(审查 fixed point)先运行标准审查及 Documentation Consistency Review,再运行
ponytail:ponytail-review,并记录 base 名称、base SHA、merge-base 与 head SHA,全程不编辑文件。 - Implementer 修复 finding、重跑检查、push 新 SHA,并要求 Reviewer 重跑受影响的审查。
- QA 验证最终 SHA,并确认验证前后 tracked diff 不变。
- 只有 Standard Review、Ponytail Review(改动代码或工具时)、Documentation Consistency Review、QA 和适用的 docs CI 在同一最终 SHA 上全部
PASS后,PR 才能从 Draft 转为 Ready for review。 - 由用户决定是否 merge。
任何新 commit 都会使之前的最终 SHA 证据失效,并触发受影响的 Reviewer 与 QA 步骤重跑。
Stacked PR 的依赖 PR 合并后,Implementer 必须先 fetch origin/main,确认新 main 已包含依赖 PR 的预期结果,再用安全 rebase 或等价的无损方式把当前分支更新到新 base,并将 PR base retarget 为 main。base、merge-base 或 head 的任何变化都会使既有 diff、Review 与 QA 证据失效,必须按新的 fixed point 重跑检查;不得通过丢弃提交或覆盖他人改动来迁移 base。
仅在 Milestone 或阶段结束时使用 ponytail:ponytail-audit。只有存在 ponytail: 标记时,才在阶段结束或发布前运行 ponytail:ponytail-debt。ponytail:ponytail-gain 与 ponytail:ponytail-help 仅手动使用,绝不作为 merge 门禁。
授权与安全
明确分配的 Issue 实现任务授权创建对应 Issue 分支/worktree、commit 和 push 该分支,以及创建或更新匹配的 PR;它绝不授权直接 push main 或 merge。产品目标包含真实资金交易,但任何真实下单仍始终需要未来专门 Issue 的风险门禁、验收证据和用户新的明确授权;未知或不安全的交易状态继续采用 fail-closed。
合并与清理
只使用 squash merge。目标为默认分支的 PR 合并后,通过 Closes #<number> 关闭对应 Issue;随后由 GitHub 删除远端 head branch。确认合并后,再删除本地 worktree 和本地 Issue 分支。
首个真实 Rust target 出现前,不得添加空洞或伪造的 Rust CI。文档站已经具有真实可验证的构建目标,因此允许运行唯一命名的 docs job;Rust 格式化、Clippy 和测试仍须等对应 target 存在后再启用。
当前仓库已迁移至 caasxyz 组织私有仓库,并启用 Protect main ruleset;该 ruleset 目前只要求经 PR 合并并禁止删除与 non-fast-forward,尚未把 docs 配置为 required status check。因此 docs 仍通过用户 merge discipline(合并纪律)、PR 检查结果和最终 SHA 审查证据执行门禁,不得声称平台已经强制。只有通过独立 Issue 配置并验证 required check 后,文档才可改为平台强制状态;首个真实 Rust target 出现且唯一命名的 ci job 成功前,仍不得添加 Rust required check。