Skip to content

Commit 7929d53

Browse files
authored
feat(skills): fix-now override checks, replan-in-unit route, fold-findings blocker reconstruction (#104)
## What Closes the classification escape hatches in the review flow and makes `fold-findings` able to repair `audit-pr` blockers even when the ledger is missing. ### `review-implementation` 1.2.0 (minor) - **Fix-now override checks** — mandatory before assigning any non-fix-now class: - *Cheap-fix check*: a fix that is a few low-risk lines (annotation, rename, guard clause) costs less than tracking an issue → always **fix-now**. - *In-scope check*: a defect inside the governing SPEC's scope is the branch's own unfinished work → always **fix-now**; postpone/known-issue/tradeoff unavailable. - **`replan-in-unit` route** — a too-large in-scope fix-now keeps its class (size never downgrades); it routes to user-confirmed new phase(s) in the unit's SPEC `## Phases` ledger — before the final `Hardening & PR` phase if it has not run yet; after it plus a fresh final `Hardening & PR` phase if it already ran — executed on the same branch. - Don't-deflate guardrail mirroring the existing don't-inflate one. ### `review-change` 2.5.0 (minor) - Routing states the override checks and the `replan-in-unit` route. - `Decision: FAIL` `→ Next:` block gains a conditional replan sub-bullet. ### `fold-findings` 1.1.0 (minor) - **Ledger reconstruction**: invoked after an `audit-pr` `VERDICT: BLOCKED` with the ledger absent or missing blockers, it appends the missing rows from the verdict itself and proceeds — ending with "no findings" while blockers are listed is now a contract violation. - **`REPLAN` verdict** for `replan-in-unit` rows (and any finding whose smallest correct fix proves too large for one commit): never implemented inline, never downgraded — hand-off to confirmed SPEC phase(s) + `execute-phase` on the same branch. Tally gains optional `· Replan: r` (omitted when 0, keeping the existing 3-field format for current consumers). ## Why Observed behavior: findings that are trivially cheap or squarely in the unit's scope were escaping as tradeoff/known-issue/postpone, and `fold-findings` reported "no findings" after an `audit-pr` BLOCKED when the ledger rows weren't persisted. ## Docs - CHANGELOG.md / CHANGELOG.es.md rows + release-log bullet (EN+ES in the same change). - README.md / README.es.md skill-table cells updated for both user-facing skills. ## Verification - `npx skills add . --list` discovers all skills. - bump-skill lint: `→ Next:` blocks, Portability, Turn contract present; no stray `S1`/"Step N" phase labels. - Note: per CLAUDE.md, a golden-fixture smoke test (weakest fleet model) is recommended for these executor-path review skills before relying on them from weak models. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
2 parents 789f1c3 + 9e4a640 commit 7929d53

7 files changed

Lines changed: 150 additions & 19 deletions

File tree

CHANGELOG.es.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ Cómo funciona el pinning realmente, **verificado** contra el CLI `skills`:
229229
#### `review-change`
230230
| Versión | Fecha | Tipo | Qué cambió |
231231
|---|---|---|---|
232+
| 2.5.0 | 2026-07-19 | menor | El Routing ahora enuncia las comprobaciones de anulación hacia fix-now de `review-implementation` 1.2.0 (arreglo barato / defecto dentro de alcance → siempre fix-now, nunca un escape a postpone/known-issue/tradeoff) y añade la ruta `replan-in-unit` para un fix-now dentro de alcance demasiado grande (conserva su clase fix-now + su fila en el ledger; el usuario confirma las nuevas fase(s) del SPEC y `execute-phase` en la misma rama lo pliega); el bloque `→ Next:` de `Decision: FAIL` gana el sub-punto condicional correspondiente. |
232233
| 2.4.1 | 2026-07-18 | parche | Fix #77: reformula las dos referencias cruzadas a la cadencia de `execute-phase` ("When to use" y "Relationship to other skills") desde el intervalo retirado de cada 2 fases hacia la nueva cadencia basada en disparadores (límite de capa/acumulación/sensibilidad); la sección adversarial "Cadence — once per unit" y su nota de límite con `#77` no cambian. |
233234
| 2.4.0 | 2026-07-18 | menor | Fix #76: hace que `--adversarial N` sea usable por flotas de modelos débiles orquestadas a mano — checklist de recomendación de 4 casillas (sustituye el disparador L/sensible únicamente, añade una condición "revisor no es el más fuerte/es más débil que el autor" expuesta como línea de informe, nunca auto-detectada), escalera fija de N (2 por defecto, 3 en seguridad/familia única, >3 desaconsejado), roles de revisor asignados por índice (R1 corrección, R2 seguridad, R3 cobertura de SPEC) con la guarda de rol-como-prioridad-no-alcance, contratos de revisor/merge de fuente única, un nuevo modo de fusión `--merge` con lista de prohibiciones, plantillas de bloques para pegar en Portability, y un ancla de cadencia una-vez-por-unidad (límite explícito con `#77`). |
234235
| 2.3.0 | 2026-07-17 | menor | Fix #65: el bloque `→ Next:` de `Decision: FAIL` ahora recomienda la nueva skill independiente `/fold-findings` (clasificación congelada, lista de prohibiciones que cierra las válvulas de escape de volcado-a-known-issues/downgrade/aflojar-tests/supresión) como la vía de fold, en lugar de la línea de prosa inline "fold the fix-now findings"; la forma fija multilínea y los sub-bullets de `/audit-pr`/no-fix-now/product-audit no cambian. |
@@ -257,6 +258,7 @@ Cómo funciona el pinning realmente, **verificado** contra el CLI `skills`:
257258
#### `fold-findings`
258259
| Versión | Fecha | Tipo | Qué cambió |
259260
|---|---|---|---|
261+
| 1.1.0 | 2026-07-19 | menor | Dos adiciones: (1) **reconstrucción del ledger** — invocada tras un `VERDICT: BLOCKED` de `audit-pr` con el ledger ausente o sin filas para algún blocker, la skill añade ella misma las filas que faltan a partir del propio veredicto (esquema fijo, `class: fix-now`, dedupe por `file:line`+eje, con commit) y continúa; terminar con "no hay hallazgos" mientras un veredicto BLOCKED lista blockers es una violación del contrato. (2) Nuevo veredicto por hallazgo **`REPLAN`** para filas `replan-in-unit` (y cualquier hallazgo cuyo arreglo mínimo correcto resulte demasiado grande para plegarse en un commit): nunca se implementa en línea ni se degrada — se traspasa a fase(s) del SPEC confirmadas por el usuario + `execute-phase` en la misma rama; el total gana un campo opcional `· Replan: r` (omitido cuando es 0). |
260262
| 1.0.0 | 2026-07-17 || Nueva skill (fix #65): repara uno por uno los hallazgos fix-now de `review-change`/`audit-pr` — clasificación congelada (nunca reclasifica; una objeción genuina produce `DISPUTED``/triage-issue`), una lista de prohibiciones fija (nada de volcado a known-issues, nota de tradeoff en `decisions.md`, aflojar/saltar tests, supresión de lint como arreglo, stub `TODO`, ni marcar `folded: yes` sin un diff), y un contrato de salida fijo por hallazgo `FOLDED <sha> \| DISPUTED <razón> \| BLOCKED <input faltante>` que termina en un total `Folded: n/m · Disputed: k · Blocked: j`. La checklist del ciclo de fold embebida en `execute-phase` se mantiene como fallback en contexto/portabilidad. |
261263

262264
#### `audit-pr`
@@ -383,7 +385,10 @@ Cómo funciona el pinning realmente, **verificado** contra el CLI `skills`:
383385
| | 1.1.1 | 2026-07-10 | parche | Fix #33: la descripción del frontmatter y la sección de apertura aún enunciaban el contrato previo a la feature 10 ("toda skill de cara al usuario imprime el envelope") POR ENCIMA de la corrección de la feature 10 — reescritas de cabeza al contrato vigente (esquema + regla de parseo último-json-cercado como núcleo; emisión = `workflow-status` siempre, el resto de skills solo bajo el snippet inyectado por el driver, nada en sesiones interactivas). La misma frase obsoleta corregida en `packages/agentic-workflow-schema/README.md`, `package.json`, `src/index.ts` y `envelope.schema.json` (solo texto de descripción/comentario/metadatos, sin cambio de forma del esquema ni de comportamiento, sin release del paquete). |
384386
| | 1.1.0 | 2026-07-10 | menor | Nueva sección `## Driver system-prompt snippet + repair loop`: el snippet canónico de system-prompt inyectado por el driver (verbatim, cercado) y el protocolo de bucle de reparación (fallo de parseo → reinvocar con "Emit only the machine envelope for the turn above.", un reintento, luego FAILED del driver) — el requisito del envelope se traslada aquí desde los contratos de turno por skill de las 14 skills de cara al usuario. |
385387
| | 1.0.0 | 2026-07-05 || Nuevo contrato interno: el esquema JSON del envelope máquina (11 estados, claves fijas, regla de parseo último-json-cercado) que toda skill de cara al usuario emite como su salida final absoluta. |
386-
| `review-implementation` | 1.1.0 | 2026-07-09 | menor | La postura de la Fase 1 ("Find") ahora es adversarial por defecto: "asume que el diff está MAL — tu trabajo es probar que no funciona". La tabla de ejes y la rúbrica de clasificación de la Fase 2 no cambian. |
388+
| `review-implementation` | 1.2.2 | 2026-07-19 | parche | Se corrige un encabezado ATX partido — el encabezado `###` de "Fix-now override checks" ocupaba dos líneas y se renderizaba como dos H3 separados; ahora es una sola línea de encabezado. Solo formato, sin cambio de comportamiento. |
389+
| | 1.2.1 | 2026-07-19 | parche | Aclara el alcance de las comprobaciones de anulación hacia fix-now: solo condicionan `postpone`/`intentional-tradeoff` para un *defecto real confirmado*`ignore` (falso positivo/negligible) se decide antes y nunca debió pasar por esta puerta. Solo redacción; sin cambio de comportamiento. |
390+
| | 1.2.0 | 2026-07-19 | menor | La Fase 2 gana dos **comprobaciones de anulación hacia fix-now**, obligatorias antes de cualquier clase no-fix-now: un arreglo barato (unas pocas líneas de bajo riesgo que cuestan menos que rastrear un issue) o un defecto dentro de alcance (dentro del alcance del SPEC que gobierna la unidad) es siempre fix-now — postpone/known-issue/tradeoff no están disponibles para ellos. Un fix-now grande dentro de alcance nunca se degrada: nueva ruta `replan-in-unit` que añade fase(s) confirmadas por el usuario al ledger `## Phases` del SPEC de la unidad — antes de la fase final `Hardening & PR` si aún no se ejecutó; después de ella más una nueva fase final `Hardening & PR` si ya se ejecutó (un hardening completado nunca avala trabajo posterior) — ejecutadas en la misma rama. Se añade la guarda simétrica de no-desinflar. |
391+
| | 1.1.0 | 2026-07-09 | menor | La postura de la Fase 1 ("Find") ahora es adversarial por defecto: "asume que el diff está MAL — tu trabajo es probar que no funciona". La tabla de ejes y la rúbrica de clasificación de la Fase 2 no cambian. |
387392
| | 1.0.3 | 2026-07-04 | parche | Sin cambio de comportamiento: el frontmatter `model:`/`effort:` de esta skill se trasladó a `docs/workflow/model-routing.yml` (usado solo para construir la rama `#claude`). |
388393
| | 1.0.2 | 2026-07-02 | parche | La referencia a revisiones companion ahora apunta al pack de revisión interno (`review-*`) |
389394
| | 1.0.1 | 2026-06-09 | parche | Descripción acortada 96 → 36 palabras (contexto siempre cargado); cuerpo sin cambios |
@@ -436,6 +441,22 @@ Cómo funciona el pinning realmente, **verificado** contra el CLI `skills`:
436441

437442
## Registro cronológico (más reciente primero)
438443

444+
- **2026-07-19 — comprobaciones de anulación hacia fix-now + reconstrucción de blockers en fold-findings.**
445+
`review-implementation` 1.2.0 cierra los escapes de clasificación: un arreglo
446+
barato o un defecto dentro de alcance es siempre fix-now (comprobaciones
447+
obligatorias antes de cualquier clase no-fix-now), y un fix-now dentro de
448+
alcance demasiado grande se enruta a la nueva `replan-in-unit` (fase(s)
449+
confirmadas por el usuario añadidas al SPEC de la unidad, misma rama,
450+
re-añadiendo una fase final de hardening cuando la original ya se ejecutó)
451+
en vez de degradarse. `review-change` 2.5.0 refleja ambas en su Routing y en el
452+
bloque `→ Next:` de `FAIL`. `fold-findings` 1.1.0 reconstruye las filas de
453+
ledger ausentes desde un veredicto BLOCKED de `audit-pr` (nunca "no hay
454+
hallazgos" mientras se listan blockers) y añade el veredicto por hallazgo
455+
`REPLAN` + el campo opcional `· Replan: r` en el total.
456+
`review-implementation` 1.2.1 (parche) aclaró después el alcance de las
457+
comprobaciones de anulación: solo condicionan `postpone`/`intentional-tradeoff`
458+
para un defecto real confirmado, nunca `ignore`; 1.2.2 (parche) corrigió un
459+
encabezado ATX partido en la misma sección que se renderizaba como dos H3.
439460
- **2026-07-19 — señales de driver en workflow-status + ampliación de la puerta de descope en audit-pr (fix 79+89).**
440461
Expone el lado sensor de la ronda de diseño del 2026-07-17 (#66/#76/#77/#78)
441462
en el envelope de `workflow-status`: señales por-unidad `review`/`closure`/

CHANGELOG.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ How pinning actually works, verified against the `skills` CLI:
228228
#### `review-change`
229229
| Version | Date | Type | What changed |
230230
|---|---|---|---|
231+
| 2.5.0 | 2026-07-19 | minor | Routing now states `review-implementation` 1.2.0's fix-now override checks (cheap fix / in-scope defect → always fix-now, never a postpone/known-issue/tradeoff escape) and adds the `replan-in-unit` route for a too-large in-scope fix-now (keeps its fix-now class + ledger row; user confirms new SPEC phase(s), then `execute-phase` on the same branch folds it); the `Decision: FAIL` `→ Next:` block gains a matching conditional sub-bullet. |
231232
| 2.4.1 | 2026-07-18 | patch | Fix #77: restated the two `execute-phase` cadence cross-references ("When to use" and "Relationship to other skills") from the retired every-2-phases interval to the new trigger-based cadence (layer boundary/accumulation/sensitivity); the adversarial "Cadence — once per unit" section and its `#77` boundary note are unchanged. |
232233
| 2.4.0 | 2026-07-18 | minor | Fix #76: made `--adversarial N` usable by hand-orchestrated weak-model fleets — a 4-box recommendation checklist (replaces the L/sensitive-only trigger, adds a "reviewer not strongest/weaker than author" condition surfaced as a report line, never auto-detected), a fixed N ladder (2 default, 3 on security/single-family, >3 discouraged), index-assigned reviewer roles (R1 correctness, R2 security, R3 SPEC-coverage) with a role-is-priority-not-scope guardrail, single-sourced reviewer/merge contracts, a new `--merge` fusion entry point with a forbidden-drop list, Portability paste-block templates, a once-per-unit cadence anchor (explicit `#77` boundary), and `→ Next:` wiring at the terminal review. |
233234
| 2.3.0 | 2026-07-17 | minor | Fix #65: the `Decision: FAIL` `→ Next:` block now recommends the new standalone `/fold-findings` skill (frozen classification, forbidden list closing the known-issues-dump/downgrade/test-loosening/suppression escape hatches) as the fold path, replacing the inline "fold the fix-now findings" prose line; the multi-line fixed shape and the `/audit-pr`/non-fix-now/product-audit sub-bullets are unchanged. |
@@ -256,6 +257,7 @@ How pinning actually works, verified against the `skills` CLI:
256257
#### `fold-findings`
257258
| Version | Date | Type | What changed |
258259
|---|---|---|---|
260+
| 1.1.0 | 2026-07-19 | minor | Two additions: (1) **ledger reconstruction** — invoked after an `audit-pr` `VERDICT: BLOCKED` with the ledger absent or missing blockers, the skill now appends the missing rows from the verdict itself (fixed schema, `class: fix-now`, deduped by `file:line`+axis, committed) and proceeds; ending with "no findings" while a BLOCKED verdict lists blockers is a contract violation. (2) New **`REPLAN`** per-finding verdict for `replan-in-unit` rows (and any finding whose smallest correct fix proves too large to fold in one commit): never implemented inline, never downgraded — hand-off to user-confirmed SPEC phase(s) + `execute-phase` on the same branch; tally gains an optional `· Replan: r` field (omitted when 0). |
259261
| 1.0.0 | 2026-07-17 || New skill (fix #65): repairs `review-change`/`audit-pr` fix-now findings one at a time — frozen classification (never reclassifies; a genuine objection produces `DISPUTED``/triage-issue`), a fixed forbidden list (no known-issues dump, no `decisions.md` tradeoff note, no test loosening/skipping, no lint-suppression-as-fix, no `TODO` stub, no ticking `folded: yes` without a diff), and a fixed per-finding `FOLDED <sha> \| DISPUTED <reason> \| BLOCKED <missing input>` output contract ending in a `Folded: n/m · Disputed: k · Blocked: j` tally. `execute-phase`'s embedded fold-cycle checklist remains the in-context/portability fallback. |
260262

261263
#### `audit-pr`
@@ -382,7 +384,10 @@ How pinning actually works, verified against the `skills` CLI:
382384
| | 1.1.1 | 2026-07-10 | patch | Fix #33: the frontmatter description and opening section still stated the pre-feature-10 contract ("every user-facing skill prints the envelope") ABOVE the feature-10 correction — rewritten head-first to the current contract (schema + last-fenced-json parse rule as the core; emission = `workflow-status` always, other skills only under the driver-injected snippet, nothing in interactive sessions). Same stale sentence fixed in `packages/agentic-workflow-schema/README.md`, `package.json`, `src/index.ts`, and `envelope.schema.json` (description/comment/metadata text only, no schema-shape or code-behavior change, no package release needed). |
383385
| | 1.1.0 | 2026-07-10 | minor | New `## Driver system-prompt snippet + repair loop` section: the canonical driver-injected system-prompt snippet (verbatim, fenced) and the repair-loop protocol (parse-fail → re-invoke with "Emit only the machine envelope for the turn above.", one retry, then driver-level FAILED) — the envelope requirement moved here from the 14 user-facing skills' per-skill turn contracts. |
384386
| | 1.0.0 | 2026-07-05 || New internal contract: the machine-envelope JSON schema (11 states, fixed keys, last-fenced-json parse rule) every user-facing skill emits as its absolute last output. |
385-
| `review-implementation` | 1.1.0 | 2026-07-09 | minor | Phase 1 ("Find") stance is now adversarial by default: "assume the diff is WRONG — your job is to prove it does not work." The axis table and the Phase 2 classification rubric are unchanged. |
387+
| `review-implementation` | 1.2.2 | 2026-07-19 | patch | Fixed a wrapped ATX heading — the "Fix-now override checks" `###` heading spanned two lines, rendering as two separate H3s; now a single heading line. Formatting only, no behavior change. |
388+
| | 1.2.1 | 2026-07-19 | patch | Clarified the fix-now override checks' scope: they gate `postpone`/`intentional-tradeoff` for a *confirmed real defect* only — `ignore` (false positive/negligible) is decided first and was never meant to route through this gate. Wording-only; no behavior change. |
389+
| | 1.2.0 | 2026-07-19 | minor | Phase 2 gains two **fix-now override checks**, mandatory before any non-fix-now class: a cheap fix (a few low-risk lines costing less than tracking an issue) or an in-scope defect (inside the governing SPEC's scope for the unit) is always fix-now — postpone/known-issue/tradeoff is not available for them. A large in-scope fix-now is never downgraded: new route `replan-in-unit` appends user-confirmed phase(s) to the unit's SPEC `## Phases` ledger — before the final `Hardening & PR` phase if it hasn't run yet; after it plus a fresh final `Hardening & PR` phase if it already ran (a completed hardening never vouches for later work) — executed on the same branch. Matching don't-deflate guardrail added. |
390+
| | 1.1.0 | 2026-07-09 | minor | Phase 1 ("Find") stance is now adversarial by default: "assume the diff is WRONG — your job is to prove it does not work." The axis table and the Phase 2 classification rubric are unchanged. |
386391
| | 1.0.3 | 2026-07-04 | patch | No behavior change: this skill's `model:`/`effort:` frontmatter moved to `docs/workflow/model-routing.yml` (used only to build the `#claude` branch). |
387392
| | 1.0.2 | 2026-07-02 | patch | Companion-review reference now points at the internal review pack (`review-*`) |
388393
| | 1.0.1 | 2026-06-09 | patch | Description shortened 96 → 36 words (always-loaded context); body unchanged |
@@ -435,6 +440,21 @@ How pinning actually works, verified against the `skills` CLI:
435440

436441
## Release log (chronological, newest first)
437442

443+
- **2026-07-19 — fix-now override checks + fold-findings blocker reconstruction.**
444+
`review-implementation` 1.2.0 closes the classification escape hatches: a
445+
cheap fix or an in-scope defect is always fix-now (mandatory override checks
446+
before any non-fix-now class), and a too-large in-scope fix-now routes to
447+
the new `replan-in-unit` (user-confirmed phase(s) appended to the unit's
448+
SPEC, same branch, re-adding a final hardening phase when the original one
449+
already ran) instead of being downgraded. `review-change` 2.5.0
450+
mirrors both in its Routing and `FAIL` `→ Next:` block. `fold-findings`
451+
1.1.0 reconstructs missing ledger rows from an `audit-pr` BLOCKED verdict
452+
(never "no findings" while blockers are listed) and adds the `REPLAN`
453+
per-finding verdict + optional `· Replan: r` tally field.
454+
`review-implementation` 1.2.1 (patch) then clarified the override checks'
455+
scope: they gate `postpone`/`intentional-tradeoff` for a confirmed real
456+
defect only, never `ignore`; 1.2.2 (patch) fixed a wrapped ATX heading in
457+
the same section that rendered as two H3s.
438458
- **2026-07-19 — workflow-status driver signals + audit-pr descope-gate widening (fix 79+89).**
439459
Exposes the 2026-07-17 design round's sensor side (#66/#76/#77/#78) in the
440460
`workflow-status` envelope: per-unit `review`/`closure`/`issues_born` under

0 commit comments

Comments
 (0)