@gtrabanco/pi-agentic-workflow 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.es.md +0 -1
  2. package/README.md +0 -1
  3. package/package.json +1 -1
  4. package/skills/design-feature/SKILL.md +31 -2
  5. package/skills/evidence-grounding/SKILL.md +13 -2
  6. package/skills/evidence-grounding/references/ROWS.md +1 -1
  7. package/skills/execute-phase/SKILL.md +6 -4
  8. package/skills/execute-phase/references/BATCH_AND_PORTABILITY.md +5 -4
  9. package/skills/execute-phase/references/CLOSEOUT.md +5 -4
  10. package/skills/execute-phase/references/FOLDING.md +3 -2
  11. package/skills/execute-phase/references/UNIT_LOOP.md +1 -2
  12. package/skills/fold-findings/SKILL.md +1 -1
  13. package/skills/fold-findings/references/FOLD_POLICY.md +7 -0
  14. package/skills/log-session/SKILL.md +7 -1
  15. package/skills/plan-feature-scaffold/SKILL.md +13 -1
  16. package/skills/plan-fix/SKILL.md +13 -1
  17. package/skills/pre-execution-review/SKILL.md +1 -1
  18. package/skills/pre-execution-review/references/LEDGERS.md +23 -1
  19. package/skills/pre-execution-review/references/POLICY.md +1 -1
  20. package/skills/review-a11y/SKILL.md +10 -1
  21. package/skills/review-brand/SKILL.md +10 -1
  22. package/skills/review-change/SKILL.md +10 -7
  23. package/skills/review-change/references/OUTPUT_AND_GUARDRAILS.md +3 -1
  24. package/skills/review-change/references/PERSIST_AND_DECIDE.md +35 -15
  25. package/skills/review-change/references/REVIEW_PROCESS.md +73 -13
  26. package/skills/review-code/SKILL.md +12 -1
  27. package/skills/review-design/SKILL.md +10 -1
  28. package/skills/review-implementation/SKILL.md +1 -1
  29. package/skills/review-implementation/references/CLASSIFY.md +9 -1
  30. package/skills/review-perf/SKILL.md +10 -1
  31. package/skills/review-plan/SKILL.md +1 -1
  32. package/skills/review-plan/references/OUTPUT.md +9 -0
  33. package/skills/review-security/SKILL.md +10 -1
  34. package/skills/review-seo/SKILL.md +10 -1
  35. package/skills/review-spec/SKILL.md +1 -1
  36. package/skills/review-spec/references/OUTPUT.md +9 -0
  37. package/skills/review-verify/SKILL.md +10 -1
  38. package/skills/ship-roadmap/SKILL.md +2 -2
  39. package/skills/ship-roadmap/references/ADVANCE.md +6 -5
  40. package/skills/ship-roadmap/references/MODEL_ROUTING.md +1 -1
  41. package/skills/triage-issue/SKILL.md +1 -1
  42. package/skills/triage-issue/references/REVIEW_FINDING_PROCESS.md +1 -1
  43. package/skills/verification-contract/SKILL.md +22 -2
  44. package/skills/loop-review-fold/SKILL.md +0 -191
@@ -10,6 +10,17 @@
10
10
  check, run `git rev-parse HEAD` once and retain its 40-hex output as the
11
11
  **reviewed head SHA**. The final PR receipt may be written only for that exact
12
12
  commit; a PR whose head changes during the review requires a fresh review.
13
+ **Read the unit's fold ledger (`review-findings.md`) before any pass — it is
14
+ the review's memory — and state the cycle number** in the report (`Cycle: <n>`,
15
+ completed `REVIEW-RAN` marks + 1). From cycle 2 on, **every `folded: yes` row
16
+ is re-verified at its cited location** before anything else: defect gone →
17
+ pass; defect still present → one new row marked `regression of <id>` (that is
18
+ the only legitimate bypass of the `file:line`+axis dedupe, and it is folded
19
+ with the same evidence bar as any finding); reviewer disagreement with a
20
+ user-approved amendment → `DISPUTED`, never a fresh row re-litigating the
21
+ same location. A cycle ≥ 2 that produces any new fix-now row appends the
22
+ `CONVERGENCE-ANOMALY` block (`pre-execution-review/references/POLICY.md` §4)
23
+ to the report.
13
24
  2. **Frozen acceptance + SPEC drift check (structural).** Locate sibling
