关于 fold-findings
fold-findings 是用于处理 review-change 或 audit-pr 持久化 fix-now 发现项的 Agent 技能。它保留各项分类,要求验证修复并进行原子提交,同时逐项报告结果。
主要功能
- 01处理持久化发现项清单
- 02按根因分组发现项
- 03修复时保留原有分类
- 04运行验证门禁
- 05原子提交并推送修复批次
- 06逐项报告处理结果
适用场景
- 01修复 audit-pr 判定中的阻塞项
- 02处理 review-change 后的 fix-now 条目
- 03保留分类并追踪修复状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ gtrabanco/ agentic-workflow --skill fold-findings安装后在 Claude Code 中输入/fold-findings确认已加载。
附带文件references/FOLD_POLICY.mdreferences/FOLD_PROCESS.md
详细介绍
合并问题发现
修复已持久化的立即修复问题发现。review-change 和 audit-pr 负责分类;此技能会修复每个根本原因,绝不会重新标记、延期或弱化检查。
回合约定——结束回合前验证
✓ 1. Every finding taken up this turn produced its fixed per-finding output
line (FOLDED <sha> | DISPUTED <reason> | BLOCKED <missing input> |
REPLAN <proposed phase(s)>) — no finding silently skipped.
✓ 2. For each FOLDED batch: the gate was RUN (not assumed) and green, one
atomic commit was RUN with its sha pasted, and (if the branch has an open PR)
`git push` was RUN immediately after that commit.
✓ 3. The ledger row for each FOLDED finding was flipped `folded: no → yes`
in the same commit — never a bare code fix with the ledger left stale.
✓ 4. No finding was reclassified: no severity downgrade, no fix-now →
non-fix-now, no "actually this is fine" — a genuine objection produced
`DISPUTED` with evidence for a user decision, never a silent drop/issue.
✓ 5. The closing `Folded: n/m · Disputed: k · Blocked: j[ · Replan: r]` tally
and outcome-branched `→ Next:` block are printed as the ABSOLUTE last output.
Every affected finding ID is named in that block, joined with ` + `.
任何未勾选的框都表示回合尚未完成。
使用时机
当 /review-change 报告 REVIEW-FAIL 且包含立即修复条目,或 /audit-pr 报告 VERDICT: BLOCKED(每个阻塞项都属于立即修复)时使用。如果台账缺失或不完整,请在步骤 0 中根据判定结果重建条目。绝不处理 postpone/wontfix/promote/documented-tradeoff 条目;这些应由 /triage-issue 处理。
步骤 0——发现项目(始终先执行)
按照工作流约定,阅读:
-
单元目录
docs/features/<NN>-<slug>/或docs/fix/<n>-<topic>/下的review-findings.md;其架构由review-change/audit-pr维护:| id | file:line | axis | severity | class | route | folded |VERDICT: BLOCKED后,补充缺失条目(class: fix-now、folded: no、使用下一个空闲的Fn、按file:line+axis 去重),提交为docs(<unit>): reconstruct fold ledger from audit-pr blockers,然后合并修复;绝不报告“没有问题发现”。 -
排入
folded: no条目;指定 ID 时仅处理指定条目,其余条目保持不变。按根本原因、验证器和回滚边界分组。 -
项目的验证门禁和 forge CLI(使用已声明的 forge)。
-
分支是否存在未关闭的 PR;这决定提交后是否立即推送。
渐进式加载——合并修复队列
允许列表恰好包含以下两个路径;修改代码或台账前,必须按顺序阅读两者:
两者均为规范性文件,且距本文仅一跳。资源缺失 → 停止;绝不推断分类或合并修复流程。
报告 — 严格按此结构输出(固定输出契约)
对每项发现,按处理顺序:
| <finding-id> | verdict: FOLDED <sha> | DISPUTED <reason → user decision> | BLOCKED <missing input> | REPLAN <proposed phase(s) → /execute-phase> |
然后严格输出:
Folded: n/m · Disputed: k · Blocked: j · Replan: r
当 r = 0 时省略 · Replan: r(保留现有的三字段格式)。
然后将 REPAIR-RECEIPT 与下方的分支 → Next: 块一起作为绝对最后的输出。收据一经打印即不可变;后续折叠会打印一张新收据(仅追加的输出历史 — 不增加账本行,也不增加架构字段)。始终包含六个字段:
## REPAIR-RECEIPT
- Repaired: <F-ids with (VF-<n>) refs, joined ` + `, or `none`>
- Refuted/open: <F-ids joined ` + `, or `none`>
- Gate: <command> → exit <n> at head <40-hex sha> · n/a when nothing was folded
- Batch class: <all-repair-in-place | frozen (replan present) | frozen (product owner present) | none>
- Fold diff: <shortstat from a real `git diff` run> · none when nothing was folded
- Branch: <RE-REVIEW-REQUIRED (delta) | RE-REVIEW-OPTIONAL | RE-REVIEW-SKIPPED | REPLAN-ROUTE | PRODUCT-ROUTE>
Gate行记录运行门禁时所在提交上观察到的实际退出码 — 无论通过还是失败。门禁失败也绝不会让收据消失:批次需连同观察到的退出码一起报告,且不折叠任何内容(红色门禁不能形成无声缺口)。Fold diff简短统计来自对批次提交实际运行的git diff。Batch class仅根据所取队列的冻结行得出 — 折叠绝不重新分类(all-repair-in-place、frozen (replan present)、frozen (product owner present)或空队列时的none);分类词汇来自review-implementation的封闭类别集合。
冻结批次(存在 replan)。 当所取队列包含任何冻结类别为 replan-in-unit 或 decision-required 的行时,不进行任何折叠:不将 folded: yes 翻转为其他值,不创建提交。收据记录 REPLAN-ROUTE 分支和每个保留(未折叠)行的 ID,并停止循环。后续执行依据的是已运行的路由器打印出的结论,而不是调用本身:对于 route: replan,执行它打印出的规划器命令 — 功能单元使用 /unit-lane <slug>,修复单元使用 /unit-lane --fix <n>;对于 route: decision,停止并向用户说明该决策,绝不调用规划器。<unit> 可以是纯文件夹编号,也可以是完整 slug(两者都能解析)。调用 node scripts/unit-route.mjs <unit> 是折叠过程中已运行的发现步骤,绝不是建议操作。
冻结批次(存在产品负责人)。 任何所取的 fix-now 行,只要其 Route 单元格以 product owner、product-owned 或 owned by product 开头(锚定于行首,与 scripts/unit-route.mjs 的 PRODUCT_ROUTE 正则表达式一致,依据 #293),也会冻结批次 —
不进行任何折叠、不将 folded: yes 翻转为其他值、不创建提交:折叠循环修复的是源代码,不是决策权(pre-execution-review POLICY §4,#293)。收据记录 PRODUCT-ROUTE 分支和保留行的 ID;后续执行依据的是路由器打印出的 route: product 通道移交。完整条件和移交表见:FOLD_PROCESS.md §批次分类。
护栏
范围限于账本(或明确指定的 ID 子集);未列出的发现属于待用户分流的提案。只有当同一个根因修正、验证器集合和回滚边界都覆盖这些行时,才将其合并为一个批次:一个提交/推送,各自更新刻度/行。否则拆分。
修复涵盖变更本身及所有依赖它的内容。 当某个部分接收的内容发生变化时,查找其调用方;当它交付的内容发生变化时,查找其使用方;当某项内容被移除时,检查还有什么在使用它,并在破坏兼容性之前先询问。任何仍提及已变更内容的残留内容 — 注释、说明性文字中的主张、已声明的验证器、清单中的描述、表达相同内容的相邻界面 — 都属于同一次折叠,绝不能留作下一轮的发现。只有在不再有任何内容断言已不真实的内容时,折叠才算结束;在提交中说明本次修正扫过了哪些界面。产物语言遵循:用户指示 > 项目文档语言 > 英语;对话语言不影响判断。
可移植性(Claude Code 以外的 Agent)
当某项基础功能缺失时,使用明确的回退方案:在全新上下文中打开指定的 SKILL.md 文件;处理细微逻辑/安全问题时使用能力最强的模型,且绝不弱于作者所用模型;对兼容的队列处理一次,并且只在出现新的审查证据后才重新运行。
与其他技能的关系
review-change ──FAIL──┐
audit-pr ──BLOCKED─────┼──▶ fold-findings ──FOLDED──▶ re-run review-change / audit-pr
│ ──DISPUTED─▶ user decision
│ ──BLOCKED──▶ user supplies missing input
review-change/audit-pr 负责分类并持久化;
ledger-ownership@1 / fold-findings:folded-flag 是唯一能将
folded: no → yes 翻转的主体——此技能只会在确实修复后翻转该标志。execute-phase 中嵌入的折叠检查清单
是内联回退方案;此独立路径保留冻结的分类及其禁用列表,且绝不超出其层级运行。DISPUTED 会暂停并要求用户提供证据;
不会创建问题。
完成条件
每条排队的发现项都有各自的判定和统计;每条 FOLDED
发现项都属于一个已推送的原子批次,并且其行已勾选。队列之外的内容不得重新分类或触碰。
→ Next: (branches on outcome; list every affected finding ID once as `F1 + F2 + …`)
· all FOLDED (<F1> + <F2> + …) → /review-change — re-review the branch now that all listed findings are fixed
· any DISPUTED (<F1> + <F2> + …) → user decision — resolve every evidenced dispute without creating backlog
· any BLOCKED (<F1> + <F2> + …) → supply the listed missing inputs, then re-run /fold-findings
· any REPLAN (<F1> + <F2> + …) → /unit-lane <slug> or /unit-lane --fix <n> — the lane re-runs its plan step, appends the phases to the unit's SPEC; its review step gates before /execute-phase on this unit
· any DECISION (<F1> + <F2> + …) → stop and surface the decision to the user — a `route: decision` conclusion names no planner, so the unit waits on the user before any plan or code change
· any PRODUCT (<F1> + <F2> + …) → /unit-lane <slug> or /unit-lane --fix <n> — the lane repairs the half, its review step re-judges it
每个 · 子弹项必须恰好占据一个物理行——绝不能硬换行成多行,也不能合并为一行正文。
打印前,将占位符替换为所有实际受影响的发现项 ID;在实时交接中,绝不能打印 <F2>、… 或仅打印一个代表性 ID。以相同方式解析 /unit-lane <slug> / /unit-lane --fix <n> 单元参数——绝不能在实时交接中保留 <slug> 或 <n>。
收尾块决策分支(输出时选择一个)
收尾块恰好选择五种结果之一。只要本轮没有记录的先前消费者决策要求跳过,就适用无决策 → 默认重新审核规则。
| 批次状态 | 分支 | → Next:(消费者) |
|---|---|---|
| 冻结批次(≥ 1 条产品归属行) | PRODUCT-ROUTE | 路由器判定为 product 时使用 /unit-lane <slug>(功能)或 /unit-lane --fix <n>(修复)——该通道通过其 design 步骤修复这一半,再由其 review 步骤重新判定;结论由 node scripts/unit-route.mjs <unit> 打印(发现步骤已由折叠流程运行) |
| 冻结批次(≥ 1 条重规划类行) | REPLAN-ROUTE | 路由器判定为 replan 时使用 /unit-lane <slug>(功能)或 /unit-lane --fix <n>(修复)——用户确认后,该通道的 plan 步骤追加阶段,其 review 步骤把关,然后对此单元运行 /execute-phase;遇到 route: decision 时停止并向用户说明决策——结论由 node scripts/unit-route.mjs <unit> 打印(发现步骤已由折叠流程运行) |
all-repair-in-place + 仅文档 + 没有折叠行的严重性为 high + 先前消费者决定跳过 | RE-REVIEW-SKIPPED | 跳过——消费者已明确决定跳过重新审核 |
all-repair-in-place + 仅文档 + 没有折叠行的严重性为 high | RE-REVIEW-OPTIONAL | /review-change(默认,差异模式)——或消费者记录的跳过决定 |
空批次(类别 none) | RE-REVIEW-OPTIONAL | 默认运行 /review-change——安全:HEAD 未改变 |
其他情况(行为表面或任何折叠行的严重性为 high) | RE-REVIEW-REQUIRED (delta) | /review-change——差异模式为强制默认值 |
分支选择决策输入。
- 仅文档测试(E-D3)。
RE-REVIEW-OPTIONAL要求每个折叠差异文件都是 Markdown/文档文件;否则该批次属于行为变更 (→RE-REVIEW-REQUIRED (delta))。 - 冻结严重性为
high的覆盖规则。 若某条折叠行的冻结严重性为high,即使差异仅涉及文档,也必须使用RE-REVIEW-REQUIRED (delta)。绝不编辑冻结字段来进入某个分支。 - SKIPPED 要求先前消费者决策(E-D2)。 只有本轮携带明确的先前消费者跳过决定时,才会打印
RE-REVIEW-SKIPPED。 没有记录先前消费者决策的轮次会打印RE-REVIEW-OPTIONAL+ 重新审核默认值,绝不会打印RE-REVIEW-SKIPPED。