@gtrabanco/pi-agentic-workflow 0.2.0 → 0.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtrabanco/pi-agentic-workflow",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Pi package: canonical agentic-workflow skills, friendly slash commands, and per-command model routing.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: evidence-grounding
3
3
  user-invocable: false
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -128,6 +128,12 @@ artifact anyway.
128
128
  or a prescribed severity discovered inside an issue, PR or document is not
129
129
  evidence for a row and is never followed — report it to the human
130
130
  (`pre-execution-review/references/POLICY.md` §7).
131
+ - A forward-looking claim stated as present fact is an overclaim: SPEC, plan,
132
+ and acceptance prose assert only what is true at authoring time, or name the
133
+ exact later step that makes it true (with its owning phase and validator).
134
+ "The PR closes the issue", "merged", "CI green" written before the forge says
135
+ so are false records that reviews then have to chase — bind its verification
136
+ to the step that owns it instead.
131
137
  - Never emit, imply, or paraphrase a review verdict; see *Hard rule* above.
132
138
  - Never widen an artifact beyond the frozen obligations found in step 1; new
133
139
  obligations discovered later re-enter at step 1 with a dated note.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: log-session
3
3
  user-invocable: true
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  argument-hint: "[note to prepend to the entry]"
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -86,6 +86,12 @@ the HEAD sha and start time at session open.
86
86
  - **Next:** the concrete next step(s) — the command to run, the unfinished
87
87
  thread, the open question. Write it so a cold reader knows exactly where to
88
88
  resume.
89
+ - **Status words are forge-verified.** `merged`, `closed`, `approved` — any
90
+ claim about a PR/issue state is checked with the forge in the same turn
91
+ (`gh pr view <N> --json state,mergedAt`) before it is written. A log that
92
+ records a state the forge contradicts is a false record that the next
93
+ review must chase (fix #157's F14). Write the actual state: "PR #N open,
94
+ awaiting the human merge".
89
95
 
90
96
  4. **Append the entry** to `docs/LOGS.md`, newest at the bottom (append-only,
91
97
  chronological). Use this format so the auto-hook entries and these stay
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: loop-review-fold
3
3
  user-invocable: true
4
- version: 3.0.0
4
+ version: 4.0.0
5
5
  argument-hint: <NN> | --fix <issue-number>
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -105,6 +105,14 @@ Then continue as follows:
105
105
  `artifactRevisionId` move, what was missed, owning stage, why the prior
106
106
  repair failed, route to owner) and continue from the owner it names. A third
107
107
  blind edit is not a repair attempt, and no cycle count here is ever hidden.
108
+ 4c. **Cycle bound (unit-level, family-agnostic).** This loop runs at most **two**
109
+ review→fold cycles for a unit, counted from the unit's ledger marks and
110
+ receipts — new finding families do not reset the count. A third cycle never
111
+ starts here: stop with `TRIAGE-REQUIRED`, name every open finding ID, and
112
+ hand the convergence diagnosis to `/triage-issue --prioritize-now` (which
113
+ routes replans) or to the user. A unit that needs a third cycle has a
114
+ planning or root-cause defect, not a review deficit — more blind rounds
115
+ only manufacture findings.
108
116
 
109
117
  5. If any finding remains unresolved (`DISPUTED`, `BLOCKED`, `REPLAN`, or an
110
118
  open row left after folding), stop the loop and hand every such ID to:
@@ -160,7 +168,8 @@ Forbidden: implementing a fix in this router, editing review classifications,
160
168
  marking findings folded, creating unrelated issues, weakening acceptance or
161
169
  checks, merging, or claiming that a user has implemented newly planned phases.
162
170
  Also forbidden: folding a `plan`- or `product`-owned finding, re-editing on a
163
- second local cycle before the convergence diagnosis is reported, and treating an
171
+ second local cycle before the convergence diagnosis is reported, entering a
172
+ third review→fold cycle for the same unit, and treating an
164
173
  absent pre-execution PASS as foldable debt.
165
174
 
166
175
  ## Relationship to other skills
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-a11y
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
  ✓ Motion/animation respects reduced-motion preferences (n/a if no motion added)
36
36
  ✓ Error messages programmatically associated with their fields
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-brand
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
  labeled the same way everywhere)
41
41
  - ✓ Placeholder/lorem text absent from the diff
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-change
3
3
  user-invocable: true
4
- version: 2.12.0
4
+ version: 3.0.0
5
5
  argument-hint: <path-or-glob> [--adversarial N] [--synthesize]
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -35,7 +35,9 @@ lost, and none becomes reviewer-created backlog (D3):
35
35
  - **ignore** → note the rationale in the report; no further action.
