@gtrabanco/pi-agentic-workflow 0.15.1 → 0.15.3

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 (38) hide show
  1. package/package.json +1 -1
  2. package/skills/audit-docs/SKILL.md +3 -3
  3. package/skills/audit-pr/SKILL.md +8 -8
  4. package/skills/audit-pr/references/01_MERGE_GATES.md +3 -3
  5. package/skills/audit-pr/references/02_CLOSURE_AND_SCOPE_GATES.md +4 -5
  6. package/skills/audit-pr/references/03_AUDIT_PROCESS.md +1 -1
  7. package/skills/audit-pr/references/04_VERDICT.md +3 -3
  8. package/skills/audit-pr/references/05_ROUTING_AND_GUARDRAILS.md +2 -2
  9. package/skills/discover-repository-state/SKILL.md +3 -4
  10. package/skills/execute-phase/SKILL.md +1 -1
  11. package/skills/execute-phase/references/DESCOPE.md +1 -1
  12. package/skills/fold-findings/SKILL.md +8 -8
  13. package/skills/fold-findings/references/FOLD_PROCESS.md +6 -5
  14. package/skills/orchestration-envelope/SKILL.md +4 -3
  15. package/skills/phase-contract/SKILL.md +3 -4
  16. package/skills/pre-execution-review/SKILL.md +10 -7
  17. package/skills/pre-execution-review/references/POLICY.md +17 -8
  18. package/skills/product-audit/SKILL.md +12 -13
  19. package/skills/product-audit/references/AUDIT_PROCESS.md +1 -1
  20. package/skills/resolve-repository-state/SKILL.md +2 -3
  21. package/skills/review-change/SKILL.md +3 -3
  22. package/skills/review-change/references/ADVERSARIAL_RECOMMENDATION.md +1 -1
  23. package/skills/review-change/references/ADVERSARIAL_SETUP.md +1 -1
  24. package/skills/review-change/references/OUTPUT_AND_GUARDRAILS.md +5 -5
  25. package/skills/review-change/references/PERSIST_AND_DECIDE.md +7 -6
  26. package/skills/review-implementation/SKILL.md +1 -1
  27. package/skills/review-implementation/references/CLASSIFY.md +13 -11
  28. package/skills/triage-issue/SKILL.md +11 -10
  29. package/skills/triage-issue/references/ISSUE_PROCESS.md +11 -10
  30. package/skills/triage-issue/references/LABELS.md +3 -3
  31. package/skills/triage-issue/references/REVIEW_FINDING_PROCESS.md +6 -6
  32. package/skills/unit-lane/SKILL.md +24 -9
  33. package/skills/workflow-status/SKILL.md +22 -17
  34. package/skills/workflow-status/references/CRASH_RECOVERY.md +6 -6
  35. package/skills/workflow-status/references/ENVELOPE_CORE.md +1 -4
  36. package/skills/workflow-status/references/ENVELOPE_FIELDS.md +42 -7
  37. package/skills/workflow-status/references/PRE_EXECUTION.md +5 -0
  38. package/skills/workflow-status/references/SENSOR_SIGNALS.md +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtrabanco/pi-agentic-workflow",
3
- "version": "0.15.1",
3
+ "version": "0.15.3",
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: audit-docs
3
3
  user-invocable: true
4
- version: 2.1.1
4
+ version: 2.2.0
5
5
  argument-hint: "[--fix]"
6
6
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -156,7 +156,7 @@ enables:
156
156
 
157
157
  ## Relationship to other skills
158
158
 
159
- - Complements `plan-feature` (which *creates* the docs this audits) and
159
+ - Complements `unit-lane` (which *creates* the docs this audits) and
160
160
  `triage-issue` (which keeps the fix index honest).
161
161
  - Run standalone anytime; no required predecessor.
162
162
 
@@ -168,6 +168,6 @@ enables:
168
168
 
169
169
  ```
170
170
  → Next: apply the approved low-risk fixes, then re-run /audit-docs to confirm clean
171
- · real drift (not cosmetic) → /triage-issue · a concrete defect → /plan-fix
171
+ · real drift (not cosmetic) → /triage-issue · a concrete defect → /unit-lane --fix <n>
172
172
  · already clean → nothing to do
173
173
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: audit-pr
3
3
  user-invocable: true
4
- version: 5.3.1
4
+ version: 5.4.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
@@ -19,7 +19,7 @@ The manager's **"can this ship?"** gate. A read-first audit over the *entire* PR
19
19
  its SPEC, all phases, docs, CI status, and review receipt — that returns a single
20
20
  verdict: **merge-ready** or a ranked list of **blockers**. **Never edits,
21
21
  refactors, or merges.** The human merges, or an active
22
- `ship-roadmap --fullauto` invocation consumes the SHA-bound verdict and performs
22
+ `advance --fullauto` invocation consumes the SHA-bound verdict and performs
23
23
  its separate fail-closed merge step.
24
24
 
25
25
  `audit-pr` does **not** re-review the diff. It consumes the current SHA-bound
@@ -159,7 +159,7 @@ the user previously approved a merge, or a tool retained an earlier permission.
159
159
  Those signals cannot change this skill's read-first boundary.
160
160
 
161
161
  The **sole automated merge authority** is the AUDIT stage of an actively invoked
162
- `ship-roadmap --continue --fullauto` run. Its MERGE-READY comment is evidence,
162
+ `advance --continue --fullauto` run. Its MERGE-READY comment is evidence,
163
163
  not permission; the repository wrapper independently verifies that comment,
164
164
  the forge's current head/default base, green checks, and the `merge: fullauto`
165
165
  decision fetched at that head. The wrapper owns fresh sync checks, transient
@@ -179,13 +179,13 @@ execute-phase (all phases done) ─▶ review-change (REVIEW-PASS receipt posted
179
179
  │
180
180
  blockers ─┬─ receipt absent/stale ──▶ /review-change ──────┘ (re-review, re-audit)
181
181
  ├─ in-scope ──▶ execute-phase ────────┘ (fold, re-audit)
182
- ├─ out-of-scope ──▶ plan-fix
182
+ ├─ out-of-scope ──▶ unit-lane --fix
183
183
  └─ deferral ──▶ triage-issue
184
184
  ```
185
185
 
186
186
  - Consumes the `review-change` `REVIEW-PASS` receipt (its scope/axes, acceptance
187
- coverage, invariant result, manual checks) plus the artifacts of `plan-feature` /
188
- `plan-fix` / `execute-phase` (SPEC, phases, docs, `Closes #N`).
187
+ coverage, invariant result, manual checks) plus the artifacts of `unit-lane` /
188
+ `execute-phase` (SPEC, phases, docs, `Closes #N`).
189
189
  - `audit-docs` is the cross-document coherence check; `audit-pr` is per-PR merge
190
190
  readiness; `product-audit` is the periodic, product-wide full sweep.
191
191
 
@@ -199,8 +199,8 @@ execute-phase (all phases done) ─▶ review-change (REVIEW-PASS receipt posted
199
199
  reported **with the PR's full URL in the header**, each blocker routed, with the
200
200
  human's manual-verification list explicit.
201
201
  - On MERGE-READY the merge owner is explicit: a standalone audit hands the URL
202
- to the human; an active `ship-roadmap --fullauto` AUDIT stage receives the
202
+ to the human; an active `advance --fullauto` AUDIT stage receives the
203
203
  SHA-bound verdict and owns every later merge check.
204
204
  - The **closing `→ Next:` block is printed** (merge link → then the next unit via
205
- `/plan-feature --next` or `/triage-issue`; BLOCKED → the routed fix, then re-audit).
205
+ `/unit-lane <unit>` or `/triage-issue`; BLOCKED → the routed fix, then re-audit).
206
206
  - Nothing was edited, refactored, or merged.
@@ -6,14 +6,14 @@ A gate that can't be confirmed is a **blocker**, not a pass — never assume gre
6
6
  | Gate | What it means | Blocker when |
7
7
  |---|---|---|
8
8
  | **Acceptance coverage** | The receipt's acceptance-coverage field accounts for every SPEC acceptance criterion (review-change verified the mapping). This gate confirms the receipt *names* the criteria — it never remaps diff hunks to criteria itself. | The receipt omits a criterion the SPEC lists, or its coverage field is absent/generic. |
9
- | **All phases complete** | Feature: every phase in `PLAN.md`/`TASKS.md` is done and logged in `progress.md`. Fix: the SPEC is fully implemented. | Any unchecked task or unimplemented phase without an explicit, tracked deferral. |
9
+ | **All phases complete** | Feature: every task in the unit doc's `Tasks` section is done and logged in its `Progress log`. Fix: the SPEC is fully implemented. | Any unchecked task or unimplemented phase without an explicit, tracked deferral. |
10
10
  | **Scope integrity (creep)** | The PR implements the SPEC and no more; out-of-scope work was split out. | Undocumented scope creep, or in-scope work missing. |
11
11
  | **Docs updated** | Every "Affected docs" criterion is satisfied; per-phase docs (`progress`/`testing`/`known-issues`/`decisions`) reflect reality; the doc map still resolves. **Never merge with documentation still pending.** | A doc the map or SPEC requires is stale, missing, pending, or contradicts the code. |