14
25
  `ACCEPTANCE.md`, recompute its blob, and require an exact match with the
15
26
  execution receipt before assessing the candidate. Missing/mismatch is a
@@ -34,14 +45,27 @@
34
45
  commits follow `<type>(<scope>): <summary>`; phase labels in touched
35
46
  planning docs are `P1, P2, …` (never `S1`/"Steps"); the phase's per-phase
36
47
  docs were updated (TASKS ticks, progress entry); no commit landed on the
37
- default branch; artifacts are in the project's declared docs language;
38
- **the tree is clean and the remote current** — run `git status --porcelain`
39
- (any tracked modification, code or docs, = a `workflow` finding: work is
40
- sitting outside the commits under review) and, when the branch has an open
41
- PR, `git fetch` + `git status -sb` (commits ahead of the remote = a
42
- `workflow` finding: the PR and CI are judging a stale branch). Both are
43
- **fix-now** — a review verdict on a branch whose real state isn't pushed
44
- is worthless. Run the greps/`git log`/`git status` — don't infer compliance.
48
+ default branch; artifacts are in the project's declared docs language.
49
+ **Workspace state is a precondition, not a finding.** Run
50
+ `git status --porcelain`, and when the branch has an open PR `git fetch` +
51
+ `git status -sb`. Any tracked modification, or being ahead of/behind the
52
+ remote, stops the review **before any pass runs** — no findings table, no
53
+ ledger write, no verdict, and never a `workflow` finding persisted for it
54
+ (a review that filed its own dirty tree would hand the next review the
55
+ same finding, forever):
56
+
57
+ ```text
58
+ REVIEW BLOCKED — workspace state
59
+ - `git status --porcelain`: <lines, or `clean`>
60
+ - `git status -sb`: <line, or n/a: no open PR>
61
+ → Next: commit or stash the listed files, then re-run /review-change.
62
+ Untracked, non-ignored harness/toolstate nobody authored for this unit
63
+ (.engram/, .pi/, .serena/, session files) is committed once or added to
64
+ .gitignore — named here, never reviewed. A verdict on a workspace whose
65
+ state the forge cannot see is withheld, not filed.
66
+ ```
67
+
68
+ Run the greps/`git log`/`git status` — don't infer compliance.
45
69
  4. **Applicable pack passes (the finders).** For each axis the matrix +
46
70
  footprint mark as relevant, run the workflow's own internal skill for it
47
71
  (`review-code`, `review-security`, `review-verify`, `review-design`,
@@ -54,14 +78,30 @@
54
78
  (stack-specific linters, framework skills) and they are installed, run them
55
79
  **in addition** — their findings merge into the same table. Never treat an
56
80
  absent extra as a gap; the pack already covered the axis.
57
- 6. **Synthesize.** Fuse all findings into **one** findings table, deduped by
81
+ 6. **Verify, then synthesize.** Before fusing anything, every candidate finding
82
+ is **verified in an isolated context against the reviewed head's bytes** (the
83
+ SHA frozen in step 1) and marked `confirmed` or `refuted`. The recheck method
84
+ follows the finding's axis:
85
+ - a **code / behavioral** claim confirms only with a **failing reproducer** —
86
+ a red test written first and run against **unchanged code**, or
87
+ **reproducible command output**;
88
+ - a **documentation / wording** claim confirms by **direct read** of the
89
+ cited text (typos and wording are corrected without ceremony, no test);
90
+ - a **missing-documentation** claim confirms the named user path is
91
+ undocumented.
92
+ Only **confirmed** candidates flow to synthesis; a **refuted** candidate is
93
+ reported with its counter-evidence in the same report and never becomes a
94
+ row, a fold task, or a re-review trigger. The per-finding durable mark is
95
+ `finding-mark@1` (contract in `pre-execution-review/references/LEDGERS.md`).
96
+
97
+ 7. **Synthesize.** Fuse all findings into **one** findings table, deduped by
58
98
  `file:line` + axis, per the synthesis contract (the same fusion rules apply
59
99
  in the default single-reviewer case). Columns: `# | Finding | Axis | Sev |
60
100
  Evidence | Suggested fix` — **unclassified**. Overlapping signals on the same
