@gtrabanco/pi-agentic-workflow 0.12.0 → 0.13.2

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 (48) hide show
  1. package/package.json +5 -4
  2. package/skills/audit-docs/SKILL.md +6 -5
  3. package/skills/audit-pr/SKILL.md +2 -2
  4. package/skills/design-feature/SKILL.md +1 -1
  5. package/skills/evidence-grounding/SKILL.md +1 -1
  6. package/skills/execute-phase/SKILL.md +2 -2
  7. package/skills/execute-phase/references/EXECUTION_CONTRACT.md +19 -0
  8. package/skills/execute-phase/references/FOLDING.md +9 -2
  9. package/skills/fold-findings/SKILL.md +6 -4
  10. package/skills/generate-docs/SKILL.md +1 -1
  11. package/skills/implementation-discovery/SKILL.md +1 -1
  12. package/skills/init-workspace/SKILL.md +1 -1
  13. package/skills/log-session/SKILL.md +1 -1
  14. package/skills/orchestration-envelope/SKILL.md +1 -1
  15. package/skills/phase-contract/SKILL.md +1 -1
  16. package/skills/plan-feature/SKILL.md +5 -4
  17. package/skills/plan-feature-from-issue/SKILL.md +1 -1
  18. package/skills/plan-feature-scaffold/SKILL.md +1 -1
  19. package/skills/plan-fix/SKILL.md +1 -1
  20. package/skills/planning-preflight/SKILL.md +1 -1
  21. package/skills/pre-execution-review/SKILL.md +2 -2
  22. package/skills/pre-execution-review/references/LEDGERS.md +35 -2
  23. package/skills/product-audit/SKILL.md +4 -4
  24. package/skills/product-audit/references/AUDIT_DIMENSIONS.md +1 -1
  25. package/skills/product-audit/references/AUDIT_PROCESS.md +1 -1
  26. package/skills/replan-findings/SKILL.md +4 -4
  27. package/skills/review-a11y/SKILL.md +1 -1
  28. package/skills/review-brand/SKILL.md +1 -1
  29. package/skills/review-change/SKILL.md +7 -5
  30. package/skills/review-change/references/OUTPUT_AND_GUARDRAILS.md +2 -1
  31. package/skills/review-change/references/PERSIST_AND_DECIDE.md +17 -11
  32. package/skills/review-code/SKILL.md +1 -1
  33. package/skills/review-debt/SKILL.md +1 -1
  34. package/skills/review-design/SKILL.md +1 -1
  35. package/skills/review-implementation/SKILL.md +2 -2
  36. package/skills/review-implementation/references/CLASSIFY.md +55 -0
  37. package/skills/review-perf/SKILL.md +1 -1
  38. package/skills/review-plan/SKILL.md +1 -1
  39. package/skills/review-security/SKILL.md +1 -1
  40. package/skills/review-seo/SKILL.md +1 -1
  41. package/skills/review-spec/SKILL.md +1 -1
  42. package/skills/review-verify/SKILL.md +1 -1
  43. package/skills/triage-issue/SKILL.md +1 -1
  44. package/skills/verification-contract/SKILL.md +1 -1
  45. package/skills/workflow-status/SKILL.md +2 -2
  46. package/skills/workflow-status/references/ENVELOPE_CORE.md +5 -4
  47. package/skills/workflow-status/references/SENSOR_CORE.md +5 -4
  48. package/skills/workflow-status/references/SENSOR_SIGNALS.md +3 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtrabanco/pi-agentic-workflow",
3
- "version": "0.12.0",
3
+ "version": "0.13.2",
4
4
  "description": "Pi package: canonical agentic-workflow skills, friendly slash commands, and per-command model routing.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -11,7 +11,7 @@
11
11
  "model-routing"
12
12
  ],
13
13
  "license": "MIT",
14
- "author": "Gabriel Trabanco <gtrabanco@users.noreply.github.com>",
14
+ "author": "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>",
15
15
  "repository": {
16
16
  "type": "git",
17
17
  "url": "git+https://github.com/gtrabanco/agentic-workflow.git",
@@ -44,6 +44,7 @@
44
44
  "scripts": {
45
45
  "build": "tsc",
46
46
  "bundle:skills": "bun scripts/bundle-skills.mjs",
47
+ "bundle:skills:check": "bun scripts/bundle-skills.mjs --check",
47
48
  "test": "tsc && bun test test/*.test.mjs",
48
49
  "test:node": "tsc && node --test test/*.test.mjs",
49
50
  "prepublishOnly": "bun run build && bun run test",
@@ -51,10 +52,10 @@
51
52
  "prepare": "bun run build"
52
53
  },
53
54
  "peerDependencies": {
54
- "@earendil-works/pi-coding-agent": ">=0.85.1"
55
+ "@earendil-works/pi-coding-agent": ">=0.87.0"
55
56
  },
56
57
  "dependencies": {
57
- "@earendil-works/pi-tui": "0.85.1"
58
+ "@earendil-works/pi-tui": "0.87.0"
58
59
  },
59
60
  "devDependencies": {
60
61
  "@types/node": "24.13.3",
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: audit-docs
3
3
  user-invocable: true
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  argument-hint: "[--fix]"
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Audit cross-document coherence: docs ↔ roadmap ↔ code ↔ fix index ↔ issues.
@@ -95,7 +95,7 @@ run the command shown, don't infer.
95
95
  `Docs site` block; otherwise state n/a).** Scan the declared content dir
96
96
  for pages carrying `generated-by: agentic-workflow/generate-docs`. For
97
97
  each: (a) its `source-unit` exists in the roadmap or fix index — no match
98
- is an **orphan** (MEDIUM: propose deletion or re-attribution); (b) the
98
+ is an **orphan** (low: propose deletion or re-attribution); (b) the
99
99
  unit's PR merged **after** the page's `updated` date with commits touching
100
100
  the page's subject paths — that page is **stale** (LOW: propose
101
101
  `/generate-docs <unit>` to refresh). Cite page path + unit per finding.
