收敛 - QA 后规格回写
关闭执行循环:通过 QA 的任务将成为活动规格的一部分。此技能代表生命周期中的 ConvergeTool 角色。它定义了流程;仓库代理规则仍拥有权限,此技能绝不授予额外访问权限。
流水线位置:dev -> qa -> 收敛 -> 归档包 + 更新规格。
使用时机
- 任务包的
03-qa-verification.md记录了已验证的QA_PASSED结果。 02-dev-workspace.md包含冻结的实现偏差表(至少一行或显式的 None 行)。- 需要将任务确认的行为回写到
.specs/02-tech-spec.md,归档包并关闭原始变更提案。
不使用时
- 实现或 QA 仍在运行,交接标记未勾选,或
REWORK_REQUIRED处于活动状态 — 请等待稳定的QA_PASSED结果。 - 偏差日志为空或缺失 — 将任务退回 Dev,不要猜测。
- 需要臆造规格内容或重写现有规格正文;这属于规划变更,而非收敛。
输入
tasks/<task-id>/01-contract.md- 标题、可追溯锚点、可选的change_id。tasks/<task-id>/02-dev-workspace.md- 实现偏差表(冻结格式)。tasks/<task-id>/03-qa-verification.md- 已验证的QA_PASSED结果和证据。tasks/<task-id>/04-process.md- 派生状态卡和事件日志。.specs/02-tech-spec.md- 活动技术规格。.specs/changes/<change-id>/proposal.md- 原始变更提案(如果存在)。
输出
- 每个任务在规格的 Converged changes 部分中增加一条带日期和属性说明的条目。
- 每个任务的收敛标记:
<!-- converged: <task-id> sha256:<hash> -->。 04-process.md中包含macro_status: "CONVERGED"和一行TASK_CONVERGED事件(执行者为ConvergeTool)。- 任务包移动到
tasks/archive/<task-id>/(绝不删除)。 - 如果存在提案,则生成
.specs/changes/<change-id>/convergence.md并将提案状态设置为archived。
检查 -> 应用 -> 验证
- 检查。 在写入任何内容前对包进行分类:
python .agents/skills/converge/scripts/converge.py check --tasks-dir ./tasks --json只有当 QA 通过、无活动返工、偏差表至少有一行或显式的 None 行、且规格尚未携带其标记时,包才准备好收敛。 - 应用。 收敛一个包:
python .agents/skills/converge/scripts/converge.py apply --task tasks/<task-id>首先使用--dry-run检查计划写入的内容。当包未准备好收敛时,该辅助工具以退出码 1 拒绝;当目标归档位置已存在时,除非指定--force否则拒绝。 - 验证。 重新运行
check,确认标记存在、04-process.md显示CONVERGED、包已归档,且--spec-sha256与预期的 CI 值匹配:python .agents/skills/converge/scripts/converge.py --spec .specs/02-tech-spec.md --spec-sha256
手动回退(无 Python)
当辅助工具不可用时,手动执行相同步骤并保持标记精确:
- 确认
03中的QA_PASSED已勾选且REWORK_REQUIRED未激活。 - 从
02读取偏差行;拒绝空白日志。 - 在规格的 Converged changes 部分追加(而非编辑)一条条目:一个
### <task-id>标题、偏差表以及<!-- converged: <task-id> sha256:<hash> -->标记。使用任何 SHA-256 工具在规范化的任务 ID 和行上计算哈希。 - 将
04中的macro_status设置为CONVERGED,并追加TASK_CONVERGED/ConvergeTool行。 - 将包移动到
tasks/archive/<task-id>/(绝不删除);如果存在变更提案,则归档提案并写入convergence.md。 - 重新运行验证步骤并记录证据。
拒绝条件
当以下任一条件成立时,停止并报告,不要收敛:
- QA 未通过 -
03中没有已验证的QA_PASSED,或REWORK_REQUIRED仍处于活动状态。 - 未解决的返工 - 重试证据显示任务处于返工中;等待新结果。
- 空白偏差日志 - 实现偏差表缺失,或没有 DEV 行且没有显式的 None 行。
- 规格漂移 -
modify/remove偏差指向规格中不存在的#sec-*锚点;规格与偏差日志不一致。在 CI 中使用--strict运行check/apply可将此警告转为拒绝。 - 归档冲突 -
tasks/archive/<task-id>/已存在且未指定--force。
结构性偏差(新模块、边界变更、新的 ADR 级别决策)必须升级到 spec-generator,绝不被静默收敛。
历史记录与归属
收敛绝不重写历史:它追加带日期和属性说明的章节,而不是编辑现有规格正文。现有条目保持字节级稳定,每个条目都标注源任务、QA 结果和 ConvergeTool 执行者。绝不编辑旧的收敛条目来适配新任务;应添加新条目并记录冲突。
参考
references/convergence-protocol.md- 状态机、谁写什么、归档布局、幂等标记、冲突规则和结构性升级。- 角色边界:
references/role-boundaries.md— 写入范围、不变量和诚实执行模型(捆绑;无需外部文件)。 - 任务包格式和角色生命周期:
task-decomposition技能(如果已安装)。 - 交接输入:
dev技能;结果输入:qa技能。 - 仓库规则:如果采用项目定义了
AGENTS.md或任何角色规则文件,请阅读它们;它们可能增加要求,但此技能不强制需要。
诚实限制
此技能不授予写入权限,也无法强制角色隔离。如果仓库具有 CI(例如基于 git 的角色审计)或分支保护,则那是权威层。捆绑的辅助工具是一个可选的确定性助手;标记和书面证据是契约。