61
101
  defect collapse into one row. Add a **`Reviewers n/N`** column when running
62
102
  in `--adversarial N` mode (omitted entirely in the default single-reviewer
63
103
  case).
64
- 7. **Classify (once).** Run `review-implementation` over the synthesized table
104
+ 8. **Classify (once).** Run `review-implementation` over the synthesized table
65
105
  (isolated, per the *Isolation rule*) — the single classification engine
66
106
  (D5). It verifies axis coverage (every applicable axis represented; a
67
107
  missing axis is a `coverage` finding) and applies the current-unit contract:
@@ -70,17 +110,37 @@
70
110
  → the **classified decision table** (Sev, Class, WHY, impl risk, long-term
71
111
  impact, premature-opt?, Route). No per-pass or per-reviewer classification,
72
112
  no re-litigation.
73
- 8. **Debt transform.** Run `review-debt` over the classified table — it
113
+ 9. **Debt transform.** Run `review-debt` over the classified table — it
74
114
  transforms debt-shaped findings into explicit TRIGGER-carrying debt items;
75
115
  it does not rescan the diff (SPEC contract).
76
- 9. **Manual-verification checklist.** List what automated review **cannot** confirm
116
+ 10. **Manual-verification checklist.** List what automated review **cannot** confirm
77
117
  and a human must check — visual correctness, real-device/locale behavior, UX
78
118
  feel, perf under load, anything marked *verify*. Be explicit so the dev has zero
79
119
  doubt about what to eyeball.