@@ -118,16 +118,17 @@ say so.
118
118
  ```
119
119
  AUDIT DOCS — scope: <docs tree / roadmap / fix index / issues checked>
120
120
 
121
- | # | Check (1-13) | Finding | Sev | Evidence | Proposed fix |
121
+ | # | Check (1-14) | Finding | Sev | Evidence | Proposed fix |
122
122
  |---|-------------|---------|-----|----------|--------------|
123
123
  | 1 | <which> | <what> | high|low | <path:line / #issue> | <smallest action> |
124
124
 
125
- Checks run: <n>/13 (skipped: <which + why — absent structures only>)
125
+ Checks run: <n>/14 (skipped: <which + why — absent structures only>)
126
126
  Summary: <1-2 sentences>
127
127
  Decision: PASS | FAIL (FAIL if any high-severity finding is open)
128
128
  ```
129
129
 
130
130
  Sev: **high** = misleading or broken; **low** = cosmetic.
131
+ Only `high` and `low` are defined in this legend
131
132
  3. **Fix only on request.** With explicit `--fix` (or user go-ahead), apply the
132
133
  low-risk corrections (remove a merged fix-index row, fix a dead link, register
133
134
  a missing roadmap entry, add a verified PR link to a bare `done` row). Leave judgment calls to the user.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: audit-pr
3
3
  user-invocable: true