12
- | **Traceability** | `Closes #N` is in the PR body when the work is issue-born (from `plan-feature-from-issue` or `plan-fix`); the roadmap/fix-index entry matches, is **still present** (removed only *after* merge, never before), and carries the linked PR reference (`done · [#<pr>](<pr-url>)`). | Issue-born work without `Closes #N`; a roadmap/index entry out of sync; the entry dropped before merge; or a `done` row without its PR link. |
12
+ | **Traceability** | `Closes #N` is in the PR body when the work is issue-born (from `/unit-lane --from-issue <n>` or `/unit-lane --fix <n>`); the roadmap/fix-index entry matches, is **still present** (removed only *after* merge, never before), and carries the linked PR reference (`done · [#<pr>](<pr-url>)`). | Issue-born work without `Closes #N`; a roadmap/index entry out of sync; the entry dropped before merge; or a `done` row without its PR link. |
13
13
  | **Verification gate / CI** | The project's gate passes — type-check, tests, build — and `statusCheckRollup` is green at the current head. | Any required check failing, pending, or absent where the project requires one. |
14
14
  | **Mergeability** | Branch is off the default base, independently mergeable (no conflicts), not stacked on another PR, not draft. | Wrong base, conflicts, stacked dependency, or still draft. |
15
15
  | **Review receipt** | A current `REVIEW-PASS` receipt is posted on the PR: the newest comment carrying `<!-- review-change:pass sha=<40-hex> contract=v1 -->` whose `sha` equals the PR's current head SHA. Its scope/axes, acceptance coverage, invariant result, and manual checks are the review evidence this audit consumes. | Receipt absent, or its marker `sha` predates the current head (any later commit voids it). The blocker routes to `/review-change`; never re-review the diff from here (AC 13). |
16
- | **Closure integrity** | The governing **feature** SPEC's capability closure was taken and recorded — `design-feature` was actually run, not bypassed. Fix-governed PRs: `n/a` (no closure block by design). | A present `Capability closure` block has a blank row, or a resolved non-`n/a` row with no matching acceptance criterion. |
16
+ | **Closure integrity** | The governing **feature** SPEC's capability closure was taken and recorded — the lane's `design` step was actually run, not bypassed. Fix-governed PRs: `n/a` (no closure block by design). | A present `Capability closure` block has a blank row, or a resolved non-`n/a` row with no matching acceptance criterion. |
17
17
  | **Scope integrity (descope)** | An issue born during this unit that maps to an unmet SPEC acceptance criterion or phase task has a matching, user-approved, dated `## Amendments` entry — descoped scope was recorded, not silently exported. Detection is two-path: a slug/issue-number text match, **or** an issue linked from an `## Amendments` row (`#89`) — either is sufficient to enumerate the issue, so a descoped issue with a generic title/body is not invisible to the gate. | An issue born since branch divergence that references this unit (by either detection path) maps to an unmet criterion/task with no matching `## Amendments` entry, or an `## Amendments` row that is undated, unapproved, or unlinked to an issue. |
18
18
  | **Architectural invariants** | The **receipt** records the invariant result review-change took against the optional project invariant document; this gate confirms that result is explicit (`pass | blocker | n-a`) and does not reclassify it (AC 13). No document → `n/a: no project invariants declared`, not a blocker. | The receipt's invariant result is absent/ambiguous, or a recorded `blocker`/`violates`/`introduces`/`changes` lacks the cited decision the review surfaced. |