80
- 10. **Route the outcomes.** fix-now findings fold into the current unit (or gain
120
+ 11. **Route the outcomes.** fix-now findings fold into the current unit (or gain
81
121
  user-confirmed phases via replan-in-unit); decision-required stops for the
82
122
  user's decision; genuinely independent future capabilities become
83
123
  **non-blocking proposals** — batched in the report with a trigger, and
84
124
  **never** sent to `triage-issue` automatically (D3). `review-change` creates
85
125
  no backlog work. No non-fix-now finding may end without a destination — none
86
126
  silently lost.
127
+
128
+ ## Two-cycle cap
129
+
130
+ The review→fold loop runs at most **two** review→fold cycles per unit, counted
131
+ unit-level and family-agnostic from the ledger's `REVIEW-RAN` marks and forge
132
+ receipts — new finding families do not reset the count. After two cycles without
133
+ convergence, the review prints
134
+
135
+ ```text
136
+ LOOP CAP REACHED — <unit>
137
+ - Finding ids: <every open id>
138
+ - Cycles: 2 (REVIEW-RAN marks + forge receipts)
139
+ - Route: /triage-issue --prioritize-now <unit> F<k> … (or the programmatic outer driver)
140
+ ```
141
+
142
+ A **third cycle never starts** unless the user explicitly instructs it — it is
143
+ the user's escape, never a reviewer election. The residue routes to
144
+ `triage-issue --prioritize-now` (or the programmatic outer driver), and a unit
145
+ that needs a third cycle has a planning or root-cause defect, not a review
146
+ deficit.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-code
3
3
  user-invocable: false
4
- version: 1.0.1
4
+ version: 1.2.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -41,9 +41,20 @@ default branch. State the scope at the top of the returned table.
41
41
  ✓ No new dependency not justified in the SPEC
42
42
  ✓ Simplification: any changed block that can lose lines without losing
43
43
  behavior (cite before/after)
44
+ ✓ Reference trace: every changed symbol/API got a reference search —
45
+ un-updated callers are findings
44
46
  ✓ Edge cases the SPEC's dev scenarios name are actually handled in code, not
45
47
  just in tests
46
48
 
49
+ ## Materiality bar
50
+
51
+ Report a row only when a competent user's outcome changes or a rule the project
52
+ explicitly declares is violated — cite the rule it violates beside the evidence.
53
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
54
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
55
+ An empty table with `Decision: PASS` is the expected result for a well-formed
56
+ change — never pad the table.
57
+
47
58
  ## Return exactly
48
59
 
49
60
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-design
3
3
  user-invocable: false
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -35,6 +35,15 @@ default branch. State the scope at the top of the returned table.
35
35
  ✓ Destructive actions require confirmation and are visually distinct
36
36
  ✓ Feedback on every user action (submit, save, fail) — no silent operations
37
37
 
38
+ ## Materiality bar
39
+
40
+ Report a row only when a competent user's outcome changes or a rule the project
41
+ explicitly declares is violated — cite the rule it violates beside the evidence.
42
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
43
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
44
+ An empty table with `Decision: PASS` is the expected result for a well-formed
45
+ change — never pad the table.
46
+
38
47
  ## Return exactly
39
48
 
40
49
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-implementation
3
3
  user-invocable: false
4
- version: 1.5.0
4
+ version: 1.7.0
5
5
  argument-hint: <path-or-glob>
6
6
  allowed-tools: Read, Grep, Glob, Bash, WebFetch
7
7
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
@@ -15,6 +15,14 @@ only with a rationale.
15
15
 
16
16
  ### Step 2 — Is it current-unit work? (only blocking outcomes)
17
17
 
18
+ **Severity floor first.** A `low` finding (taste, cosmetics, micro-optimization
19
+ without a measured need) is **never persisted and never blocks**: it is carried
20
+ as a report note with its evidence, and the fold ledger never sees it. But a
21
+ real defect mislabeled `low` stays real: when the evidence shows a correctness,
22
+ security, behavioral, or data-integrity defect, classify it at `med` minimum —
23
+ deflating a real defect to `low` to unblock a review is itself a review defect.
24
+ Only `high` and `med` findings run through the current-unit gate below.
25
+
18
26
  A finding belongs to the **current unit** when it maps to the governing SPEC, a
19
27
  phase, a documented invariant, correctness, security, accessibility, a required
20
28
  UX/error state, or an expectation necessary for a competent user to consider an
@@ -105,7 +113,7 @@ finding in its `Route` cell.
105
113
 
106
114
  | Owning stage | Hand-off | Never |
107
115
  |---|---|---|
108
- | `source` | fold locally: `/loop-review-fold` → `/fold-findings` → re-review the changed HEAD | — |
116
+ | `source` | fold locally: `/fold-findings`, then re-run `/review-change` on the changed HEAD | — |
109
117
  | `plan` | the planning author re-cuts the artifact (SPEC `## Phases`, an obligation row, an acceptance mapping, a ledger) on the same branch with the user's confirmation, then a **fresh `/review-plan <unit>`** precedes `execute-phase` | fold it in code and leave the plan describing the old build |
110
118
  | `product` | `/design-feature <unit>` repairs the half, then `/review-spec <unit>` re-judges it | patch the product claim into agreement in code |
111
119
  | `environment` / `runtime` | the existing retry/`BLOCKED` paths | translate into a PASS, or an issue |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-perf
3
3
  user-invocable: false
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -54,6 +54,15 @@ default branch. State the scope at the top of the returned table.
54
54
  add a **minor** finding recommending the project adopt the tooling via
55
55
  `init-workspace`'s Performance tooling round.
56
56
 
57
+ ## Materiality bar
58
+
59
+ Report a row only when a competent user's outcome changes or a rule the project
60
+ explicitly declares is violated — cite the rule it violates beside the evidence.
61
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
62
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
63
+ An empty table with `Decision: PASS` is the expected result for a well-formed
64
+ change — never pad the table.
65
+
57
66
  ## Return exactly
58
67
 
59
68
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-plan
3
3
  user-invocable: true
4
- version: 1.3.1
4
+ version: 1.5.0
5
5
  argument-hint: <NN-slug | fix-N | path/to/SPEC.md> [--adversarial N]
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -89,6 +89,15 @@ stage.
89
89
 
90
90
  ### Routes
91
91
 
92
+ **Resolution map — the finding's `class` cell names its resolver, and only that
93
+ resolver:** class `plan` → `plan-feature` / `plan-fix` (the author re-cuts, then
94
+ `/review-plan` re-judges) · class `product` → `design-feature` repairs the
95
+ Product half (then `/review-spec`, then the plan re-derives) · class `source` |
96
+ `environment` | `runtime` → the executor's fold path (`/fold-findings`, then re-run
97
+ `/review-change`), never by editing the plan to hide the row.
98
+ **`fold-findings` never repairs a planning artifact** — folding repairs source,
99
+ not authority.
100
+
92
101
  | Verdict / class | Who acts | What happens next |