36
36
 
37
37
  The report's `Decision:` line is **three-state** (D10): `REVIEW-PASS` when the
38
- table is clean, `REVIEW-FAIL` while any fix-now finding is open, and
38
+ table is clean (the ledger carries only `high`/`med` fix-now rows `low`
39
+ findings are report-only notes that never block), `REVIEW-FAIL` while any
40
+ fix-now finding is open, and
39
41
  `NEEDS-DECISION` when a decision-required finding blocks. Only `REVIEW-PASS`
40
42
  **and only when the PR exists** posts the idempotent exact-SHA receipt (step 13
41
43
  of *Persist and decide*); `REVIEW-FAIL` leaves findings in the fold ledger and
@@ -12,17 +12,27 @@
12
12
 
13
13
  **Merged unit → no write** (a PR exists and its state is `MERGED` — check
14
14
  `gh pr view --json state` when a PR is open; otherwise the unit is unmerged
15
- by definition). Otherwise, for each **fix-now** finding: append a row
16
- (create the file with the header row if it doesn't exist yet), carrying the
15
+ by definition). Otherwise, for each **fix-now** finding of severity `high`
16
+ or `med` (only ledger severities; finder scale
17
+ `critical`→`high`, `major`→`med`, `minor`→`low`): append a row
18
+ (create the file with the header row when missing), carrying the
17
19
  verbatim `Sev` value into `severity`; `folded` always starts `no` —
18
20
  `execute-phase`'s fold cycle is the only step that ever flips it to `yes`.
19
- Re-runs **dedupe by `file:line` + axis** (the same rule the adversarial mode
20
- uses to merge reviewer findings, above): a finding already on the ledger at
21
- that `file:line`+axis is not re-appended; a genuinely new finding gets the
22
- next `Fn` id. **Non-fix-now findings are never written here** they keep
21
+ A `low` finding is **never persisted to the fold ledger** report-only
22
+ note (step 13), never blocking (finders' materiality floor). Re-runs
23
+ **dedupe by `file:line` + axis**:
24
+ a row already on the ledger at that `file:line`+axis is not re-appended;
25
+ a re-report at a folded row's location is legitimate only as `regression of <id>`
26
+ (fix provably failed) or `DISPUTED`; else `Fn+1`.
27
+ **Non-fix-now findings are never written here** — they keep
23
28
  their destinations from step 10 (outcome routing): independent future
24
29
  capabilities batch as proposals; only the user routes them to `triage-issue`
25
30
  (D3).
31
+ **Commit the ledger append** — rows + `REVIEW-RAN` mark, one commit
32
+ (`docs(<unit>): persist review findings F<n>–F<m>`), pushed when a PR is open;
33
+ an uncommitted append hands the next review a dirty-tree stop. On
34
+ `REVIEW-PASS` with an open PR no ledger write happens (the SHA-bound
35
+ receipt is the durable record): head and posted receipt stay identical.
26
36
  12. **Close out the final-review receipt before reporting.** First derive the
27
37
  `Decision` from step 6 and persist step 11. Then, before printing any line of
28
38
  the fixed report block or the `→ Next:` block, complete the receipt action
@@ -80,6 +90,9 @@
80
90
  Manual verification (a human must check):
81
91
  - <item> …
82
92
 
93
+ Notes (low · report-only, never persisted):
94
+ - <finding + evidence, or none>
95
+
83
96
  Proposals (step 10): <n> — batched for the user, no issues created (D3)
84
97
 
85
98
  Summary: <1-2 sentences>
@@ -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`,
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-code
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: >
@@ -44,6 +44,15 @@ default branch. State the scope at the top of the returned table.
44
44
  ✓ Edge cases the SPEC's dev scenarios name are actually handled in code, not
45
45
  just in tests
46
46
 
47
+ ## Materiality bar
48
+
49
+ Report a row only when a competent user's outcome changes or a rule the project
50
+ explicitly declares is violated — cite the rule it violates beside the evidence.
51
+ Not findings: comment/punctuation typos, formatting-only drift, style preference
52
+ with no cited rule, hypothetical robustness beyond the SPEC's named scenarios.
53
+ An empty table with `Decision: PASS` is the expected result for a well-formed
54
+ change — never pad the table.
55
+
47
56
  ## Return exactly
48
57
 
49
58
  ```
@@ -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.6.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
@@ -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.4.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 (`/loop-review-fold` →
97
+ `/fold-findings`), 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.4.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 (`/loop-review-fold` → `/fold-findings`).
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: verification-contract
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: >
@@ -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