19
19
  | **Hygiene — tree clean** | `git status --porcelain` is empty at the audited head: every artifact is committed, so nothing rides along to the next conversation (the field failure of issue #182). | Any modified or untracked path — the blocker names each one. |
@@ -17,15 +17,15 @@
17
17
  > decision was *taken and recorded*, never that UI/API surface exists. Never
18
18
  > push a blank row into inventing surface to pass this gate.
19
19
  > - **Feature SPEC, block absent** → the SPEC predates or bypassed
20
- > `design-feature`. Never a blocker — emit a dated **warning**, PR still
20
+ > `unit-lane`. Never a blocker — emit a dated **warning**, PR still
21
21
  > merges:
22
22
  > ```
23
23
  > design-debt: closure absent, SPEC predates the rule (dated <YYYY-MM-DD>)
24
24
  > ```
25
25
  > This warning is itself the **retrofit trigger**: the next unit of work that
26
- > touches this feature must fill the closure via `/design-feature <slug>`
26
+ > touches this feature must fill the closure via `/unit-lane <slug>`
27
27
  > (upsert — fills only the missing rows, destroys nothing recorded) *before*
28
- > that new work is planned. See `design-feature`'s upsert semantics for the
28
+ > that new work is planned. See `unit-lane`'s design-step upsert semantics for the
29
29
  > other half of this contract.
30
30
 
31
31
  > **`done` ≠ merge-ready.** A unit flips to `done` when its PR opens (built, not
@@ -96,8 +96,7 @@ verdict:
96
96
  feature unit — its named `— spec` parent re-derives the same way. Bound artifacts
97
97
  are frozen: new implementation-phase files are allowed, edits to a bound artifact
98
98
  are not. Stale, missing, wrong-stage **or impossible-timeline** lineage → **BLOCKED**,
99
- `→ Next: /review-plan <unit>` (or `/review-spec <unit>` when the parent is the
100
- broken link). A `SPEC-REVIEW-PASS` never satisfies the plan hop, and vice versa.
99
+ `→ Next: /unit-lane <unit>` (the lane's `review` step re-derives the artifact). A `SPEC-REVIEW-PASS` never satisfies the plan hop, and vice versa.
101
100
  2. **Obligations are closed.** Every row of the unit's obligation ledger is
102
101
  `verified` — with the validator that ran on this candidate — or an explicit
103
102
  `n/a: <reason>`. Any `planned`, `in-progress`, blank, or `deferred` row is
@@ -53,5 +53,5 @@
53
53
  SHA re-posts (newest wins) — and it **refuses to post for a BLOCKED verdict**,
54
54
  so the page never shows a stale green flag.
55
55
  8. **Report** — the verdict block below, always headed by the PR's full URL.
56
- In an active `ship-roadmap --fullauto` AUDIT stage, return the verdict to the
56
+ In an active `advance --fullauto` AUDIT stage, return the verdict to the
57
57
  conductor; never run its merge wrapper from this skill.
@@ -27,14 +27,14 @@ Before merge, a human should still verify:
27
27
  also print the closure bullet (a warning never blocks, so it co-occurs with a
28
28
  MERGE-READY verdict; the two lines print together, never one instead of the other):
29
29
  · MERGE-READY, standalone/manual audit → you merge: <full PR URL>, then
30
- /plan-feature --next (the next roadmap unit) or pick an issue with /triage-issue
31
- · MERGE-READY inside active ship-roadmap --fullauto → return this SHA-bound
30
+ /unit-lane <next-roadmap-unit> (the next roadmap unit) or pick an issue with /triage-issue
31
+ · MERGE-READY inside active advance --fullauto → return this SHA-bound
32
32
  verdict to the conductor; it runs the transient merge wrapper
33
33
  · BLOCKED → clear the top blocker (routed above), then re-run /audit-pr
34
34
  · Receipt absent/stale blocker → /review-change (re-review at the head), then
35
35
  re-run /audit-pr — never re-review from this audit
36
36
  · Closure warning (in addition to the verdict above) or a closure blocker →
37
- /design-feature <slug> — fills the missing closure rows (upsert, destroys
37
+ /unit-lane <slug> — re-runs the design step to fill the missing closure rows (upsert, destroys
38
38
  nothing) before further work on this feature is planned; re-run /audit-pr after
39
39
  · Scope-bleed blocker → record the missing `## Amendments` entry (user-approved,
40
40
  dated, linking the issue) in the governing SPEC, or re-classify the issue as
@@ -4,7 +4,7 @@
4
4
  re-run `audit-pr`) — never re-review from here.
5
5
  - **Incomplete in-scope work** → fold into this branch via `execute-phase`
6
6
  (the relevant phase or `--fix`); re-run `audit-pr` after.
7
- - **Out-of-scope defect surfaced** → `plan-fix` (new fix entry), not this PR.
7
+ - **Out-of-scope defect surfaced** → `/unit-lane --fix <n>` (new fix entry), not this PR.
8
8
  - **Deferred finding lacking a home** → `triage-issue` to file + classify it.
9
9
  - **Stale/missing docs** → update per the doc map (often a quick `execute-phase`
10
10
  doc commit), then re-audit.
@@ -15,7 +15,7 @@
15
15
  - **Read-first verdict. Never push, edit, refactor, or merge.** Its only forge
16
16
  write is the **MERGE-READY comment** (Process step 7 — idempotent,
17
17
  comment-only, never a commit tag). Fullauto merge execution belongs only to
18
- the active `ship-roadmap --fullauto` conductor.
18
+ the active `advance --fullauto` conductor.
19
19
  - **Never re-review the diff.** The `REVIEW-PASS` receipt is the review evidence;
20
20
  a missing/stale receipt is a blocker routed to `/review-change`. The audit does
21
21
  not compose `review-change`, rescan axes, judge test quality, remap diff hunks
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: discover-repository-state
3
3
  user-invocable: true
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  description: >
6
6
  Discover repository evidence and write a frozen Normalized Repository State.
7
7
  Produces verified repository evidence and keeps facts, decisions, planned
@@ -79,6 +79,5 @@ If a contradiction was recorded:
79
79
 
80
80
  Otherwise:
81
81
 
82
- → Next: /plan-feature <slug> — plan from frozen facts
83
- · implementation-ready feature → /execute-phase <NN>
84
- (planned is not executable: no current `PLAN-REVIEW-PASS` → /review-plan <NN>)
82
+ → Next: /unit-lane <slug> — triage and run the lane from frozen facts
83
+ · already-triaged unit → /execute-phase <NN>
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: execute-phase
3
3
  user-invocable: true
4
- version: 5.0.0
4
+ version: 5.0.1
5
5
  argument-hint: <NN-slug> [P<k>|step] [--max-attempts N] [--force]
6
6
  allowed-tools: [Bash, Read, Edit, Write, MultiEdit]
7
7
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
@@ -42,4 +42,4 @@ from the triage catalog, not step descopes):
42
42
  `audit-pr`'s obligation-closure check all key off this same `## References` log
43
43
  — it is the single authoritative record of every descope, defined once here.
44
44
  Nothing else in the pre-execution route creates an issue: a missing or failed
45
- `PLAN-REVIEW-PASS` is closed by `/review-plan`, never by a tracker item.
45
+ the lane's `review` step closes it, never a tracker item.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: fold-findings
3
3
  user-invocable: true
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  argument-hint: [finding-id …]
6
6
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -123,9 +123,9 @@ frozen class is `replan-in-unit` or `decision-required`, nothing folds: no
123
123
  `folded: yes` flips, no commits. The receipt records the `REPLAN-ROUTE` branch
124
124
  and every retained (unfolded) row id, and the loop stops. The consumer is the
125
125
  conclusion the already-run router printed, never the invocation itself: on
126
- `route: replan` the planner it named — `/plan-fix <n>` for a fix unit or
127
- `/plan-feature <slug>` for a feature unit; on `route: decision` stop and
128
- surface the decision to the user, never a planner. `<unit>` is the bare folder number or the full slug (both resolve). The invocation
126
+ `route: replan` the planner command it printed — `/unit-lane <slug>` for a
127
+ feature unit or `/unit-lane --fix <n>` for a fix unit; on `route: decision` stop
128
+ and surface the decision to the user, never a planner. `<unit>` is the bare folder number or the full slug (both resolve). The invocation
129
129
  `node scripts/unit-route.mjs <unit>` is the discovery step the fold already
130
130
  ran; it is never the recommendation.
131
131
 
@@ -173,7 +173,7 @@ or touched outside the queue.
173
173
  · all FOLDED (<F1> + <F2> + …) → /review-change — re-review the branch now that all listed findings are fixed
174
174
  · any DISPUTED (<F1> + <F2> + …) → user decision — resolve every evidenced dispute without creating backlog
175
175
  · any BLOCKED (<F1> + <F2> + …) → supply the listed missing inputs, then re-run /fold-findings
176
- · any REPLAN (<F1> + <F2> + …) → /plan-fix <n> or /plan-feature <slug> — the planner appends the proposed phases to the unit's SPEC, the user confirms them, then a fresh /review-plan must pass before /execute-phase on this unit
176
+ · any REPLAN (<F1> + <F2> + …) → /unit-lane <slug> or /unit-lane --fix <n> — the lane re-runs its plan step, appends the phases to the unit's SPEC; its review step gates before /execute-phase on this unit
177
177
  · any DECISION (<F1> + <F2> + …) → stop and surface the decision to the user — a `route: decision` conclusion names no planner, so the unit waits on the user before any plan or code change
178
178
  ```
179
179
 
@@ -182,8 +182,8 @@ several lines, never joined into one prose line.
182
182
 
183
183
  Replace placeholders with every actual affected finding ID before printing; never
184
184
  print `<F2>`, `…`, or a single representative ID in a live hand-off. Resolve the
185
- `/plan-fix <n>` / `/plan-feature <slug>` unit argument the same way — never carry
186
- `<n>` or `<slug>` into a live hand-off.
185
+ `/unit-lane <slug>` / `/unit-lane --fix <n>` unit argument the same way — never
186
+ carry `<slug>` or `<n>` into a live hand-off.
187
187
 
188
188
  ## Closing-block decision branch (choose one, at emission)
189
189
 
@@ -193,7 +193,7 @@ decision to skip.
193
193
 
194
194
  | Batch state | Branch | `→ Next:` (consumer) |
195
195
  |---|---|---|
196
- | freeze-batch (≥ 1 replan-class row) | `REPLAN-ROUTE` | `/plan-fix <n>` (fix) or `/plan-feature <slug>` (feature) when the router concludes `replan` — user confirms, fresh `/review-plan` passes, then `/execute-phase` on this unit; on `route: decision` stop and surface the decision to the user — the conclusion printed by `node scripts/unit-route.mjs <unit>` (discovery step the fold already ran) |
196
+ | freeze-batch (≥ 1 replan-class row) | `REPLAN-ROUTE` | `/unit-lane <slug>` (feature) or `/unit-lane --fix <n>` (fix) when the router concludes `replan` — user confirms, the lane's `plan` step appends the phases and its `review` step gates, then `/execute-phase` on this unit; on `route: decision` stop and surface the decision to the user — the conclusion printed by `node scripts/unit-route.mjs <unit>` (discovery step the fold already ran) |
197
197
  | `all-repair-in-place` + docs-only + no folded row severity `high` + prior consumer skip decision | `RE-REVIEW-SKIPPED` | skip — consumer has explicitly decided to skip the re-review |
198
198
  | `all-repair-in-place` + docs-only + no folded row severity `high` | `RE-REVIEW-OPTIONAL` | `/review-change` (default, delta mode) — or the consumer's recorded skip decision |
199
199
  | empty batch (class `none`) | `RE-REVIEW-OPTIONAL` | `/review-change` by default — safe: the head is unchanged |
@@ -43,7 +43,7 @@
43
43
 
44
44
  | Condition over the taken batch | Batch class | Fold behavior |
45
45
  |---|---|---|
46
- | ≥ 1 row with frozen class `replan-in-unit` or `decision-required` | `frozen (replan present)` | **freeze-batch** — nothing folds, no `folded: yes` flips, no commits; the receipt records the REPLAN-ROUTE and every retained (unfolded) row id; the loop stops; the consumer is the conclusion printed by `node scripts/unit-route.mjs <unit>` (discovery step the fold already ran), where `<unit>` is the bare folder number or the full slug (both resolve): on `route: replan` the planner — `/plan-fix <n>` (fix) or `/plan-feature <slug>` (feature) — user confirms, fresh `/review-plan` passes, then `/execute-phase` on this unit; on `route: decision` stop and surface the decision to the user, never a planner |
46
+ | ≥ 1 row with frozen class `replan-in-unit` or `decision-required` | `frozen (replan present)` | **freeze-batch** — nothing folds, no `folded: yes` flips, no commits; the receipt records the REPLAN-ROUTE and every retained (unfolded) row id; the loop stops; the consumer is the conclusion printed by `node scripts/unit-route.mjs <unit>` (discovery step the fold already ran), where `<unit>` is the bare folder number or the full slug (both resolve): on `route: replan` the planner command the router printed — `/unit-lane <slug>` (feature) or `/unit-lane --fix <n>` (fix) — the lane appends the phases and its `review` step gates, then `/execute-phase` on this unit; on `route: decision` stop and surface the decision to the user, never a planner |
47
47
  | all taken rows foldable, none replan-class | `all-repair-in-place` | fold as today (group → fix → gate → commit → flip) |
48
48
  | empty queue (zero findings taken) | `none` | receipt only |
49
49
 
@@ -58,11 +58,12 @@
58
58
  `DISPUTED <evidence → user decision>`; never edit classification or create an
59
59
  issue.
60
60
  9. **Replan.** If the smallest correct group exceeds a reviewable correction,
61
- run `node scripts/unit-route.mjs <unit>` — its `route: replan` line names the
62
- planner (`/plan-feature <slug>` or `/plan-fix <n>`) that appends the proposed
61
+ run `node scripts/unit-route.mjs <unit>` — its `route: replan` line prints the
62
+ planner command (`/unit-lane <slug>` for a feature, `/unit-lane --fix <n>` for
63
+ a fix) that appends the proposed
63
64
  phases to the unit's SPEC. The `<unit>` argument accepts the bare folder number
64
- or the full slug (both resolve). After the user confirms and a fresh
65
- `/review-plan <unit>` passes, `/execute-phase <unit>` completes them and ticks
65
+ or the full slug (both resolve). After the user confirms and the lane's
66
+ `review` step passes, `/execute-phase <unit>` completes them and ticks
66
67
  the rows. When the router concludes `route: decision` instead — a
67
68
  `decision-required` row with no replan row — stop and surface the decision to
68
69
  the user; no planner runs until the user decides.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: orchestration-envelope
3
3
  user-invocable: false
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -36,8 +36,9 @@ copy a second schema here.
36
36
  driver appends `renderOutputInstruction(skill)` to that invocation. It has
37
37
  the small model-owned fields: outcome, next intent/targets, blockers,
38
38
  questions, discoveries, and evidence references.
39
- - `ship-roadmap` is the conductor, not a worker profile: it keeps its native
40
- terminal `SHIP:` banner and is parsed by its own fixed turn contract.
39
+ - `advance` (the companion pi package command) is the conductor, not a worker
40
+ profile: it runs as deterministic code over the sensor envelope and never
41
+ emits a worker SkillOutcome.
41
42
  - Interactive invocations emit their normal human-readable reports; no driver
42
43
  result is required.
43
44
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: phase-contract
3
3
  user-invocable: false
4
- version: 1.0.5
4
+ version: 1.0.6
5
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
9
9
  PASS/BLOCKED result, and the normalized phase fingerprint. Consumed by
10
- plan-feature-scaffold, plan-fix, and execute-phase. Not a menu entry.
10
+ `execute-phase` and the lane's `plan` step. Not a menu entry.
11
11
  ---
12
12
 
13
13
  # Phase Contract (internal)
@@ -18,8 +18,7 @@ the same rules before any edit. Nothing else may define what a valid phase is.
18
18
 
19
19
  ## When to use
20
20
 
21
- - `plan-feature-scaffold` — lint every phase of a feature plan before emission.
22
- - `plan-fix` — lint every phase of a fix SPEC before commit.
21
+ - The lane's `plan` step — lint every phase before emission.
23
22
  - `execute-phase` — phase-lint pre-flight guard before editing a phase.
24
23
  - Templates store the contract version + fingerprint + lint result, never the
25
24
  eight rules (they point here).
@@ -1,14 +1,16 @@
1
1
  ---
2
2
  name: pre-execution-review
3
3
  user-invocable: false
4
- version: 2.5.1
4
+ version: 2.6.0
5
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:
9
9
  independence, unioned findings, counter-evidence dismissal, no-progress,
10
10
  `CONVERGENCE-ANOMALY`, and the evidence/obligation/findings tables. Consumed by
11
- `review-spec`, `review-plan`, and the authoring skills. Not a menu entry.
11
+ `execute-phase`, `review-change`, and the lane's authoring steps for the
12
+ **planning-ledger shapes and ownership**; the pre-execution verdict owners
13
+ (`review-spec`/`review-plan`) were retired by feature 61. Not a menu entry.
12
14
  ---
13
15
 
14
16
  # Pre-Execution Review Policy (internal)
@@ -22,15 +24,16 @@ writes nothing, and emits no verdict of its own.
22
24
  evidence-grounding = how an author prepares and self-checks an artifact.
23
25
  pre-execution-review = how any pre-execution reviewer judges it, and what the
24
26
  frozen ledgers look like.
25
- review-spec / review-plan = the only skills that emit a pre-execution verdict.
27
+ lane (design/plan/review steps) = the surviving pre-execution path; feature 61
28
+ P8b retired the standalone review-spec / review-plan
29
+ verdict skills, so this pack now owns the ledger shapes
30
+ the lane and execute-phase consume, not a verdict gate.
26
31
  ```
27
32
 
28
33
  ## When to use
29
34
 
30
- - `review-spec` / `review-plan` — before the first check and again before any
31
- repeat, repair, or synthesis step.
32
- - `design-feature`, `plan-feature`, `plan-feature-scaffold`, `plan-fix` — when
33
- writing the ledgers and when a review comes back failed.
35
+ - The lane's `plan`/`review` steps — when writing the ledgers and when a review
36
+ comes back failed.
34
37
  - Nothing else. Candidate-source review (`review-change`), merge gating
35
38
  (`audit-pr`) and execution (`execute-phase`) keep their own contracts; this
36
39
  skill adds no authority over them.
@@ -1,6 +1,14 @@
1
+ ## Status (feature 61 P8b)
2
+
3
+ `review-spec` and `review-plan` are retired and
4
+ absorbed into the lane. This document now governs the **planning-ledger shapes
5
+ and ownership** (`LEDGERS.md`) that `execute-phase` and `review-change` consume;
6
+ the spec/plan review-cycle semantics below are retained for the legacy units
7
+ that still carry those receipts and are not applied by any live skill.
8
+
1
9
  ## The pre-execution review cycle
2
10
 
3
- Both `review-spec` and `review-plan` run this cycle. The stage files add only
11
+ Both `review-spec` and `review-plan` ran this cycle. The stage files added only
4
12
  what is specific to their artifact set.
5
13
 
6
14
  ### 1. Independence
@@ -97,10 +105,11 @@ outside this policy and can never be translated into a PASS.
97
105
 
98
106
  A **third cycle never** starts without explicit user instruction: after two
99
107
  consecutive unconverged cycles the orchestrator's `stop-review-loop-cap` refusal
100
- stops a further `review-spec`/`review-plan` invocation, names `design-feature` as
108
+ stops a further spec/plan review-cycle invocation, names the lane's `design` step
109
+ as
101
110
  the human route, and a PASS resets the count. An unconverged loop ends in the
102
111
  `needs-design` verdict where the verdict vocabulary sanctions it (the spec stage)
103
- and in the refusal plus `design-feature` routing at the plan stage. The guards
112
+ and in the refusal plus the lane's `design` routing at the plan stage. The guards
104
113
  above gate **blind re-reviews** — an identical snapshot with the identical
105
114
  question — and never a repair performed in response to a persisted verdict: a
106
115
  repair turn whose input is a FAIL/NEEDS-DESIGN receipt produces a new snapshot by
@@ -115,9 +124,9 @@ a count and never waives a finding.
115
124
  - A PASS earned by dropping a finding to `info`, by narrowing a check, or by
116
125
  editing a validator/test to accept the artifact.
117
126
  - A silent second cycle, a silent dismissal, or a silent substitute receipt.
118
- - An automatic forge issue. No route in the pre-execution set — `evidence-grounding`
119
- readiness, `review-spec`, `review-plan`, `plan-feature-scaffold`, `plan-fix`,
120
- `execute-phase`, `workflow-status`, `ship-roadmap`, `review-change`,
127
+ - An automatic forge issue. No route in the pre-execution set — the lane's
128
+ `research`/`design`/`plan`/`review` steps, `execute-phase`, `workflow-status`,
129
+ `advance`, `review-change`,
121
130
  `audit-pr` — creates one for a planning gap, and none defers
122
131
  an obligation to a future issue: the row stays in the unit's ledger, open, until
123
132
  the **user** amends the governing SPEC. A blocker that says "file an issue" is a
@@ -142,8 +151,8 @@ One rule, same shape for every consumer:
142
151
  and obligation ledgers, built from the artifacts as they stand today — and leave
143
152
  `ACCEPTANCE.md`, `PLAN.md`, `TASKS.md`, the phase commits and any older receipt
144
153
  byte-identical. Rewriting an old verdict, its digest, or its date is forgery.
145
- - **Re-review, then resume.** The adopted unit runs `/review-plan` like any other and
146
- `execute-phase` resumes **only** on that current `PLAN-REVIEW-PASS`. A pre-28 unit
154
+ - **Re-review, then resume.** The adopted unit re-runs the lane's `review` step like any other and
155
+ `execute-phase` resumes **only** on that current verdict. A pre-lane unit
147
156
  is never grandfathered in on the strength of its roadmap status.
148
157
  - **No retroactive defect.** A missing ledger means the unit predates the gate, not
149
158
  that its author was wrong; report it as `legacy`, never as a finding against them.
@@ -2,7 +2,7 @@
2
2
  name: product-audit
3
3
  user-invocable: true
4
4
  disable-model-invocation: true
5
- version: 3.2.1
5
+ version: 3.3.0
6
6
  metadata:
7
7
  opencode/autoinvoke: false
8
8
  argument-hint: <path-or-area> (optional — defaults to the whole product)
@@ -117,7 +117,7 @@ Verdict: <one-line honest health verdict>
117
117
  (none — <why>)
118
118
 
119
119
  ### Roadmap — add
120
- - <feature> — from: F<k> — <rationale & opportunity> — route: plan-feature
120
+ - <feature> — from: F<k> — <rationale & opportunity> — route: /unit-lane --from-issue <n>
121
121
  (none — <why>)
122
122
 
123
123
  ### Roadmap — remove / revise
@@ -126,7 +126,7 @@ Verdict: <one-line honest health verdict>
126
126
 
127
127
  ### Tooling — register / re-design
128
128
  - <skill|MCP> — register in AGENTS.md (Optional review extras): <why> — route: user edits AGENTS.md
129
- - <skill|MCP> — would change <feature> scope: <why> — route: /design-feature <slug>
129
+ - <skill|MCP> — would change <feature> scope: <why> — route: /unit-lane <slug>
130
130
  (none — <why>)
131
131
 
132
132
  ## Manual-verification checklist (what automation can't confirm)
@@ -134,7 +134,7 @@ Verdict: <one-line honest health verdict>
134
134
 
135
135
  Finding set: F<k> + F<j> + F<m> (print every proposed finding; one finding → F<k>)
136
136
  → Next: /triage-issue <id> F<k> F<j> F<m> — classify the complete finding set in one batch (opens the ones that warrant it)
137
- · accepted bug/debt → /plan-fix · accepted capability → /plan-feature
137
+ · accepted bug/debt → /unit-lane --fix <n> · accepted capability → /unit-lane --from-issue <n>
138
138
  · nothing to act on → the persisted report is the record; move on
139
139
  ```
140
140
 
@@ -159,12 +159,12 @@ security items to track first").
159
159
  order, never a different letter per problem type. Once persisted, ids are
160
160
  frozen: a later audit gets a new audit id, never renumbers an old file; cross-audit
161
161
  lineage lives only in Delta mappings as `<audit-id> F<k>`, never global slugs or
162
- replaced ids. When the user accepts, route: `triage-issue` files/classifies,
163
- `plan-feature` adds roadmap work, `plan-fix` scopes a concrete fix.
162
+ replaced ids. When the user accepts, route: `triage-issue` files/classifies, `/unit-lane`
163
+ adds roadmap work or scopes a concrete fix.
164
164
  - **Never registers tooling or edits `AGENTS.md`.** The tooling sweep proposes a
165
- skill/MCP to register, but the user (or a routed `design-feature` run)
165
+ skill/MCP to register, but the user (or a routed `/unit-lane <slug>` run)
166
166
  performs the edit; a scope-affecting discovery routes to
167
- `/design-feature <slug>`, which the user approves.
167
+ `/unit-lane <slug>`, which the user approves.
168
168
  - Platform-adaptive: run only applicable axes; always list what you skipped and why.
169
169
  - **No silent caps.** If you sampled, prioritized, or time-boxed a dimension, say
170
170
  so — never present partial coverage as exhaustive.
@@ -198,10 +198,10 @@ product-audit (whole product, all axes, periodic)
198
198
  ├─ composes review-change axes (codebase-wide) + audit-docs (doc coherence)
199
199
  ├─ mines feature docs (decisions / known-issues / architecture-notes)
200
200
  ├─ sweeps installed skills / connected MCP servers (product-wide, periodic)
201
- └─ proposes ─┬─ Issues to open ........ ▶ triage-issue / plan-fix
202
- ├─ Roadmap: add .......... ▶ plan-feature
201
+ └─ proposes ─┬─ Issues to open ........ ▶ triage-issue / unit-lane --fix
202
+ ├─ Roadmap: add .......... ▶ unit-lane --from-issue
203
203
  ├─ Roadmap: remove/revise ▶ triage-issue / roadmap edit (user decides)
204
- └─ Tooling: register/re-design ▶ user edits AGENTS.md / design-feature
204
+ └─ Tooling: register/re-design ▶ user edits AGENTS.md / unit-lane
205
205
  ```
206
206
 
207
207
  - Broader than `review-change` (one change) and `audit-pr` (one PR); subsumes
@@ -221,5 +221,4 @@ product-audit (whole product, all axes, periodic)
221
221
  with the next incremental audit id, and printed in chat.
222
222
  - Nothing else was fixed, filed, or changed — the user decides what to act on.
223
223
  - The **closing `→ Next:` block is printed** — typically a batch
224
- `/triage-issue <id> F<k> …` for the proposed issues, then `/plan-feature` /
225
- `/plan-fix` for the accepted work.
224
+ `/triage-issue <id> F<k> …` for the proposed issues, then `/unit-lane` for the accepted work.
@@ -32,7 +32,7 @@ step (2–5). Each item ends with exactly one fallback; never pick another one m
32
32
  inventory freshness**: cross-check `docs/CAPABILITIES.md` against the code —
33
33
  roles, permissions, or cross-cutting subsystems present in the code but
34
34
  missing from the inventory (or vice versa) are a Process & docs finding
35
- (`design-feature`'s Integration closure is only as good as this file). If
35
+ (`unit-lane`'s design step Integration closure is only as good as this file). If
36
36
  the project has no inventory file, propose seeding it from the template —
37
37
  a finding, never an auto-fix.
38
38
  4. **Mine accumulated suggestions** — read every feature folder's `decisions.md`,
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: resolve-repository-state
3
3
  user-invocable: true
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  argument-hint: <contradiction-id>
6
6
  description: >
7
7
  Resolve an explicit Normalized Repository State contradiction. This is the
@@ -74,7 +74,6 @@ If human input is required:
74
74
  Otherwise:
75
75
 
76
76
  → Next: resume the interrupted workflow named by `Reported by` — continue from the resolved snapshot
77
- · planning was interrupted → /plan-feature <slug>
77
+ · planning was interrupted → /unit-lane <slug>
78
78
  · implementation was interrupted → /execute-phase <NN>
79
- (only while its `PLAN-REVIEW-PASS` is still current → else /review-plan <NN>)
80
79
  · review, audit, or status was interrupted → rerun that same skill
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-change
3
3
  user-invocable: true
4
- version: 3.7.1
4
+ version: 3.8.0
5
5
  argument-hint: <path-or-glob> [--adversarial N] [--synthesize]
6
6
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -42,8 +42,8 @@ finding.
42
42
  ## Review-end turn boundary
43
43
 
44
44
  On `REVIEW-FAIL` or `NEEDS-DECISION`, this skill **ends at the report**: it
45
- never invokes `/fold-findings`, `/execute-phase`, `/plan-feature`,
46
- `/design-feature` or `/triage-issue` — those are separate user-initiated invocations,
45
+ never invokes `/fold-findings`, `/execute-phase`, `/unit-lane` or
46
+ `/triage-issue` — those are separate user-initiated invocations,
47
47
  run in a fresh turn (a programmatic outer driver may compose the same
48
48
  sequence in-turn, per `REVIEW_PROCESS.md`). The review's only mutations are the
49
49
  ledger commit (persist step 11) and, on `REVIEW-PASS` with a PR, the
@@ -23,7 +23,7 @@ model identity, so this skill never tries; it states the condition in prose
23
23
  and lets the human (or the orchestrator that knows which model is running)
24
24
  judge it.
25
25
 
26
- **N ladder (fixed).** `N=2` is the default (the `ship-roadmap` floor). Bump to
26
+ **N ladder (fixed).** `N=2` is the default (the `advance` floor). Bump to
27
27
  `N=3` when either holds: the change has a security/auth surface, or all
28
28
  available reviewers share one model family (the third reviewer buys back some
29
29
  of the decorrelation a single family can't provide). `N>3` is **explicitly
@@ -11,7 +11,7 @@ fused table.
11
11
  no message (today's default). `--adversarial` passed **without** a valid N
12
12
  (no number given, or a number `< 2`) → usage error: state that `--adversarial`
13
13
  needs an integer N≥2 and fall back to the single-reviewer path — never
14
- silently run 1. `ship-roadmap`'s hard floor always passes `N=2`.
14
+ silently run 1. `advance`'s hard floor always passes `N=2`.
15
15
 
16
16
  **Why N reviewers.** A single adversarial, context-clean reviewer (see the
17
17
  turn-contract box) decorrelates some blind spots; running N independent
@@ -22,16 +22,16 @@ lost, and none becomes reviewer-created backlog (D3):
22
22
 
23
23
  - **fix-now** → persisted to the unit's `review-findings.md` fold ledger, then
24
24
  routed to the current phase's fold cycle (`/fold-findings`, invoked after this review ends)
25
- — never a tracked issue, never `plan-fix`. Classification honors
25
+ — never a tracked issue, never a standalone replan. Classification honors
26
26
  `review-implementation`'s **current-unit contract**: in-scope defects are
27
27
  always fix-now / replan-in-unit — never a postpone/tradeoff/wontfix/new-issue
28
28
  escape.
29
29
  - **fix-now / `replan-in-unit`** (too large to fold as-is) → keeps its fix-now
30
30
  class and ledger row; run `node scripts/unit-route.mjs <unit>` — its
31
- `route: replan` line names the planner (`/plan-feature <unit>` for a feature,
32
- `/plan-fix <n>` for a fix). The planner re-cuts the plan on this branch, the
33
- user confirms the appended SPEC phase(s), a fresh `/review-plan <unit>` passes,
34
- and only then `execute-phase` runs them.
31
+ `route: replan` line prints the planner command (`/unit-lane <unit>` for a
32
+ feature, `/unit-lane --fix <n>` for a fix). The lane re-runs its plan step on
33
+ this branch, the user confirms the appended SPEC phase(s), its review step
34
+ gates, and only then `execute-phase` runs them.
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
@@ -126,13 +126,14 @@ exact command tokens.
126
126
  third cycle never starts without an explicit user instruction)
127
127
  · /audit-pr → only after the table is clean (not yet — findings open)
128
128
  · any finding routed replan-in-unit or owned by plan? → `node
129
- scripts/unit-route.mjs <unit>` prints `route: replan` and names the
130
- planner (`/plan-feature <unit>` for a feature, `/plan-fix <n>` for a fix);
131
- the planner re-cuts the plan on this branch, a fresh `/review-plan <unit>`
132
- passes, then `/execute-phase <unit>` (yes: list the finding ids; no: omit
129
+ scripts/unit-route.mjs <unit>` prints `route: replan` and the planner
130
+ command (`/unit-lane <unit>` for a feature, `/unit-lane --fix <n>` for a
131
+ fix); the lane re-runs its plan step on this branch, its review step
132
+ gates, then `/execute-phase <unit>` (yes: list the finding ids; no: omit
133
133
  this line)
134
- · any finding owned by product? → /design-feature <unit>, then /review-spec
135
- <unit> (yes: list the ids; no: omit this line)
134
+ · any finding owned by product? → /unit-lane <unit> — the lane's design
135
+ step repairs the half, its review step re-judges it (yes: list the ids;
136
+ no: omit this line)
136
137
  · independent proposals → present to the user; only the user routes them
137
138
  to /triage-issue
138
139
  · adversarial recommendation checklist fired AND this run was
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: review-implementation
3
3
  user-invocable: false
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  argument-hint: <path-or-glob>
6
6
  allowed-tools: Read, Grep, Glob, Bash, WebFetch
7
7
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
@@ -85,7 +85,7 @@ in-scope capability complete (D2: complete capabilities, not short unit
85
85
  duration). Current-unit work has **only blocking outcomes**:
86
86
 
87
87
  - **fix-now** — it can fold directly. It is NEVER a tracked issue and NEVER
88
- routes to `plan-fix`: it folds into the current unit's open phase (AC 12).
88
+ routes to a standalone replan: it folds into the current unit's open phase (AC 12).
89
89
  - **replan-in-unit** — it needs additional user-confirmed phases (see *Large
90
90
  in-scope fix-now → replan, never downgrade* below).
91
91
  - **decision-required** — a new product/architecture decision is unavoidable.
@@ -109,11 +109,12 @@ the user routes a proposal to `triage-issue`.
109
109
  An in-scope fix-now too large to fold as-is (multi-file redesign, or evidence
110
110
  the unit should have been split) keeps its **fix-now** class — size is never a
111
111
  reason to downgrade. Set its `Route` to **`replan-in-unit`**: run
112
- `node scripts/unit-route.mjs <unit>` — its `route: replan` line names the planner
113
- (`/plan-feature <unit>` or `/plan-fix <n>`) — and the unit's SPEC `## Phases`
114
- ledger gets one or more new phases covering the work, on the SAME branch, a fresh
115
- `/review-plan <unit>` passing before `execute-phase` runs them. It never routes to
116
- `plan-fix` for a new unit or a new issue (AC 12). Placement
112
+ `node scripts/unit-route.mjs <unit>` — its `route: replan` line prints the
113
+ planner command (`/unit-lane <unit>` for a feature, `/unit-lane --fix <n>` for a
114
+ fix) — and the unit's SPEC `## Phases`
115
+ ledger gets one or more new phases covering the work, on the SAME branch, the
116
+ lane's own `review` step passing before `execute-phase` runs them. It never routes to
117
+ a standalone planner for a new unit or a new issue (AC 12). Placement
117
118
  depends on whether the final `Hardening & PR` phase has already run:
118
119
 
119
120
  - **Hardening not yet executed** → insert the new phase(s) BEFORE it; the
@@ -150,10 +151,11 @@ your domains):
150
151
  ## Routing (what each class feeds)
151
152
 
152
153
  - **fix-now** → fold directly into the current unit's open phase; never a
153
- tracked issue, never `plan-fix` (AC 12).
154
+ tracked issue, never a standalone planner (AC 12).
154
155
  - **fix-now / `replan-in-unit`** → `node scripts/unit-route.mjs <unit>` prints
155
- `route: replan`; the planner it names re-cuts the SPEC `## Phases` ledger
156
- (user confirms), a fresh `/review-plan <unit>` passes, then `execute-phase`
156
+ `route: replan`; the planner command it prints re-cuts the SPEC `## Phases`
157
+ ledger
158
+ (user confirms), the lane's `review` step gates, then `execute-phase`
157
159
  runs the new phases — never a downgrade, never a tracked issue (AC 12).
158
160
  - **fix-now / `decision-required`** → stop and surface the decision; the unit
159
161
  blocks until the user decides. No issue is created.
@@ -172,8 +174,8 @@ finding in its `Route` cell.
172
174
  | Owning stage | Hand-off | Never |
173
175
  |---|---|---|
174
176
  | `source` | fold locally: `/fold-findings`, then re-run `/review-change` on the changed HEAD | — |
175
- | `plan` | run `node scripts/unit-route.mjs <unit>` → `route: replan`; 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 |
176
- | `product` | `/design-feature <unit>` repairs the half, then `/review-spec <unit>` re-judges it | patch the product claim into agreement in code |
177
+ | `plan` | run `node scripts/unit-route.mjs <unit>` → `route: replan`; 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 the lane's **`review` step** precedes `execute-phase` | fold it in code and leave the plan describing the old build |
178
+ | `product` | `/unit-lane <unit>` repairs the half through its `design` step, its `review` step re-judges it | patch the product claim into agreement in code |
177
179
  | `environment` / `runtime` | the existing retry/`BLOCKED` paths | translate into a PASS, or an issue |
178
180
 
179
181
  - `fix-now` with a `plan` or `product` owner keeps its severity but is **not**
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: triage-issue
3
3
  user-invocable: true
4
- version: 2.8.0
4
+ version: 2.9.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 <1969593+gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -106,20 +106,21 @@ classification, label ownership, and persisted-output contracts do not change.
106
106
  ## Relationship to other skills
107
107
 
108
108
  ```
109
- ┌─ fix-now ─────────▶ plan-fix ─▶ execute-phase --fix
109
+ ┌─ fix-now ─────────▶ /unit-lane --fix <n> ─▶ the lane's implement step
110
110
  ├─ fix-in-unit ─────▶ execute-phase <NN> P<k> (fold into phase)
111
111
  triage-issue ────┤ or fold-findings (ledger row)
112
- │ or unit-route → plan-feature / plan-fix (replan)
113
- ├─ promote ─────────▶ plan-feature (router → from-issue)
112
+ │ or unit-route <unit> → /unit-lane <unit> (replan)
113
+ ├─ promote ─────────▶ /unit-lane --from-issue <n> (feature from issue)
114
114
  ├─ postpone ────────▶ dated comment, leave open
115
115
  └─ wontfix ─────────▶ propose close
116
116
  ```
117
117
 
118
118
  In review-finding mode, `replan-in-unit` runs `node scripts/unit-route.mjs
119
- <unit>`: its `route: replan` line names the planner (`/plan-feature` for a
120
- feature, `/plan-fix` for a fix), with new `P<n>` phases appended to the same
121
- unit and a fresh `/review-plan` before execution. The user manually runs those
122
- phases; this skill never implements them.
119
+ <unit>`: its `route: replan` line prints the planner command — `/unit-lane
120
+ <unit>` for a feature, `/unit-lane --fix <n>` for a fix — which re-runs the
121
+ lane's `plan` catalog step and appends new `P<n>` phases to the same unit. The
122
+ lane's own `review` step is the gate before execution. The user manually runs
123
+ those phases; this skill never implements them.
123
124
 
124
125
  ## Done when
125
126
 
@@ -136,8 +137,8 @@ phases; this skill never implements them.
136
137
 
137
138
  Batch:
138
139
  → Next: apply every verdict: #<n1> → <command> + #<n2> → <command> + #<n3> → <command>
139
- · fix-now → /plan-fix <n> · promote → /plan-feature <n>
140
- · fix-in-unit → /execute-phase <NN> P<k> or /fold-findings — never /plan-fix
140
+ · fix-now → /unit-lane --fix <n> · promote → /unit-lane --from-issue <n>
141
+ · fix-in-unit → /execute-phase <NN> P<k> or /fold-findings — never a new planner skill
141
142
  · postpone → dated comment, leave open · wontfix → propose close
142
143
  · same inconsistency across several issues → /product-audit (a recurring pattern,
143
144
  not isolated tickets — sweep the product rather than triaging one by one)
@@ -25,12 +25,11 @@
25
25
  append a provenance-marked row to the unit's `review-findings.md` (see
26
26
  *Ledger-append mechanism* below).
27
27
  - *changes the unit's shape* → **incremental replan** on the same unit:
28
- name the exact command — `design-feature <slug> "<instruction>"`
29
- (product half, upsert) for a product-shape change, `plan-feature
30
- <slug>` (re-run, engineering half) for an engineering-shape change, or
31
- a user-approved, dated `## Amendments` entry per #66's mechanism (fix
32
- units). Never write "replan if needed" — always name which of the
33
- three applies and why.
28
+ name the exact command — `/unit-lane <slug>` (the lane re-reads the
29
+ SPEC, re-triages, and re-runs its `design`/`plan` catalog steps) — or a
30
+ user-approved, dated `## Amendments` entry per #66's mechanism (fix
31
+ units). Never write "replan if needed" — always name which applies and
32
+ why.
34
33
  - *born as an un-amended descope of an unmerged unit* →
35
34
  **scope-bleed restore**: the route is restore-the-criterion-in-the-unit
36
35
  (no matching `## Amendments` entry); the issue closes as
@@ -38,13 +37,15 @@
38
37
  - No candidate matched → fall through to today's four-verdict
39
38
  classification below, unchanged.
40
39
  4. **Classify** into one of:
41
- - **fix-now** — defect or trigger met → route to `plan-fix` then
42
- `execute-phase --fix`; add the entry to the fix index. **High severity** →
40
+ - **fix-now** — defect or trigger met → route to `/unit-lane --fix <n>`
41
+ (creates the fix unit and triages it; the lane's `implement` step runs
42
+ it); add the entry to the fix index. **High severity** →
43
43
  apply the urgency label per *Urgency label vocabulary* above (`urgent` by
44
44
  default; `fix-next` when the call is "queue it next" rather than "maybe
45
45
  interrupt now" — see that section's table). Non-high severity → no label.
46
- - **promote-to-feature** — really new capability → route to `plan-feature`
47
- (the router handles the issue path). Apply the `promoted` disposition
46
+ - **promote-to-feature** — really new capability → route to
47
+ `/unit-lane --from-issue <n>` (creates the feature unit from the issue and
48
+ triages it). Apply the `promoted` disposition
48
49
  label per *Disposition label vocabulary* above.
49
50
  - **postpone** — valid but trigger unmet → leave open; post a **dated
50
51
  re-confirmation** comment stating what you checked and why it stays
@@ -2,7 +2,7 @@
2
2
 
3
3
  This skill is the **sole owner and sole writer** of the workflow's urgency
4
4
  labels. No other skill defines, spells, or applies them — `workflow-status`
5
- only *reads* them (labels-only, presence-only) and `ship-roadmap` only
5
+ only *reads* them (labels-only, presence-only) and `advance` only
6
6
  *consumes* what `workflow-status` reports.
7
7
 
8
8
  | Label | Color | Meaning |
@@ -38,8 +38,8 @@ verdict — never a separate, silent step:
38
38
  landing).
39
39
 
40
40
  A **fix-now + non-high** severity verdict routes normally (fix index +
41
- `plan-fix`) but applies **no** label — only high severity reaches the urgent
42
- tier.
41
+ `/unit-lane --fix <n>`) but applies **no** label — only high severity reaches
42
+ the urgent tier.
43
43
 
44
44
  ## Disposition label vocabulary (owned here)
45
45
 
@@ -15,11 +15,11 @@ after `/fold-findings` leaves rows unresolved.
15
15
  remains on the current unit. Route it to `/fold-findings` or an explicit
16
16
  `/execute-phase <unit> P<n>`.
17
17
  - A correction too large for the current fold is `replan-in-unit`. Run
18
- `node scripts/unit-route.mjs <unit>`; its `route: replan` line names the
19
- planner (`/plan-feature <unit>` for a feature, `/plan-fix <issue-number>`
20
- for a fix) and the fresh `/review-plan <unit>` that must pass before
21
- execution. The plan must append concrete `P<n>` phases to the unit's
22
- SPEC and preserve the finding's acceptance evidence.
18
+ `node scripts/unit-route.mjs <unit>`; its `route: replan` line prints the
19
+ planner command — `/unit-lane <unit>` for a feature, `/unit-lane --fix <n>`
20
+ for a fix — which re-runs the lane's `plan` step and appends concrete
21
+ `P<n>` phases to the unit's SPEC, preserving the finding's acceptance
22
+ evidence. The lane's `review` step gates execution.
23
23
  - A product, architecture, or acceptance decision that blocks safe work is
24
24
  `decision-required`. Ask the user; do not guess or weaken the finish line.
25
25
  - A finding disproved by current evidence is `disputed`. Preserve the row
@@ -35,7 +35,7 @@ Return exactly one block per finding:
35
35
  REVIEW FINDING <F-k> — <short title>
36
36
  Checked: <commands and evidence>
37
37
  VERDICT: fix-now | replan-in-unit | decision-required | disputed
38
- Action taken: <current-unit fold/phase | plan-feature | plan-fix | user decision>
38
+ Action taken: <current-unit fold/phase | unit-lane | user decision>
39
39
  ```
40
40
 
41
41
  Close with every finding ID mapped to its own command, joined with ` + `, and
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: unit-lane
3
3
  user-invocable: true
4
- version: 1.0.0
5
- argument-hint: <NN-slug | "<idea>"> [--retriage]
4
+ version: 1.1.0
5
+ argument-hint: <NN-slug | "<idea>"> [--retriage] | --fix <issue-number> | --from-issue <issue-number>
6
6
  description: >
7
7
  One-shot lane conductor for a delivery unit: triage, implement, evidence, and
8
8
  close in a single document. Triggers: "unit-lane", "run the lane",
@@ -36,8 +36,14 @@ done:
36
36
 
37
37
  - A known unit slug: `unit-lane <NN-slug>`
38
38
  - A raw idea (no slug yet): `unit-lane "<idea description>"`
39
+ - A tracked fix issue (no fix folder yet): `unit-lane --fix <issue-number>`
40
+ - A tracked roadmap feature issue (no feature folder yet): `unit-lane --from-issue <issue-number>`
39
41
  - Force re-triage: `unit-lane <NN-slug> --retriage`
40
42
 
43
+ Both `--fix <n>` and `--from-issue <n>` are the exact forms
44
+ `scripts/unit-route.mjs` prints for a tracked issue with no unit folder
45
+ (`route: plan-from-issue`) — never invent a different spelling.
46
+
41
47
  ## Step 0 — Discover the project
42
48
 
43
49
  Per the agent guide's **Workflow conventions** + **documentation map**, then read
@@ -48,11 +54,20 @@ exists, read its current `SPEC.md` to avoid overwriting.
48
54
 
49
55
  ### 1. Resolve or create the unit doc
50
56
 
51
- If the idea has no slug, assign the next number from `docs/features/ROADMAP.md`
52
- and create `docs/features/<NN>-<slug>/SPEC.md` from the template. Fill
53
- objective, why, user outcome, and non-goals from the invocation. Acceptance
54
- criteria are induced from user scenarios — **ask-don't-infer**; if the request
55
- is too vague, STOP and ask the user with concrete options. See
57
+ If the unit folder already exists, read its `SPEC.md` and continue. Otherwise
58
+ create it from the tree the unit belongs to:
59
+
60
+ | Invocation | Folder | Template | Index to register |
61
+ |---|---|---|---|
62
+ | `<NN-slug>` / `"<idea>"` | `docs/features/<NN>-<slug>/` | `docs/features/_TEMPLATE/SPEC.md` | `docs/features/ROADMAP.md` |
63
+ | `--fix <issue-number>` | `docs/fix/<issue-number>-<topic>/` | `docs/fix/_TEMPLATE/SPEC.md` | `docs/fix/README.md` |
64
+ | `--from-issue <issue-number>` | `docs/features/<NN>-<slug>/` | `docs/features/_TEMPLATE/SPEC.md` | `docs/features/ROADMAP.md` (row links `#<issue-number>`) |
65
+
66
+ For `--fix`/`--from-issue`, read the tracked issue in the forge first and keep
67
+ its number; the folder name carries it (`fix/<issue-number>-<topic>`). Fill
68
+ objective, why, user outcome, and non-goals from the invocation (or the issue).
69
+ Acceptance criteria are induced from user scenarios — **ask-don't-infer**; if the
70
+ request is too vague, STOP and ask the user with concrete options. See
56
71
  [the unit doc template](references/STEPS.md) for section order.
57
72
 
58
73
  ### 2. Triage — read the catalog, never re-derive
@@ -119,8 +134,8 @@ unit doc's status, and print the closing block.
119
134
 
120
135
  ## Relationship to other skills
121
136
 
122
- `unit-lane` absorbs the fixed-pipeline skills (design-feature, plan-feature,
123
- review-spec, review-plan) into catalog steps. The review pack axes
137
+ `unit-lane` absorbed the retired fixed-pipeline skills (design-feature,
138
+ plan-feature, review-spec, review-plan) into catalog steps. The review pack axes
124
139
  (`review-implementation`, `review-code`, `review-security`, `review-perf`,
125
140
  `review-a11y`, `review-debt`) compose the review step; `triage-issue` feeds
126
141
  issues into the lane; `workflow-status` computes the next lane invocation.
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: workflow-status
3
3
  user-invocable: true
4
- version: 3.8.1
4
+ version: 3.9.1
5
5
  author: "Gabriel Trabanco <1969593+gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
- argument-hint: "[--json-only] [--last-envelope <json|path>]"
7
+ argument-hint: "[--json-only] [--last-envelope <json|path>] [--compact]"
8
8
  description: >
9
9
  Read-only workflow sensor: run the deterministic script, read the fixed
10
10
  machine envelope, interpret the recommendation. Never edits. Triggers:
@@ -25,20 +25,19 @@ report — it never assembles the envelope by hand.
25
25
 
26
26
  ```
27
27
  ✓ The script was RUN — `bun scripts/workflow-status.mjs [--json-only]
28
- [--last-envelope <json|path>]` (node is the fallback when bun is absent, per
29
- the repository's runtime convention); the envelope is the script's stdout, never
30
- assembled by the model
28
+ [--last-envelope <json|path>] [--compact]` (node is the fallback when bun is
29
+ absent, per the repository's runtime convention); the envelope is the script's
30
+ stdout, never assembled by the model
31
31
  ✓ Nothing was edited, committed, pushed, or created — read-only, always
32
32
  ✓ `next.recommended` is non-bare (carries the unit's slug/NN, never a bare
33
- `/plan-feature`) AND the script computed it from the unit's resolved status
34
- **and** its current pre-execution evidence: `idea`/undesigned →
35
- `/design-feature <slug>`; `defined` → `/plan-feature <slug>` only on a current
36
- `SPEC-REVIEW-PASS`, else `/review-spec <slug>`; `planned`/`in-progress` → `/execute-phase <NN>` only on a
37
- current `PLAN-REVIEW-PASS`, else `/review-plan <NN>` (step 6a)
33
+ `/unit-lane`) AND the script computed it from the unit's resolved status:
34
+ `idea`/`defined` → `/unit-lane <slug>` (or `/unit-lane --fix <n>` for a fix);
35
+ `planned`/`in-progress` → `/execute-phase <NN>` (its triage block is the
36
+ authority; no separate plan-receipt currency check, step 6a)
38
37
  ✓ `detail.crash_recovery` carries a verdict from the decision table and the
39
38
  envelope `state` matches it (CLEAN→OK, RESUMABLE→CONTINUE,
40
39
  AMBIGUOUS→NEEDS_INPUT)
41
- ✓ Every `detail.design_candidates[].next` begins with `/design-feature `
40
+ ✓ Every `detail.design_candidates[].next` begins with `/unit-lane `
42
41
  ✓ Every degraded dimension is named in `detail.degradations` as
43
42
  `unavailable-<source>-<cause>` — and, when `--last-envelope` was supplied, the
44
43
  no-progress guard's `workflow_observations` note is present (never a silently
@@ -51,6 +50,12 @@ report — it never assembles the envelope by hand.
51
50
 
52
51
  With `--json-only`, skip the human-readable summary: print the envelope alone.
53
52
 
53
+ ## Compact mode — `--compact`
54
+
55
+ `--compact` emits the same envelope with repository history dropped (~half the
56
+ bytes on a mature repo); the exact keep/drop set is in
57
+ [envelope fields](references/ENVELOPE_FIELDS.md).
58
+
54
59
  ## When to use
55
60
 
56
61
  - Between orchestration steps: an external driver runs it to decide the next
@@ -93,11 +98,11 @@ the JSON contract.
93
98
 
94
99
  ## Relationship to other skills
95
100
 
96
- - The **sensor** counterpart to `ship-roadmap`'s conductor: an external
97
- orchestrator calls `workflow-status` → routes on the envelope → invokes
98
- `plan-feature` / `execute-phase` / `review-change` / `audit-pr` /
99
- `triage-issue` directly, choosing the model per step — the same loop without
100
- the in-agent autopilot.
101
+ - The **sensor** counterpart to `advance`'s conductor: an external
102
+ orchestrator (or `advance` itself) calls `workflow-status` → routes on the
103
+ envelope → invokes `unit-lane` / `execute-phase` / `review-change` /
104
+ `audit-pr` / `triage-issue` directly, choosing the model per step — the same
105
+ loop without the in-agent autopilot.
101
106
  - Read-only sibling of `audit-docs` (which judges coherence and can fix) and
102
107
  `product-audit` (which judges health): this one only reports state.
103
108
  - Schema owner: `orchestration-envelope` (internal).
@@ -112,7 +117,7 @@ the JSON contract.
112
117
  `detail.crash_recovery` were read from the envelope, and the envelope `state`
113
118
  matches the crash-recovery verdict.
114
119
  - With `--last-envelope` supplied: the no-progress guard ran — a stalled
115
- `/plan-feature`/`/design-feature` hint surfaces as a `workflow_observations`
120
+ `/unit-lane` hint surfaces as a `workflow_observations`
116
121
  note, never a silent bland repeat, with no new write path introduced.
117
122
  - The human summary (unless `--json-only`) and the envelope are printed, envelope
118
123
  last.
@@ -23,12 +23,12 @@ section *classifies*; the resume command it recommends does the acting.
23
23
  caller's persisted envelope against the recomputed state and report the
24
24
  divergence in one line. The hint never overrides recomputed state.
25
25
  - ✓ **No-progress guard (optional, requires `--last-envelope`).** When the
26
- hint's `next.recommended` was `/plan-feature <slug>` or `/design-feature
27
- <slug>` for a given unit, and this run's own recomputed status for that
28
- **same unit** is still at the **same pre-advance status** the hint expected
29
- to move it off of (`defined` for a `/plan-feature` hint; `idea` for a
30
- `/design-feature` hint) — either the recommended command ran but its status
31
- write was dropped, or it never ran at all; this guard cannot distinguish the
26
+ hint's `next.recommended` was `/unit-lane <slug>` for a given unit, and this
27
+ run's own recomputed status for that **same unit** is still at the **same
28
+ pre-advance status** the hint expected to move it off of (`idea`/`defined` —
29
+ the lane's triage write lands when the unit doc is created) — either the
30
+ recommended command ran but its status write was dropped, or it never ran at
31
+ all; this guard cannot distinguish the
32
32
  two from the envelope alone, so the note names it as a **suspected** stall,
33
33
  not a confirmed dropped write. Emit a `workflow_observations` note (see
34
34
  `## Machine envelope` for the exact note shape). This is strictly additive:
@@ -108,15 +108,12 @@ the key's presence.
108
108
  |---|---|
109
109
  | `/discover-repository-state` | `strong` |
110
110
  | `/resolve-repository-state` | `strong` |
111
- | `/plan-feature` | `strong` |
112
- | `/design-feature` | `strong` |
111
+ | `/unit-lane` | `strong` |
113
112
  | `/review-change` | `strong` |
114
113
  | `/audit-pr` | `strong` |
115
114
  | `/triage-issue` | `strong` |
116
115
  | `/product-audit` | `strong` |
117
116
  | `/execute-phase` | `cheap` |
118
- | `/review-spec` | `strong` |
119
- | `/review-plan` | `strong` |
120
117
 
121
118
  `next.tier` is read off this map by matching the resolved `next.recommended`
122
119
  command's name (ignoring its arguments) — never guessed and never copied from
@@ -2,12 +2,12 @@
2
2
 
3
3
  **No-progress guard note (`workflow_observations`, requires `--last-envelope`,
4
4
  see the crash-recovery checklist above)** — when the hint's `next.recommended`
5
- targeted `/plan-feature <slug>` or `/design-feature <slug>` and this run still
5
+ targeted `/unit-lane <slug>` and this run still
6
6
  classifies that same unit at the same pre-advance status, append a note of the
7
7
  exact shape:
8
- `"<slug> still 'defined' after the hint's /plan-feature <slug> recommendation — suspected dropped defined→planned write (see #51)"`
9
- (swap `defined`/`/plan-feature` for `idea`/`/design-feature` on the design
10
- side). The recommendation itself is unaffected — this only adds visibility.
8
+ `"<slug> still 'defined' after the hint's /unit-lane <slug> recommendation — triage not yet applied"`
9
+ (the note fires for a `defined` unit; the lane's triage write is what moves it
10
+ off `idea`/`defined`). The recommendation itself is unaffected — this only adds visibility.
11
11
 
12
12
  **Shape vs. current output — read this before trusting the example below.** The
13
13
  example is the envelope's **intended shape**, not everything the deterministic
@@ -33,10 +33,10 @@ absent-legacy` or `issues_born.n: 0`; the owning note is
33
33
  "dependencies": {"unmet": [], "build_order": []},
34
34
  "recommendations": {"product_audit": false, "reason": null},
35
35
  "needs_input": null,
36
- "next": {"recommended": "/review-change", "alternatives": ["/plan-feature 05"], "tier": "strong",
36
+ "next": {"recommended": "/review-change", "alternatives": ["/unit-lane 05"], "tier": "strong",
37
37
  "suggested": [{"command": "/review-change", "trigger": "accumulation: 420 changed lines since last-reviewed sha", "source_skill": "execute-phase"}]},
38
38
  "detail": {
39
- "design_candidates": [{"id": "08-billing-webhooks", "status": "idea", "next": "/design-feature 08-billing-webhooks"}],
39
+ "design_candidates": [{"id": "08-billing-webhooks", "status": "idea", "next": "/unit-lane 08-billing-webhooks"}],
40
40
  "pre_execution": [{"unit": "12-export-api", "unitDir": "docs/features/12-export-api", "stage": "lane", "label": "current", "verdict": "READY", "boundDigest": null, "observedDigest": null, "recommended": "/unit-lane 12-export-api", "reason": "unit-doc currency is checked per step by unit-lane/execute-phase"}],
41
41
  "features": [
42
42
  {"id": "07-csv-export", "status": "in-progress", "deps": ["01"], "deps_unmet": [],
@@ -87,4 +87,39 @@ fully in `features`/`fixes` — an `idea` unit appears ONLY in
87
87
  `design_candidates` (and `detail.features`), never in `startable_now`, since
88
88
  it has no deps-met check to pass (design precedes dependency startability).
89
89
  `05-auth` above illustrates `defined` (not yet `planned`): startable, next
90
- `/plan-feature`, phase fields null (no planning artifacts yet).
90
+ `/unit-lane`, phase fields null (no planning artifacts yet).
91
+
92
+ ## The `--compact` projection
93
+
94
+ The envelope above is the complete one. `--compact` emits the **same shape and the
95
+ same decisions** with repository history dropped, because a poll loop pays for
96
+ that history in context on every read while no consumer of "what can I do now"
97
+ reads it. On this repository it is roughly half the bytes.
98
+
99
+ Exactly two fields change:
100
+
101
+ - `detail.features` / `detail.fixes`: a `done` row is dropped **only on positive
102
+ proof its linked PR merged** (the merge resolver). An unmerged `done` row is
103
+ still at the merge gate and stays; every row in `idea`/`defined`/`planned`/
104
+ `in-progress` stays in both modes, so `detail.startable_now` and
105
+ `detail.blocked_units` keep naming every unit either way.
106
+ - `findings.fix_now[].route`: the reviewer's multi-paragraph evidence memo becomes
107
+ `...(N char evidence, see the unit review-findings.md)`, keeping the original
108
+ length visible. `id`, `file`, `axis`, `severity`, `class` and `suggested_tier`
109
+ are untouched, and the memo is on disk in the unit's `review-findings.md`, which
110
+ is where the fold reads it.
111
+
112
+ `detail.workflow_observations` is **not** reduced in either mode. Every note the
113
+ sensor writes is a signal — an unmapped roadmap status, a slug that refused its
114
+ files, a ledger severity outside the published enum, git and forge state, the
115
+ `--last-envelope` guard's divergence note — and they total about a kilobyte, so
116
+ trimming them would trade a real signal for no measurable win. The size comes from
117
+ `features` and the route memos, which are an order of magnitude larger and pure
118
+ history.
119
+
120
+ Everything else is byte-identical: `state`, `summary`, `unit`, `phase`, `pr`,
121
+ `gates`, `blockers`, `dependencies`, `recommendations`, `needs_input`, all of
122
+ `next` (`recommended`, `alternatives`, `tier`, `reason`, `candidate_count`,
123
+ `suggested`, `continuation`), `detail.repository_state`, `design_candidates`,
124
+ `pre_execution`, `review_loop_cycles`, `crash_recovery` and `urgent`. A consumer
125
+ may therefore switch modes per read without changing how it parses.
@@ -1,5 +1,10 @@
1
1
  ## Pre-execution receipt sensing (step 6a)
2
2
 
3
+ > **Legacy (feature 61 P8b):** the spec/plan pre-execution receipt stages are
4
+ > retired — the sensor now senses the unit doc's single triage block
5
+ > (`stage: lane`, see `ENVELOPE_FIELDS.md`). This reference is retained for
6
+ > units that still carry those receipts; the live sensing is the `lane` stage.
7
+
3
8
  Roadmap status says what exists; only a receipt bound to the current bytes says
4
9
  whether the unit may be executed. Sense it like every other signal — read the file,
5
10
  recompute the digest, never trust the prose sitting around the block.
@@ -145,5 +145,5 @@ mechanized.*
145
145
  `CRASH RECOVERY` sub-block to the report.
146
146
  18. **Report.** Print a short human summary (table: unit | status | deps unmet |
147
147
  PR | next gate) plus a **design candidates** line (`idea` units and their
148
- `/design-feature` next command) plus the `CRASH RECOVERY` sub-block, then
148
+ `/unit-lane` next command) plus the `CRASH RECOVERY` sub-block, then
149
149
  the envelope. With `--json-only`, envelope only.