93
102
  |---|---|---|
94
103
  | `PLAN-REVIEW-PASS` | nobody | `/execute-phase <NN>` binds this receipt + exact snapshot digest |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-security
3
3
  user-invocable: false
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -40,6 +40,15 @@ default branch. State the scope at the top of the returned table.
40
40
  ✓ Error responses don't leak stack traces or internal paths
41
41
  ✓ Unsafe deserialization / dynamic evaluation of untrusted data absent
42
42
 
43
+ ## Materiality bar
44
+
45
+ Report a row only when a competent user's outcome changes or a rule the project
46
+ explicitly declares is violated — cite the rule it violates beside the evidence.
47
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
48
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
49
+ An empty table with `Decision: PASS` is the expected result for a well-formed
50
+ change — never pad the table.
51
+
43
52
  ## Return exactly
44
53
 
45
54
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-seo
3
3
  user-invocable: false
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -40,6 +40,15 @@ default branch. State the scope at the top of the returned table.
40
40
  - ✓ No render-blocking regression for primary content (content present without
41
41
  JS where the project declares SSR/SSG)
42
42
 
43
+ ## Materiality bar
44
+
45
+ Report a row only when a competent user's outcome changes or a rule the project
46
+ explicitly declares is violated — cite the rule it violates beside the evidence.
47
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
48
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
49
+ An empty table with `Decision: PASS` is the expected result for a well-formed
50
+ change — never pad the table.
51
+
43
52
  ## Return exactly
44
53
 
45
54
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-spec
3
3
  user-invocable: true
4
- version: 1.3.2
4
+ version: 1.5.0
5
5
  argument-hint: <NN-slug | path/to/SPEC.md>
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -76,6 +76,15 @@ fourth verdict.
76
76
 
77
77
  ### Routes
78
78
 
79
+ **Resolution map — the finding's `class` cell names its resolver, and only that
80
+ resolver:** class `product` → `design-feature` (then `/review-spec` re-judges the
81
+ new revision) · class `plan` → `plan-feature` / `plan-fix` re-cuts the plan (then
82
+ `/review-plan` re-judges) · class `source` | `environment` | `runtime` → the
83
+ executor's fold path (`/fold-findings`, then re-run `/review-change`).
84
+ **`fold-findings` never repairs a planning artifact**, and a planning finding is
85
+ never resolved by patching the artifact during review — folding repairs source,
86
+ not authority.
87
+
79
88
  | Verdict | Who repairs | What happens next |
80
89
  |---|---|---|
81
90
  | `SPEC-REVIEW-PASS` | nobody | `/plan-feature <NN-slug>` binds this receipt + exact snapshot digest |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-verify
3
3
  user-invocable: false
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -40,6 +40,15 @@ default branch. State the scope at the top of the returned table.
40
40
  ✓ Anything that can only be confirmed by a human (visual, device, locale,
41
41
  load) is listed explicitly under "Manual" — never silently dropped