4
- version: 5.2.1
4
+ version: 5.3.0
5
5
  argument-hint: <pr-number> (optional — defaults to the current branch's PR)
6
6
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -51,7 +51,7 @@ independently evaluates only the delivery gates below.
51
51
  ✓ No review pass was composed or reconstructed: a missing/stale receipt is a
52
52
  blocker, never a prompt to re-run review axes from this skill
53
53
  ✓ Closure integrity was evaluated and its result stated explicitly: pass /
54
- blocker / warning / n-a (fix-governed PRs are always n-a; never skipped
54
+ blocker / n-a (fix-governed PRs are always n-a; never skipped
55
55
  silently)
56
56
  ✓ Scope integrity (descope) was evaluated and its result stated explicitly:
57
57
  pass / blocker / n-a (no unit-referencing issues born on the branch → n-a;
@@ -3,7 +3,7 @@ name: design-feature
3
3
  user-invocable: true
4
4
  version: 3.5.0
5
5
  argument-hint: <idea | NN-slug> [<instruction>]
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Turn a raw idea or existing feature into a designed product SPEC by completing
@@ -2,7 +2,7 @@
2
2
  name: evidence-grounding
3
3
  user-invocable: false
4
4
  version: 1.6.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal shared owner of evidence-grounded authoring: the fixed
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: execute-phase
3
3
  user-invocable: true
4
- version: 4.6.0
4
+ version: 4.7.0
5
5
  argument-hint: <NN> [P<k>] | --fix <n> [P<k>] | [--max-attempts N] [--force]
6
6
  allowed-tools: [Bash, Read, Edit, Write, MultiEdit]
7
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
8
8
  license: MIT
9
9
  description: >
10
10
  Implement all remaining phases of a planned feature/fix by default, or one
@@ -57,6 +57,25 @@ never treat a missing marker as a blocker or crash condition.
57
57
  Something forbidden looks necessary → stop, record it in `decisions.md` or
58
58
  `known-issues.md`, and surface it — never do it silently.
59
59
 
60
+ ## Gate-run mark
61
+
62
+ The phase completion gate records a `GATE-RAN` mark at the head it ran and
63
+ consumes an identical-head green mark instead of re-running. The mark's shape,
64
+ ownership, and reuse rule are declared in `LEDGERS.md` (§gate-ran@1).
65
+
66
+ ```text
67
+ GATE-RAN | HEAD <40-hex sha> | <cmds> | exit <code>
68
+ ```
69
+
70
+ - **Record**: whoever runs the project gate records a mark at the head the gate
71
+ actually ran. A green run is recorded; a red run is also recorded (exit code
72
+ ≠ 0 is evidence, not silence).
73
+ - **Consume**: any skill may consume a green run only at the identical HEAD. A
74
+ changed head ⇒ re-run the gate.
75
+ - **Recorder column-sets**: `execute-phase:gate-ran-marks` (executor phase gates)
76
+ and `review-change:review-gate-ran-marks` (reviewer gate runs) are declared in
77
+ the `review-findings` truth-class row's owner cell.
78
+
60
79
  ## Phase completion gate — pass only if (every box, every phase)
61
80
 
62
81
  ```
@@ -23,8 +23,8 @@ end up "solved" locally but absent from the merged PR:
23
23
  (known-issues.md entry resolved? progress.md notes the fold)
24
24
  ✓ Each folded finding's row in the unit's `review-findings.md` ledger (if one
25
25
  exists — the ledger is optional; a unit with no fix-now findings has none)
26
- flipped `folded: no → yes` — the one and only ledger state transition, owned
27
- solely by this fold cycle
26
+ flipped `folded: no → yes` — the one and only ledger state transition,
27
+ `ledger-ownership@1` / `fold-findings:folded-flag` is the sole writer
28
28
  ✓ `git add` + `git commit` RUN (sha pasted) — e.g.
29
29
  `fix(<scope>): fold review findings — <summary>`
30
30
  ✓ `git push` RUN (PR is open → every commit pushes immediately)
@@ -35,6 +35,13 @@ Then hand back to the gate that sent you (`/review-change` re-review, or
35
35
  `/audit-pr` re-audit). Never report findings as resolved while any box is
36
36
  unchecked — an unpushed fix does not exist for CI, the reviewer, or the merge.
37
37
 
38
+ ## Gate-run mark (P4)
39
+
40
+ A `GATE-RAN` mark is appended to the unit's `review-findings.md` ledger at the
41
+ head the gate actually ran. The mark's shape and ownership rule are declared in
42
+ `LEDGERS.md` (§gate-ran@1). A green run is recorded; a red run is also recorded.
43
+ The identical-head reuse rule is documented in `EXECUTION_CONTRACT.md` (§gate-ran).
44
+
38
45
  Final-phase / single-pass / fix hand-off:
39
46
 
40
47
  ```
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: fold-findings
3
3
  user-invocable: true
4
- version: 1.5.1
4
+ version: 1.6.0
5
5
  argument-hint: [finding-id …]
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Repair persisted fix-now findings in compatible atomic batches: root-cause
@@ -154,8 +154,10 @@ audit-pr ──BLOCKED─────┼──▶ fold-findings ──FOLDED─
154
154
  │ ──BLOCKED──▶ user supplies missing input
155
155
  ```
156
156
 
157
- `review-change`/`audit-pr` classify and persist; this skill only flips
158
- `folded: no` to `yes` after a real fix. `execute-phase`'s embedded fold checklist
157
+ `review-change`/`audit-pr` classify and persist;
158
+ `ledger-ownership@1` / `fold-findings:folded-flag` is the sole writer of
159
+ the `folded: no → yes` flip — this skill only flips that flag after a real
160
+ fix. `execute-phase`'s embedded fold checklist
159
161
  is the inline fallback; this standalone path keeps frozen classification and its
160
162
  forbidden list and never runs above its tier. `DISPUTED` stops for user evidence;
161
163
  no issue is created.
@@ -3,7 +3,7 @@ name: generate-docs
3
3
  user-invocable: true
4
4
  version: 2.0.1
5
5
  argument-hint: "[NN-slug | fix-n | path/glob] [--review]"
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Generate incremental, diff-driven developer guides through the project's
@@ -2,7 +2,7 @@
2
2
  name: implementation-discovery
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal contract: the single owner of the bounded pre-write implementation
@@ -3,7 +3,7 @@ name: init-workspace
3
3
  user-invocable: true
4
4
  version: 2.9.0
5
5
  argument-hint: <target-dir>
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Adapt the workflow scaffold to a new repository or add only missing substrate
@@ -3,7 +3,7 @@ name: log-session
3
3
  user-invocable: true
4
4
  version: 2.2.0
5
5
  argument-hint: "[note to prepend to the entry]"
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Append a structured entry to the project's session log (`docs/LOGS.md`):
@@ -2,7 +2,7 @@
2
2
  name: orchestration-envelope
3
3
  user-invocable: false
4
4
  version: 2.2.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal machine-result contract for headless agentic-workflow drivers. The
@@ -2,7 +2,7 @@
2
2
  name: phase-contract
3
3
  user-invocable: false
4
4
  version: 1.0.5
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal contract: the single owner of the eight phase-lint rules, the fixed
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: plan-feature
3
3
  user-invocable: true
4
- version: 5.2.0
4
+ version: 5.3.1
5
5
  argument-hint: <NN-slug | #N> | --from-issue N | --scaffold <slug> | --next
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Route designed features or issues into engineering planning and roadmap
@@ -91,8 +91,9 @@ one hop from this file, and fail closed when missing.
91
91
  the internal steps; never re-fetched mid-plan.
92
92
  4. **Confirm roadmap.** Verify the feature is registered in
93
93
  `docs/features/ROADMAP.md` with the right number, ordering, and dependencies;
94
- if any of the three is missing or wrong, fix the entry now — never leave
95
- registration for later.
94
+ if any of the three is missing or wrong, fix the entry now — never leave registration for later.
95
+ `plan-feature` verifies and repairs the roadmap entry; `plan-feature-scaffold`
96
+ is the sole writer of the `defined → planned` write.
96
97
  5. **Dependency & blocker check (always, before recommending execution).**
97
98
  - Walk the feature's `Depends on:` closure (transitively): every dependency
98
99
  must be `done` **and merged**. Any unmet → the closing block recommends
@@ -2,7 +2,7 @@
2
2
  name: plan-feature-from-issue
3
3
  user-invocable: false
4
4
  version: 2.0.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal step of plan-feature: turn a feature-request issue into a scoped,
@@ -2,7 +2,7 @@
2
2
  name: plan-feature-scaffold
3
3
  user-invocable: false
4
4
  version: 2.4.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal step of plan-feature: from an already-designed SPEC (product half
@@ -3,7 +3,7 @@ name: plan-fix
3
3
  user-invocable: true
4
4
  version: 3.3.0
5
5
  argument-hint: <issue-number> [<issue-number> …]
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Draft and locally commit a tightly scoped, phased fix SPEC from one or more
@@ -2,7 +2,7 @@
2
2
  name: planning-preflight
3
3
  user-invocable: false
4
4
  version: 1.1.1
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal planning gate: consumes the normalized repository state and makes
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: pre-execution-review
3
3
  user-invocable: false
4
- version: 2.3.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
4
+ version: 2.5.1
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal owner of the pre-execution review cycle and the planning ledgers:
@@ -118,7 +118,7 @@ The one-owner rule, stated once so every skill and template can cite it here:
118
118
  **a durable ledger has exactly one writer per column set, plus at most one
119
119
  declared mechanical annotator, which may append only the token its own row
120
120
  names.** Nobody else writes a row — not a reviewer, not a later phase, not a
121
- script. So `fold-findings` flips only the `folded:` flag `triage-issue` gives it,
121
+ script. So `fold-findings` flips only the `folded:` flag per the map's `fold-findings:folded-flag` owner entry,
122
122
  and `scripts/ledger-provenance.mjs` appends only the marker it really emits:
123
123
  its `· fold <sha>` (or `· ticked <sha>` on a row that scores 1) plus the
124
124
  `· REOPENED — provenance unproven` note when a tick has no matching
@@ -142,7 +142,7 @@ must pass; the CI node-compat job enforces the fallback.
142
142
  ```text
143
143
  ledger-ownership@1
144
144
  truth-class | ledger | owner | annotator | annotator-token | validator
145
- review-findings | docs/features/<NN>-<slug>/review-findings.md · docs/fix/<issue>-<topic>/review-findings.md | review-change:finding-rows + review-change:finding-mark + review-change:review-mark + audit-pr:audit-rows + triage-issue:triage-rows + fold-findings:folded-flag | scripts/ledger-provenance.mjs | · fold <sha> + · ticked <sha> + · REOPENED | bun test scripts/ledger-provenance.test.mjs
145
+ review-findings | docs/features/<NN>-<slug>/review-findings.md · docs/fix/<issue>-<topic>/review-findings.md | review-change:finding-rows + review-change:finding-mark + review-change:review-mark + review-change:review-gate-ran-marks + audit-pr:audit-rows + triage-issue:triage-rows + execute-phase:gate-ran-marks + fold-findings:folded-flag | scripts/ledger-provenance.mjs | · fold <sha> + · ticked <sha> + · REOPENED | bun test scripts/ledger-provenance.test.mjs
146
146
  planning-findings | docs/features/<NN>-<slug>/planning-findings.md · docs/fix/<issue>-<topic>/planning-findings.md | review-spec:spec-stage-rows + review-plan:plan-stage-rows + design-feature:product-class-resolutions + plan-feature:plan-class-resolutions + plan-fix:fix-plan-class-resolutions + fold-findings:source-class-resolutions | none | none | bun test scripts/pre-execution-quality.test.mjs
147
147
  progress | docs/features/<NN>-<slug>/progress.md · docs/fix/<issue>-<topic>/progress.md | plan-feature-scaffold:create + execute-phase:phase-entries + execute-phase:gate-rejection-traces + review-spec:product-receipt + review-plan:plan-receipt | none | none | bun test scripts/pre-execution-sensor.test.mjs
148
148
  known-issues | docs/features/<NN>-<slug>/known-issues.md · docs/fix/<issue>-<topic>/known-issues.md | plan-feature-scaffold:create + execute-phase:blocker-entries-and-status | none | none | bun test scripts/ledger-ownership.test.mjs
@@ -207,3 +207,36 @@ reproducer as its regression check — it never re-derives it; a `recheck` cell
207
207
  that cannot be materialized yields `BLOCKED <missing input>`. This consumption
208
208
  leaves the row shape, the `VF-` exclusions, and the `review-change`
209
209
  single-writer rule untouched.
210
+
211
+ ### The gate-run mark
212
+
213
+ A gate run — green or red — leaves a durable mark in the unit's
214
+ `review-findings.md` ledger (for features:
215
+ `docs/features/<NN>-<slug>/review-findings.md`, for fixes:
216
+ `docs/fix/<issue>-<topic>/review-findings.md`), owned by the `review-findings`
217
+ truth-class row's owner cell extended with the two recorder column-sets:
218
+
219
+ ```text
220
+ gate-ran@1
221
+ id | file:line | cmds | exit | [additive-slots ...]
222
+ GATE-RAN | HEAD <40-hex sha> | <cmds> | exit <code> | [reserved trailing slot: `manifest <sha>`]
223
+ ```
224
+
225
+ - **Fixed format** (the one grammar; every consumer cites this block):
226
+ `GATE-RAN | HEAD <sha> | <cmds> | exit <code>` — every run records the SHA,
227
+ the commands run, and the exit code (green and red alike; `exit 0` is green).
228
+ `<cmds>` is the runnable command(s) the gate ran, joined by ` | ` when several.
229
+ - **Additive slots**: fields after `HEAD` are additive; consumers ignore unknown
230
+ trailing fields (feature 35's `manifest <sha>` slot is reserved, not yet
231
+ consumed).
232
+ - **Identical-head reuse**: any skill may consume a **green** run only at the
233
+ identical HEAD; a changed head ⇒ re-run the gate. A red mark is never
234
+ consumed as a pass.
235
+ - **Recorder column-sets**: the `review-findings` truth-class row's owner cell
236
+ declares `execute-phase:gate-ran-marks` (executor phase gates) and
237
+ `review-change:review-gate-ran-marks` (reviewer gate runs), distinct column-set
238
+ names per the one-writer-per-column-set rule.
239
+ - **Owner extension**: the identical owner cell is mirrored into both template
240
+ projections (`docs/features/_TEMPLATE/LEDGERS.md` and `docs/fix/_TEMPLATE/LEDGERS.md`).
241
+ - **No new truth-class row**: the grammar admits no new row — the existing
242
+ `review-findings.md` ledger pattern is reused with extended owner cells.
@@ -2,11 +2,11 @@
2
2
  name: product-audit
3
3
  user-invocable: true
4
4
  disable-model-invocation: true
5
- version: 3.1.0
5
+ version: 3.2.0
6
6
  metadata:
7
7
  opencode/autoinvoke: false
8
8
  argument-hint: <path-or-area> (optional — defaults to the whole product)
9
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
9
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
10
10
  license: MIT
11
11
  description: >
12
12
  Audit the whole product across code, quality, process, docs, roadmap, and
@@ -97,12 +97,12 @@ Verdict: <one-line honest health verdict>
97
97
  Installed tooling ....... ✓ | ⚠ | ✗ | n-a
98
98
 
99
99
  ## Findings (severity-ranked, one F-sequence for the whole audit)
100
- F1 [SEV] <dimension> — <finding> — evidence: <file:line | metric | doc> — class: <fix-now|postpone|tradeoff>
100
+ F1 [SEV] <dimension> — <finding> — evidence: <file:line | metric | doc> — class: <fix-now|replan-in-unit|decision-required|proposal|ignore>
101
101
  F2 [SEV] ...
102
102
  [example — scope-export recurrence] F<k> [med] Workflow discipline — <N>
103
103
  consecutive units exported scope via `## Amendments`/descope issues —
104
104
  features are being cut too big for real capacity — evidence: <unit list +
105
- amendments/issues> — class: postpone — route: #64 (atomicity/split rules)
105
+ amendments/issues> — class: proposal — route: #64 (atomicity/split rules)
106
106
 
107
107
  ## Delta vs audit <prior-id>
108
108
  New: F<k>
@@ -12,7 +12,7 @@
12
12
  | **Brand / voice** | User-facing copy vs. the brand guide | surfaces with copy |
13
13
  | **Tech debt** | Accumulated shortcuts, TODO/FIXME, stale abstractions | all |
14
14
  | **Process & docs** | Incomplete phases, aging open issues, **solvable known-issues**, doc completeness, missing/optimizable workflow docs, capability-inventory freshness (`docs/CAPABILITIES.md` ↔ code drift) | all |
15
- | **Workflow discipline** | The workflow's own rules held: branch/PR discipline, `done · #<pr>` links, phase naming (`P1…`), per-phase docs, commit format, dependency closures, artifact language — **run `audit-docs` checks 1–13 mechanically** (compose it); never assume a rule held because it "should". **Scope-export recurrence:** across the most recent units (merged or in-flight), each with a non-empty `## Amendments` descope log or a descope-classified born issue (`audit-pr`'s scope-bleed gate) counts as one scope-exporting unit — **≥ 2 consecutive** such units is a planning-quality finding ("features cut too big for real capacity"), routed to the atomicity/split rules (**#64**), not re-litigated as a per-unit defect | all |
15
+ | **Workflow discipline** | The workflow's own rules held: branch/PR discipline, `done · #<pr>` links, phase naming (`P1…`), per-phase docs, commit format, dependency closures, artifact language — **run `audit-docs` checks mechanically** (cite the count from `audit-docs`; never restated in the dimension table); never assume a rule held because it "should". **Scope-export recurrence:** across the most recent units (merged or in-flight), each with a non-empty `## Amendments` descope log or a descope-classified born issue (`audit-pr`'s scope-bleed gate) counts as one scope-exporting unit — **≥ 2 consecutive** such units is a planning-quality finding ("features cut too big for real capacity"), routed to the atomicity/split rules (**#64**), not re-litigated as a per-unit defect | all |
16
16
  | **Roadmap coherence** | Stale/obsolete/superseded features, missing dependencies, gaps & opportunities | all |
17
17
  | **Installed tooling** | Installed skills + connected MCP servers vs. the project's applicable axes and roadmap features — unregistered-but-useful items, and tooling that would change a feature's scope | all |
18
18
 
@@ -4,7 +4,7 @@
4
4
  2. **Sweep code & axes** — run the applicable axes across the codebase: compose
5
5
  `review-implementation` plus the internal review pack's applicable passes
6
6
  (each returns its fixed-format table + PASS|FAIL), and any optional installed
7
- extras. Classify findings (severity + fix-now / postpone / tradeoff).
7
+ extras. Classify findings (severity + closed class set from review-implementation/CLASSIFY.md).
8
8
 
9
9
  **Evidence-provenance gate (fixed):** applies during every evidence-collecting sweep
10
10
  step (2–5). Each item ends with exactly one fallback; never pick another one mid-audit.
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: replan-findings
3
3
  user-invocable: false
4
- version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
4
+ version: 1.1.1
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal contract: the conditional replan entry. Loaded only when
@@ -67,8 +67,8 @@ fingerprint: <sha256 over the inputs the answer used>
67
67
  - `read-set` is the bounded intake below: at most 12 paths, then an explicit
68
68
  `… and N more` line — never a silent truncation.
69
69
  - `open-rows`/`rows:` come from the ledger's open rows only (`folded` not
70
- `yes`/`—`/`-`/`n/a`/empty), and the id shapes `VF-<n>` and `REVIEW-RAN` are
71
- marks, never findings.
70
+ `yes`/`—`/`-`/`n/a`/empty), and the id shapes `VF-<n>`, `REVIEW-RAN` and
71
+ `GATE-RAN` are marks, never findings.
72
72
 
73
73
  Exit codes are part of the contract: a route prints and exits **0**; an unknown
74
74
  unit, or any argument count other than one, exits **1**; an ambiguous token (a
@@ -2,7 +2,7 @@
2
2
  name: review-a11y
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal accessibility review pass of the agentic-workflow review pack —
@@ -2,7 +2,7 @@
2
2
  name: review-brand
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal brand & copy review pass of the agentic-workflow review pack — composed
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: review-change
3
3
  user-invocable: true
4
- version: 3.6.0
4
+ version: 3.7.0
5
5
  argument-hint: <path-or-glob> [--adversarial N] [--synthesize]
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Review a change with only applicable internal axes, classify every finding,
@@ -152,12 +152,14 @@ sequential/headless fallbacks; never collapse independent adversarial passes.
152
152
  Orchestrates internal finders (`review-code`, `review-security`, `review-verify`,
153
153
  `review-design`, `review-a11y`, `review-brand`, `review-perf`, `review-seo`), then
154
154
  one `review-implementation` classifier and `review-debt` transform, isolated by
155
- default; installed platform packs are optional. `triage-issue` is user-invoked
156
- only for independent proposals (D3). It is Stage 4: checkpoint reviews are
155
+ default; installed platform packs are optional. `triage-issue` is user-invoked,
156
+ never auto-run (D3), for independent proposals, audit findings, and
157
+ `--prioritize-now` runs. It is Stage 4: checkpoint reviews are
157
158
  optional, the end review is mandatory and fresh. `fix-now` is routed to the
158
159
  unit's fold cycle — a separate `/fold-findings` invocation, never run by this review;
159
160
  `replan-in-unit` adds user-confirmed phases, and independent work becomes
160
- proposals. `audit-pr` consumes only the verified PR-comment receipt, never the
161
+ proposals. `audit-pr` consumes
162
+ only the verified PR-comment receipt, never the
161
163
  chat report; `product-audit` is the periodic sweep. On `REVIEW-FAIL` the manual
162
164
  correction path is `/fold-findings`, then re-run `/review-change` on the changed
163
165
  HEAD (bounded at two cycles — a third cycle never starts without an explicit
@@ -35,7 +35,8 @@ lost, and none becomes reviewer-created backlog (D3):
35
35
  - **fix-now / `decision-required`** → stop and surface the decision to the user;
36
36
  the unit blocks until decided. No issue is created.
37
37
  - **proposal** (independent future capability) → batched in the report with a
38
- trigger; only the **user** routes it to `triage-issue`.
38
+ trigger; only the **user** routes it to `triage-issue` (independent
39
+ proposals, audit findings, or `--prioritize-now` runs).
39
40
  - **ignore** → note the rationale in the report; no further action.
40
41
 
41
42
  The report's `Decision:` line is **three-state** (D10): `REVIEW-PASS` when the
@@ -18,14 +18,17 @@ exact command tokens.
18
18
  `gh pr view --json state` when a PR is open; otherwise the unit is unmerged
19
19
  by definition). Otherwise, for each **fix-now** finding of severity `high`
20
20
  or `med` (only ledger severities; finder scale
21
- `critical`→`high`, `major`→`med`, `minor`→`low`): append a row
21
+ converts through the canonical table in
22
+ `CLASSIFY.md`):
23
+ append a row
22
24
  (create the file with the header row when missing), carrying the
23
25
  verbatim `Sev` value into `severity`; `folded` always starts `no` — that
24
26
  row comes from a **confirmed** candidate only and carries its
25
27
  `finding-mark@1` signature on a **separate `VF-` row** (reviewer, head SHA,
26
28
  recheck + reproducer), as modeled in `LEDGERS.md` (§finding-mark@1) and the
27
29
  fixture.
28
- `execute-phase`'s fold cycle is the only step that ever flips it to `yes`.
30
+ `ledger-ownership@1` / `fold-findings:folded-flag` is the sole writer of
31
+ the `folded: no → yes` flip.
29
32
  A `low` finding is **never persisted to the fold ledger** — report-only
30
33
  note (step 13), never blocking (finders' materiality floor). Re-runs
31
34
  **dedupe by `file:line` + axis**:
@@ -35,16 +38,19 @@ exact command tokens.
35
38
  **Non-fix-now findings are never written here** — they keep
36
39
  their destinations from step 11 (outcome routing): independent future
37
40
  capabilities batch as proposals; only the user routes them to `triage-issue`
38
- (D3).
39
- **Commit the ledger append** — rows + `REVIEW-RAN` mark, one commit
40
- (`docs(<unit>): persist review findings F<n>–F<m>`), pushed when a PR is open;
41
+ (independent proposals, audit findings, or `--prioritize-now` runs) (D3).
42
+ **Commit the ledger append** — rows + `REVIEW-RAN` + `GATE-RAN` marks,
43
+ one commit (a reviewer records a `GATE-RAN` mark for the gate run the review
44
+ performed and consumes an identical-head green mark instead of re-running,
45
+ see `LEDGERS.md` §gate-ran@1; `docs(<unit>): persist review findings`);
46
+ pushed when a PR is open;
41
47
  an uncommitted append hands the next review a dirty-tree stop. On
42
- `REVIEW-PASS` with an open PR no ledger write happens (the SHA-bound
43
- receipt is the durable record): head and posted receipt stay identical.
44
- This skill's only mutations are this ledger commit (step 11) and, on
45
- `REVIEW-PASS` with a PR, the receipt comment (step 12) — it never runs a
46
- fold, executes a phase, or edits source (see the review-end turn boundary in
47
- the SKILL.md Turn contract).
48
+ `REVIEW-PASS` with an open PR the SHA-bound receipt is the durable record:
49
+ head and posted receipt stay identical.
50
+ This skill's only mutations are the rows + `REVIEW-RAN` + `GATE-RAN` marks
51
+ (all in the step 11 commit), and, on `REVIEW-PASS` with a PR, the receipt
52
+ comment (step 12) — it never runs a fold, executes a phase, or edits source
53
+ (see the review-end turn boundary in the SKILL.md Turn contract).
48
54
  12. **Close out the final-review receipt before reporting.** Derive the
49
55
  `Decision` from step 7 and persist step 11 first. Then — **only on
50
56
  `Decision: REVIEW-PASS` and when the PR exists** — run the receipt emitter,
@@ -2,7 +2,7 @@
2
2
  name: review-code
3
3
  user-invocable: false
4
4
  version: 1.2.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal correctness + simplification review pass of the agentic-workflow
@@ -2,7 +2,7 @@
2
2
  name: review-debt
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal tech-debt transform pass of the agentic-workflow review pack —
@@ -2,7 +2,7 @@
2
2
  name: review-design
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal UI/UX design review pass of the agentic-workflow review pack —
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: review-implementation
3
3
  user-invocable: false
4
- version: 1.8.0
4
+ version: 1.9.0
5
5
  argument-hint: <path-or-glob>
6
6
  allowed-tools: Read, Grep, Glob, Bash, WebFetch
7
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
8
8
  license: MIT
9
9
  description: >
10
10
  Internal scope/classification engine composed by review-change (and reused by
@@ -5,6 +5,61 @@ the **synthesized** findings table (D5). Classify each finding into exactly one
5
5
  class, in this order. Never reopen source files to classify; the table's
6
6
  evidence is authoritative.
7
7
 
8
+ ### Severity conversion (canonical table)
9
+
10
+ The single-owner table below maps every severity scale the review pack emits
11
+ onto the classification scale (`high | med | low`). Only this section may
12
+ convert — a consumer facing an unknown scale **fails closed** (no ad-hoc
13
+ conversion). The table replaces the ad-hoc mapping that lived at
14
+ `PERSIST_AND_DECIDE.md`.
15
+
16
+ The sensor's own `SEVERITY_VOCABULARY` map (`scripts/workflow-status.mjs:718-721`)
17
+ is a direct projection of this table onto the envelope schema's `high|med|low`
18
+ enum, not a competing converter; it always produces a value listed here.
19
+
20
+ | Producer scale | → `high` | → `med` | → `low` |
21
+ |---|---|---|---|
22
+ | Ledger (`CLASSIFY.md` itself): `high` | self | — | — |
23
+ | Ledger: `med` | — | self | — |
24
+ | Ledger: `low` | — | — | self |
25
+ | Finder (nine review passes): `critical` → `high` | ✓ | — | — |
26
+ | Finder: `major` → `med` | — | ✓ | — |
27
+ | Finder: `minor` → `low` | — | — | ✓ |
28
+ | Planning: `critical` → `high` | ✓ | — | — |
29
+ | Planning: `high` → `high` | ✓ | — | — |
30
+ | Planning: `medium` → `med` | — | ✓ | — |
31
+ | Planning: `low` → `low` | — | — | ✓ |
32
+ | Planning: `info` → `low` | — | — | ✓ |
33
+ | `audit-docs`: `high` → `high` | ✓ | — | — |
34
+ | `audit-docs`: `low` → `low` | — | — | ✓ |
35
+
36
+ **Unknown scale → fail closed.** A scale not listed above is an error; the
37
+ consuming skill must not guess.
38
+
39
+ ### Derived blocking gate
40
+
41
+ A finding **blocks** only when the reviewer cites which single-owner source
42
+ fails — blocking is a table lookup over cited sources, never a severity
43
+ opinion. The four citation categories are:
44
+
45
+ 1. **ACCEPTANCE criterion** unverified or failed.
46
+ 2. **Obligation row** in the unit's ledger is not `verified` or `n-a`.
47
+ 3. **Gate is red** at the reviewed head (the project gate exited non-zero at
48
+ the exact head under review).
49
+ 4. **Open confirmed `fix-now` row** on the fold ledger (a finding already
50
+ persisted as `fix-now` with `folded: no`).
51
+
52
+ No citation among these four categories → the finding is a **report-note** or
53
+ **proposal**, never blocking. D10's verdict rule (the three-way `REVIEW-PASS |
54
+ REVIEW-FAIL | NEEDS-DECISION` verdict) remains **unchanged** — the derived gate
55
+ operates inside the `REVIEW-FAIL` branch as the evidence that determines whether
56
+ a finding truly blocks.
57
+
58
+ **`report-note` definition owner.** The `report-note` classification is owned by
59
+ `LEDGERS.md` §3 (`:91-96`): material is `medium`+, a `low` row is a persisted
60
+ report-note. Classifying surfaces cite this owner instead of restating the
61
+ materiality bar.
62
+
8
63
  ### Step 1 — `ignore` first (the claim, not a class choice)
9
64
 
10
65
  `ignore` claims **"this is not a real defect"** — a false positive or a
@@ -2,7 +2,7 @@
2
2
  name: review-perf
3
3
  user-invocable: false
4
4
  version: 1.2.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal performance review pass of the agentic-workflow review pack — composed
@@ -3,7 +3,7 @@ name: review-plan
3
3
  user-invocable: true
4
4
  version: 1.7.0
5
5
  argument-hint: <NN-slug | fix-N | path/to/SPEC.md> [--adversarial N]
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Independent read-only review of a frozen Engineering plan before execution, in a
@@ -2,7 +2,7 @@
2
2
  name: review-security
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal security review pass of the agentic-workflow review pack — composed
@@ -2,7 +2,7 @@
2
2
  name: review-seo
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal SEO review pass of the agentic-workflow review pack — composed
@@ -3,7 +3,7 @@ name: review-spec
3
3
  user-invocable: true
4
4
  version: 1.8.0
5
5
  argument-hint: <NN-slug | path/to/SPEC.md>
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Independent read-only review of a frozen Product half before engineering
@@ -2,7 +2,7 @@
2
2
  name: review-verify
3
3
  user-invocable: false
4
4
  version: 1.1.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
8
8
  Internal run-it verification review pass of the agentic-workflow review pack —
@@ -3,7 +3,7 @@ name: triage-issue
3
3
  user-invocable: true
4
4
  version: 2.8.0
5
5
  argument-hint: <issue-number> [more issue numbers…] | <audit-id> F<k> [F<j>…] | --prioritize-now <unit> F<k> [F<j>…]
6
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
8
8
  description: >
9
9
  Verify an issue, persisted audit finding, or unresolved review finding against
@@ -2,7 +2,7 @@
2
2
  name: verification-contract
3
3
  user-invocable: false
4
4
  version: 1.3.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
5
+ author: "Gabriel Trabanco <1969593+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
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: workflow-status
3
3
  user-invocable: true
4
- version: 3.7.0
5
- author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
4
+ version: 3.8.1
5
+ author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  argument-hint: "[--json-only] [--last-envelope <json|path>]"
8
8
  description: >
@@ -9,10 +9,11 @@ placement per the installed `orchestration-envelope` skill. The
9
9
  states** (the schema package needs no release):
10
10
 
11
11
  - `CLEAN` → `state: OK` (the sensor default when the substrate is usable).
12
- - A missing or non-frozen repository-state ledger is a run-scoped substrate
13
- gate and overrides the crash-recovery state with `state: BLOCKED`; the
14
- blocker and concrete discovery/resolution command are emitted before
15
- readiness data.
12
+ - `draft`, `contradicted`, or `resolved` repository-state ledger is a
13
+ run-scoped substrate gate and overrides the crash-recovery state with
14
+ `state: BLOCKED`; the blocker and concrete discovery/resolution command
15
+ are emitted before readiness data.
16
+ An absent ledger is a non-blocking notice, not a blocker.
16
17
  - `RESUMABLE` → `state: CONTINUE`, `next.recommended` = the resume command
17
18
  from the decision table.
18
19
  - `AMBIGUOUS` → `state: NEEDS_INPUT`, `needs_input.question` = what is
@@ -12,12 +12,13 @@ the JSON and interprets it.
12
12
 
13
13
  Read `docs/workflow/REPOSITORY_STATE.md` when present and always emit
14
14
  `detail.repository_state: {status, snapshot_id, source_revision}`. Before
15
- readiness classification, if the ledger is missing, `draft`, `contradicted`, or
15
+ readiness classification, if the ledger is `draft`, `contradicted`, or
16
16
  `resolved`, add a run-scoped `substrate` blocker, set the envelope state to
17
17
  `BLOCKED`, leave `startable_now` empty, and set `next.recommended` to
18
- `/discover-repository-state` for missing/non-frozen state or
19
- `/resolve-repository-state <contradiction-id>` for `contradicted` state. The
20
- sensor remains read-only; it never edits or resolves the ledger. Conflicting
18
+ `/discover-repository-state` for non-frozen state or
19
+ `/resolve-repository-state <contradiction-id>` for `contradicted` state.
20
+ An absent ledger emits a non-blocking substrate notice instead of a blocker.
21
+ The sensor remains read-only; it never edits or resolves the ledger. Conflicting
21
22
  live evidence against a frozen ledger remains a contradiction candidate.
22
23
 
23
24
  3. **Urgency labels (`detail.urgent`) — labels-only, presence-only, never
@@ -83,8 +83,9 @@ mechanized.*
83
83
 
84
84
  A row is **open** under the router's own predicate (`scripts/unit-route.mjs`
85
85
  `isOpen`), never a re-derived one: `folded: yes`, `—`, `-`, `n/a` and an empty
86
- cell all close it. The id shapes `VF-<n>` (a finding's verification mark) and
87
- `REVIEW-RAN` (a review mark) are **never** findings — a ledger pads a mark row
86
+ cell all close it. The id shapes `VF-<n>` (a finding's verification mark),
87
+ `REVIEW-RAN` (a review mark) and `GATE-RAN` (a gate-run mark) are **never**
88
+ findings — a ledger pads a mark row
88
89
  with empty cells, so it reaches the row parser looking like an open finding and
89
90
  would otherwise project a suggestion for a merged unit. A **decision-required**
90
91
  open row contributes **nothing**: it outranks the fold in the route table (which