42
42
 
43
+ ## Materiality bar
44
+
45
+ Report a row only when a competent user's outcome changes or a rule the project
46
+ explicitly declares is violated — cite the rule it violates beside the evidence.
47
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
48
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
49
+ An empty table with `Decision: PASS` is the expected result for a well-formed
50
+ change — never pad the table.
51
+
43
52
  ## Return exactly
44
53
 
45
54
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ship-roadmap
3
3
  user-invocable: true
4
- version: 5.0.0
4
+ version: 5.1.0
5
5
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  argument-hint: "[--fullauto] | --continue [--fullauto]"
@@ -102,7 +102,7 @@ fallback only when a primitive is unavailable; keep stage order and safety floor
102
102
 
103
103
  | Relation | Skills/policy |
104
104
  |---|---|
105
- | Compose (same/lower tier) | `init-workspace`; JIT `design-feature` + `plan-feature-scaffold`; `plan-feature`; `loop-review-fold`; verdict-only `audit-pr`; `audit-docs`. |
105
+ | Compose (same/lower tier) | `init-workspace`; JIT `design-feature` + `plan-feature-scaffold`; `plan-feature`; the review→fold manual path (`/fold-findings` → re-run `/review-change`); verdict-only `audit-pr`; `audit-docs`. |
106
106
  | Cheap workers | `execute-phase` (fresh context/phase), mechanical folds, audit-blocker fixes; use the validated worker model. |
107
107
  | Human hand-off | Default merges, `product-audit` (higher effort), and report issue batches via `triage-issue`. |
108
108
  | Sibling | `workflow-status` supplies the strict sensor result; worker skills use the package-owned output profiles, while the conductor keeps its native `SHIP:` turn contract. |
@@ -70,11 +70,12 @@
70
70
  when the PR opens; any flips left at run end ride the report commit).
71
71
  Stop before the literal final `Hardening & PR` phase: PR owns that explicit
72
72
  phase so close-out has one owner. Never bundle phases into one worker.
73
- - **REVIEW** — compose `loop-review-fold` in-turn (equal tier) once, over
74
- the complete PR candidate. It reuses a current exact-SHA receipt or runs
75
- `review-change` context-clean, batches compatible fixes through
76
- `fold-findings`, and re-reviews only changed HEADs. Default correction
77
- budget is two; unchanged evidence stops NO-PROGRESS. L/sensitive features
73
+ - **REVIEW** — compose the manual review→fold path in-turn (equal tier) once,
74
+ `/fold-findings`, then re-run `/review-change`, over the complete PR
75
+ candidate. It reuses a current exact-SHA receipt or runs `review-change`
76
+ context-clean, batches compatible fixes through `fold-findings`, and
77
+ re-reviews only changed HEADs. Default correction budget is two; unchanged
78
+ evidence stops NO-PROGRESS. L/sensitive features
78
79
  forward `--adversarial 2` (security/auth: `3`) as the unattended floor;
79
80
  other units use one final reviewer. There are no intermediate phase
80
81
  reviews in autopilot: phase gates + frozen acceptance guard execution,
@@ -9,7 +9,7 @@
9
9
  | Product review (REVIEW-SPEC) | opus/high | `review-spec` in a **clean context** (fresh subagent or outside headless call) — never the turn that wrote the product half; tier equals or exceeds the author's, so the ≥ rule holds |
10
10
  | Plan review (REVIEW-PLAN) | opus/high | `review-plan` in a **clean context**, same rule; it judges the plan the previous stage froze |
11
11
  | Phase execution, single-pass, fixes | **cheap worker** | fresh context per phase following `execute-phase`; Claude branch maps this role to `sonnet`, portable drivers use their validated worker tier |
12
- | Final review/correction loop | opus/high | compose `loop-review-fold`; it selects review or fold from persisted evidence and routes unresolved findings to `triage-issue --prioritize-now` |
12
+ | Final review/correction loop | opus/high | compose the manual path `/fold-findings`, then re-run `/review-change`; it reuses a current exact-SHA receipt or reviews context-clean, and routes unresolved findings to `triage-issue --prioritize-now` |
13
13
  | Merge gate | opus/high | compose `audit-pr` in-turn (the highest-stakes automated verdict; must share one turn with the floor checks) |
14
14
  | Forge/git mechanics | — | Bash tool calls; no model judgment involved |
15
15
  | Final-report evidence gathering | haiku (optional) | fan-out subagents for grep-shaped per-feature log collection when ultracode is on; synthesis stays opus |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: triage-issue
3
3
  user-invocable: true
4
- version: 2.6.0
4
+ version: 2.7.0
5
5
  argument-hint: <issue-number> [more issue numbers…] | <audit-id> F<k> [F<j>…] | --prioritize-now <unit> F<k> [F<j>…]
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -25,7 +25,7 @@ after `/fold-findings` leaves rows unresolved.
25
25
 
26
26
  4. Never implement the new phases in this triage turn. After a replan, ask the
27
27
  user to continue manually with `/execute-phase <unit> P<n>` (or the fix
28
- equivalent), then re-run `/loop-review-fold` on the resulting HEAD.
28
+ equivalent), then re-run `/review-change` on the resulting HEAD (the manual path).
29
29
 
30
30
  Return exactly one block per finding:
31
31
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: verification-contract
3
3
  user-invocable: false
4
- version: 1.0.1
4
+ version: 1.2.1
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal contract: one compact frozen ACCEPTANCE.md per delivery unit, its
9
9
  validation ladder, anti-weakening rules, and blob-bound execution receipt.
10
- Consumed by planners, execute-phase, review-change, and loop-review-fold.
10
+ Consumed by planners, execute-phase, and review-change.
11
11
  ---
12
12
 
13
13
  # Verification Contract (internal)
@@ -24,6 +24,15 @@ commands. Prefer commands, otherwise use `read-verified: <evidence>` or
24
24
  `manual: <exact observation>`. Unlabelled prose is invalid. A planned test may
25
25
  name its future project runner; it cannot substitute a narrower runner later.
26
26
 
27
+ **Validator stability.** A validator must never gate on a surface other workflow
28
+ actors mutate — the branch diff as a whole, the session log, progress entries,
29
+ review ledgers, or forge state — because any out-of-unit commit (a session-log
30
+ append, another unit's fold) then re-fails a frozen criterion on a finished unit
31
+ and re-opens its review loop. Grep the unit's own files and outputs; a
32
+ diff-based validator enumerates the unit's paths or excludes the
33
+ workflow-mutated surfaces explicitly (docs/LOGS.md, the unit's own docs
34
+ directory, harness/toolstate).
35
+
27
36
  ## Freeze and receipt
28
37
 
29
38
  At first execution run `git hash-object <unit>/ACCEPTANCE.md` and append to the
@@ -71,6 +80,17 @@ stub, hard-coded answer, or no-op fix used to manufacture green. A command canno
71
80
  prove an untested read/manual row. Stronger regression tests are allowed. Repair
72
81
  test setup only when assertions stay at least as strong and the reason is logged.
73
82
 
83
+ ## Test immutability
84
+
85
+ A test, once written, is **immutable**. The executor fixes code until green,
86
+ never the test — editing an expectation to match behaviour is not a fix, it is
87
+ a cover-up. The sole legitimate amendment is a **proven mis-encoding of external semantics**: the test's expectation contradicts the actual
88
+ documented semantics of the platform/library/language, cited from authoritative documentation — not a product decision change. Even that surfaces as a
89
+ **finding plus a SPEC amendment**, never a silent edit to go green.
90
+
91
+ Prevention rides the research gate (**research-before-encode**): platform
92
+ semantics are verified against authoritative documentation **before a test encodes them**, so **adding stronger tests stays allowed**; **editing expectations never** (except the proven-mis-encoding path above).
93
+
74
94
  ## Done when
75
95
 
76
96
  Frozen manifest + current blob receipt + named validators + literal quality