shapeup-sdlc 3.18.3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.claude/settings.local.example.json +2 -3
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/AGENTS.md +115 -56
  4. package/README.md +101 -143
  5. package/SECURITY.md +16 -25
  6. package/agents/orient.md +14 -0
  7. package/agents/qa-edge-hunter.md +13 -0
  8. package/agents/spec-evaluator.md +14 -0
  9. package/agents/task-executor.md +14 -0
  10. package/bin/init.mjs +13 -16
  11. package/bin/lib/grant.mjs +8 -19
  12. package/commands/build.md +9 -14
  13. package/commands/eval.md +3 -3
  14. package/commands/hammer.md +9 -5
  15. package/commands/retro.md +12 -11
  16. package/commands/scopes.md +1 -12
  17. package/commands/ship.md +45 -88
  18. package/commands/wire.md +1 -8
  19. package/hooks/dispatch-receipt.mjs +94 -8
  20. package/hooks/hooks.json +0 -41
  21. package/hooks/lib/decision.mjs +6 -9
  22. package/hooks/lib/tier.mjs +50 -0
  23. package/hooks/sandbox-guard.mjs +140 -64
  24. package/kernel/gate.mjs +203 -22
  25. package/kernel/harness.mjs +20 -67
  26. package/kernel/init/run.mjs +175 -523
  27. package/kernel/lib/contract.mjs +9 -93
  28. package/kernel/lib/floor.mjs +64 -0
  29. package/kernel/lib/paths.mjs +39 -112
  30. package/kernel/order.mjs +157 -0
  31. package/kernel/probe/digest.mjs +2 -38
  32. package/kernel/schemas/domain.schema.json +146 -1125
  33. package/kernel/schemas/work-order.schema.json +8 -4
  34. package/kernel/schemas/work-result.schema.json +1 -1
  35. package/kernel/verify/envelope.mjs +2 -2
  36. package/kernel/verify/skills.mjs +27 -8
  37. package/kernel/verify/t0.mjs +2 -2
  38. package/package.json +4 -2
  39. package/skills/building/SKILL.md +144 -0
  40. package/skills/building/resources/gates.md +76 -0
  41. package/skills/building/resources/guidance.md +23 -0
  42. package/skills/{translator/references/preservation-rules.md → building/resources/intake-preservation.md} +1 -1
  43. package/skills/building/resources/intake.md +157 -0
  44. package/skills/building/resources/orders.md +69 -0
  45. package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/doc-schemas.md +1 -1
  46. package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/task-generation.md +13 -13
  47. package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/test-surface.md +6 -7
  48. package/skills/building/resources/plan-scopes.md +95 -0
  49. package/skills/building/resources/plan-spec.md +102 -0
  50. package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/_index.tmpl.md +1 -1
  51. package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/assess-report.tmpl.md +10 -11
  52. package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/run-state.tmpl.md +4 -4
  53. package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/scope-summary.tmpl.md +2 -2
  54. package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/synthesis.tmpl.md +4 -4
  55. package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/usecase.tmpl.md +2 -2
  56. package/skills/building/resources/plan-wire.md +82 -0
  57. package/skills/building/resources/plan.md +98 -0
  58. package/skills/building/resources/retro-research.md +60 -0
  59. package/skills/building/resources/retro-scan.md +49 -0
  60. package/skills/building/resources/retro.md +225 -0
  61. package/skills/building/resources/rounds.md +78 -0
  62. package/skills/building/resources/stop.md +127 -0
  63. package/skills/orient/SKILL.md +37 -37
  64. package/skills/qa-edge-hunter/SKILL.md +14 -14
  65. package/skills/shapeup/SKILL.md +5 -5
  66. package/skills/shapeup/resources/breadboarding.md +1 -1
  67. package/skills/shapeup/resources/context-compaction.md +5 -5
  68. package/skills/shapeup/resources/shaping.md +1 -1
  69. package/skills/spec-evaluator/SKILL.md +17 -21
  70. package/skills/spec-evaluator/references/dimension-contract.md +1 -1
  71. package/skills/spec-evaluator/references/dimensions/completeness.md +3 -3
  72. package/skills/spec-evaluator/references/dimensions/spec-conformance.md +1 -1
  73. package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +5 -5
  74. package/skills/task-executor/SKILL.md +11 -15
  75. package/commands/hill.md +0 -10
  76. package/hooks/gate-intake.mjs +0 -109
  77. package/hooks/gate-zerowork.mjs +0 -349
  78. package/hooks/tier-guard.mjs +0 -162
  79. package/kernel/compile.mjs +0 -1419
  80. package/kernel/init/fit.mjs +0 -199
  81. package/kernel/init/run-args.mjs +0 -206
  82. package/kernel/lib/breadboard.mjs +0 -165
  83. package/kernel/probe/attempts.mjs +0 -161
  84. package/kernel/probe/concurrency.mjs +0 -535
  85. package/kernel/probe/eval.mjs +0 -405
  86. package/kernel/probe/hunt.mjs +0 -104
  87. package/kernel/probe/leg.mjs +0 -229
  88. package/kernel/probe/owner.mjs +0 -142
  89. package/kernel/probe/requirements.mjs +0 -328
  90. package/kernel/probe/resume.mjs +0 -1110
  91. package/kernel/probe/rounds.mjs +0 -115
  92. package/kernel/probe/staged.mjs +0 -83
  93. package/kernel/probe/stats.mjs +0 -477
  94. package/kernel/probe/t0.mjs +0 -115
  95. package/kernel/reduce/board.mjs +0 -350
  96. package/kernel/reduce/graph.mjs +0 -482
  97. package/kernel/reduce/hill.mjs +0 -322
  98. package/kernel/reduce/ingest.mjs +0 -767
  99. package/kernel/reduce/leftovers.mjs +0 -159
  100. package/kernel/reduce/ship.mjs +0 -529
  101. package/kernel/reduce/snapshot.mjs +0 -291
  102. package/kernel/reduce/verdict.mjs +0 -172
  103. package/kernel/report/export.mjs +0 -384
  104. package/kernel/report/facts.mjs +0 -234
  105. package/kernel/verify/budget.mjs +0 -153
  106. package/kernel/verify/build.mjs +0 -428
  107. package/kernel/verify/dispatch.mjs +0 -114
  108. package/kernel/verify/spec.mjs +0 -975
  109. package/kernel/verify/trace.mjs +0 -604
  110. package/skills/ba-pitch-analyzer/SKILL.md +0 -204
  111. package/skills/coach/SKILL.md +0 -397
  112. package/skills/hill-chart/SKILL.md +0 -154
  113. package/skills/hill-chart/assets/dashboard.template.html +0 -1432
  114. package/skills/scope-architect/SKILL.md +0 -174
  115. package/skills/scope-hammer/SKILL.md +0 -231
  116. package/skills/solution-architect/SKILL.md +0 -158
  117. package/skills/tech-lead/SKILL.md +0 -151
  118. package/skills/tech-lead/references/gates.md +0 -605
  119. package/skills/tech-lead/references/protocol.md +0 -889
  120. package/skills/tech-lead/references/tiny-lane.md +0 -53
  121. package/skills/tech-lead/workflows/shapeup-run.js +0 -2187
  122. package/skills/translator/SKILL.md +0 -258
  123. /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/contract-patterns.md +0 -0
  124. /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/ddd-patterns.md +0 -0
  125. /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/integration-analysis.md +0 -0
  126. /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/ux-behavior-patterns.md +0 -0
  127. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/api-feasibility.tmpl.md +0 -0
  128. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/be-service.contract.tmpl.md +0 -0
  129. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/offline-storage.contract.tmpl.md +0 -0
  130. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/third-party-api.contract.tmpl.md +0 -0
  131. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/context-map.tmpl.md +0 -0
  132. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/event-choreography.tmpl.md +0 -0
  133. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/migration-plan.tmpl.md +0 -0
  134. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/team-handoff.tmpl.md +0 -0
  135. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/domain-model.tmpl.md +0 -0
  136. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/feedback.tmpl.md +0 -0
  137. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/integration.tmpl.md +0 -0
  138. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task-board.tmpl.md +0 -0
  139. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task-spike.tmpl.md +0 -0
  140. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task.tmpl.md +0 -0
  141. /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/ux-behavior.tmpl.md +0 -0
@@ -0,0 +1,127 @@
1
+ # Stop — decide when to stop (GATE H)
2
+
3
+ The census is yours: you do it in this context — no sub-agent — and GATE L4 reads one file to know it was done. The bar is Shape Up's own: as the budget runs
4
+ out, cut perfectionist ambition by comparing the product to the **baseline** — what customers live with
5
+ today — **never to a hypothetical ideal**. "Better than the baseline" is good enough to ship; "not as good as
6
+ I imagined" is not a reason to keep building. You propose; the PO decides.
7
+
8
+ ## When you do it
9
+
10
+ ```
11
+ 1. The loop ended well (a PASS, or a not-evaluated round) and QA is done — the normal stop.
12
+ 2. The outer breaker tripped: `maxRounds` spent — scopes may still be open.
13
+ 3. A scope exhausted its `attemptBudget` without a green T0 — you recorded it as a proposal; it is judged here
14
+ instead of blocking the round.
15
+ ```
16
+
17
+ What the run knows is in its files: the QA report under `.shapeup/<slug>/qa/`, the proposals you recorded, the scopes
18
+ with a green latest trial, and which breaker, if any, ended the run. Case 1 has no unresolved scopes; cases 2 and 3 do,
19
+ and each becomes an explicit CUT or CARRY candidate below.
20
+
21
+ ## Census
22
+
23
+ Gather every open item into one list before judging any of them. A partial view produces a wrong cut.
24
+
25
+ **Every claim cites the file it came from.** Derive, never remember:
26
+
27
+ | Claim | Read | Rule |
28
+ |---|---|---|
29
+ | "no scope owns X" / "X is scope Y's" | the `allowed_file_substrate` and `shared_substrate` of every `<spec>scopes/*.md`, and the paths `<spec>wiring-map.md` names | Ownership is what the contracts say. A path no contract lists is an unowned seam; a path the wiring names that is not on disk is owned but never written. A census that narrated ownership from memory once told the PO no scope owned a directory a committed contract listed in plain sight. |
30
+ | a pitch clause the run never showed working | `<spec>requirements.md`, and the verdict's criteria with their `covers:` anchors | A requirement with no passing criterion is a census item carrying its source clause (`REQ-12 ← shaping.md R12`). A clause the PO marked `CUT (PO-approved)` is an answer already given, not an item. No registry on disk → none. |
31
+ | "scope S exhausted its attempts" | `<run>/t0/trials.jsonl` and `<run>/receipts/dispatch.jsonl` | Count the scope's attempts that have a dispatch receipt AND a result. A compiled order and a T0 verdict are both writable by the scope being judged, so neither counts alone. |
32
+
33
+ Then collect, from the run's own records:
34
+
35
+ - Unresolved scopes (breaker cases): uphill/downhill scopes when the round budget hit 0, and scopes with a
36
+ proposal — **carry candidates**, each with its hill phase and open unknowns from `hill/<scope-id>.yml`.
37
+ - QA findings: `.shapeup/<slug>/qa/` report when present — all `~` by default.
38
+ - Discovered-ledger entries still open (`.shapeup/<slug>/discovery/ledger.md`, `[+]` / `~` unresolved).
39
+ - Requirements with no PASS evidence (above).
40
+
41
+ **Classify every item.** MUST-HAVE: the pitch's core problem is unsolved without it. NICE-TO-HAVE (`~`): improves
42
+ but does not block the core promise. **Default to NICE-TO-HAVE** unless the item traces directly to a pitch
43
+ boundary or a scope's `business_goal` — a generous must-have list defeats the point of hammering.
44
+
45
+ ```
46
+ ⏸ GATE H0 — Census
47
+ Must-have (unresolved) : [N] — [list, each with source: scope | QA | discovered | requirement | advisor-overflow]
48
+ Nice-to-have (~) : [M]
49
+ Carry candidates : [scopes still uphill/downhill, or exhausted attempt budget]
50
+ ```
51
+
52
+ ## Baseline comparison
53
+
54
+ 1. Resolve the baseline: `shapeup/<slug>/shaping/baseline.md` when present (written at shaping time, first-class).
55
+ Absent → degrade honestly: read the pitch's problem statement as the implicit baseline and say
56
+ "baseline not first-class — comparison is approximate" in the report. **Do not invent one.**
57
+ 2. For each MUST-HAVE: "with this item cut or carried, is the shipped product still strictly better than the
58
+ baseline for the pitch's core problem?"
59
+ - YES → safe to cut or carry; it is a cut-list candidate anyway (the PO is still asked).
60
+ - NO → this item blocks shipping as it stands and is **not hammer-cuttable**. Fix it now (one more focused
61
+ attempt, not a full extra round) or the run genuinely fails the appetite: say so, do not ship anyway.
62
+ 3. NICE-TO-HAVE items never block; they are cut-list candidates by construction.
63
+
64
+ ## Cut list and verdict
65
+
66
+ ```
67
+ ⏸ GATE H2 — Cut List & Verdict
68
+ Baseline : [shapeup/<slug>/shaping/baseline.md | approximate — pitch problem statement]
69
+ Ship-blocking : [none | MUST-HAVE items that fail the comparison — NOT cuttable]
70
+ Proposed cuts : [N nice-to-have + N cuttable must-have, each: item — source — one-line why safe]
71
+ Carry-forward : [scopes/items proposed for the next cycle's raw-idea list, debt-free]
72
+ Verdict : [SHIP now | SHIP after fixing ship-blocking items | CANNOT SHIP — escalate to PO]
73
+ ```
74
+
75
+ The PO confirms every cut ("approve all / list ids to keep / none"); you never override a kept item. Whatever
76
+ is not kept is carried to the discovery ledger as a raw idea — debt-free, never silently dropped, never
77
+ silently promoted back into scope. A ship-blocking item the PO overrides is logged as a known gap in the ship
78
+ report, never hidden.
79
+
80
+ ## The census file — what the step is done on
81
+
82
+ Write the census as data (shape `HammerCensus` in the kernel's domain registry), beside the
83
+ human-readable report, to `.shapeup/<slug>/reports/hammer-census.json`:
84
+
85
+ ```json
86
+ { "schema_version": 1, "verdict": "ship-now | ship-after-fixes | cannot-ship",
87
+ "cut_list": ["…"], "ship_blocking": ["…"], "breaker": "outer | inner | deadline | null", "baseline": "<path or null>" }
88
+ ```
89
+
90
+ `ship_blocking` is non-empty exactly when the verdict is `cannot-ship`. **GATE L4's resolver reads this file —
91
+ and nothing else — before it lets any answer set say `ship`:** a census that lives only in your printed blocks
92
+ cannot be read by a gate. Still a proposal: the file grants nothing.
93
+
94
+ Read it back before you cross GATE H: readable JSON, a verdict from the three, a `cut_list` array, and `ship_blocking`
95
+ non-empty exactly when the verdict is `cannot-ship`. A census that fails that read is yours to fix now; do not cross the gate over it.
96
+
97
+ ## The ship report
98
+
99
+ After GATE H and before GATE L4, write `shapeup/<slug>/REPORT.md` — frozen at L4, committed, so it carries no run-trace path and no board id
100
+ (cite use cases and scope ids instead; the fence refuses the write otherwise). Its first line says what this is: **a ship is not a pass**, so
101
+ a shipped FAIL opens with `Shipped over a FAIL verdict, with the cut list below`, never with the title alone. Then:
102
+
103
+ - **Outcome** — the verdict, rounds used and judged, tasks done of planned, whether QA ran, did not run, or ran and drove nothing, and the
104
+ models: per role, what the launch record asked for and what the dispatch receipts (`<run>/receipts/dispatch.jsonl`, `usage.model`) name as
105
+ having run. Where the two differ, say so here: a cost or a verdict read against the wrong model is a figure about a different run.
106
+ - **Verification** — one row per scope from its latest trial: fixtures passed of total, regressions, trials, last status.
107
+ - **Requirements** — one row per registered clause: its source, the covering criterion, its verdict. A projection, never a verdict; none of it blocks the ship.
108
+ - **The cut list and the known gaps** — every cut the PO accepted, and every ship-blocking item the PO overrode.
109
+ - **What did not finish** — the unfinished tasks by use case. A run launched with `noEval` says nothing was evaluated and never reads as verified.
110
+
111
+ Every figure is read off a file you opened in this step. A report written from memory of the run is the failure this section exists to prevent.
112
+
113
+ A write the fence refuses names a live order: a dead session left a dispatch open. That is dead work, not yours to
114
+ answer — say so to the PO (`init run --force` answers every open order and discards the round history; only the PO
115
+ asks for it).
116
+
117
+ ## What never changes
118
+
119
+ | Rule | Why |
120
+ |---|---|
121
+ | Compare to the baseline, never to a perfect ideal | the actual trade-off algorithm of the stop step |
122
+ | Default classification is NICE-TO-HAVE | a generous must-have list defeats the point |
123
+ | A MUST-HAVE that fails the comparison is never cut silently | the one case where the census refuses to make the run look shippable |
124
+ | Cuts are proposals; the PO confirms every one | the census never overrides the human at the ship gate |
125
+ | Every ownership, exhaustion and requirement claim cites its file | derived from the contracts and the receipts, never from what the report remembers |
126
+ | You never set `status: done`, deploy, or ship | the run closes only after GATE L4 is crossed — `order close --status shipped` refuses without this run's `ship` row; the judge, the doer and the census stay separate acts |
127
+ | Guidance never decides a gate | a knowledge-base rule may add a question to the H block, never an answer; there is no `stop` knowledge-base file — the census's claims come from files |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: orient
3
- description: "Use this skill for Shape Up step 7 (Orient) — the builder-led reconnaissance pass that runs AFTER kick-off and BEFORE any task board exists. Triggers on: \"orient on this feature\", \"scout the codebase for this pitch\", \"where does this pitch touch the code\", \"do an orient pass\", \"recon before we plan\", \"spike the riskiest part before mapping scopes\". The tech-lead orchestrator invokes it at step 7 before delegating to ba-pitch-analyzer (Map Scopes, step 8). Use it even when the user describes \"read the code first and surface the unknowns\" without naming Orient. Also accepts a tech-lead --order dispatch."
3
+ description: "Use this skill for Shape Up step 7 (Orient) — the builder-led reconnaissance pass that runs AFTER kick-off and BEFORE any task board exists. Triggers on: \"orient on this feature\", \"scout the codebase for this pitch\", \"where does this pitch touch the code\", \"do an orient pass\", \"recon before we plan\", \"spike the riskiest part before mapping scopes\". The loop (`/ship`) invokes it at step 7, before the plan activity (Map Scopes, step 8). Use it even when the user describes \"read the code first and surface the unknowns\" without naming Orient. Also accepts a the loop --order dispatch."
4
4
  ---
5
5
 
6
6
  # Orient — the Scout (Shape Up step 7)
@@ -8,16 +8,16 @@ description: "Use this skill for Shape Up step 7 (Orient) — the builder-led re
8
8
  In Shape Up, the team that builds also **orients**: after kick-off they read the real code,
9
9
  spike the scary parts, and let reality generate **Discovered tasks** — which outnumber the
10
10
  imagined ones. This skill is that pass, made explicit. It exists because the orchestrator
11
- (`tech-lead`) must *delegate* orientation, and the generator (`task-executor`) can't host it:
11
+ (`building`) must *delegate* orientation, and the generator (`task-executor`) can't host it:
12
12
  its first gate needs a task file, and **at Orient time no board exists yet** — the board is
13
- mapped *after* this pass, by `ba-pitch-analyzer` at step 8.
13
+ mapped *after* this pass, by the plan activity at step 8.
14
14
 
15
15
  So the Scout's whole job is to make the planner's board **reality-born instead of imagined**.
16
- It hands `ba` a map of where the pitch lands in real code, the findings from de-risking the
16
+ It hands the plan step a map of where the pitch lands in real code, the findings from de-risking the
17
17
  single scariest area, and a seed list of tasks (imagined + already-discovered). Nothing more.
18
18
 
19
19
  ```
20
- PO: shaping → bet → kick-off ──► tech-lead ──► ORIENT (you) ──► ba (Map Scopes) ──► build
20
+ PO: shaping → bet → kick-off ──► the loop ──► ORIENT (you) ──► plan (Map Scopes) ──► build
21
21
  reads code, spikes, seeds
22
22
  ```
23
23
 
@@ -29,13 +29,13 @@ PO: shaping → bet → kick-off ──► tech-lead ──► ORIENT (you) ─
29
29
  |------|----------|
30
30
  | Read the kicked-off pitch + breadboard | Re-shape, re-bet, or question the appetite (PO already did) |
31
31
  | Trace pitch elements to real files/modules | Write production code |
32
- | Spike the **single** riskiest area, time-boxed | Build the scope board / tasks (that is `ba`, step 8) |
33
- | Seed the discovered-task list (imagined + discovered) | Keep `run-state` (tech-lead owns it) |
34
- | Emit raw hill **signal** (per-area unknowns) | Render the hill **report** (tech-lead renders it) |
32
+ | Spike the **single** riskiest area, time-boxed | Build the scope board / tasks (that is the plan step, step 8) |
33
+ | Seed the discovered-task list (imagined + discovered) | Keep `run-state` (the loop owns it) |
34
+ | Emit raw hill **signal** (per-area unknowns) | Render the hill **report** (the loop renders it) |
35
35
 
36
36
  The Scout is a **pure worker** (the harness rule: stateless workers, one stateful
37
37
  orchestrator). It receives run metadata — `feature`, `spec` folder, `stack` — as **arguments**
38
- from `tech-lead`; it never reads or writes a shared run-state file.
38
+ from `building`; it never reads or writes a shared run-state file.
39
39
 
40
40
  ---
41
41
 
@@ -52,10 +52,10 @@ write surface — the orient output dir. Anything absent = unknown: confirm at G
52
52
  `--pitch/--spec/--stack` flags below carry the same fields; the output dir derives from the
53
53
  spec path (`.shapeup/<feat>/orient/`).
54
54
 
55
- ## Output — the four artifacts (the `orient → ba` contract) + a WorkResult
55
+ ## Output — the four artifacts (the `orient → plan` contract) + a WorkResult
56
56
 
57
57
  All four land in the orient output dir (orchestrated: the order's substrate; standalone:
58
- `.shapeup/<feat>/orient/`). These ARE the contract `ba` Phase 1 consumes, so `ba` does
58
+ `.shapeup/<feat>/orient/`). These ARE the contract the plan step's Phase 1 consumes, so it does
59
59
  not re-scan the codebase. Keep them factual and link real `file:line` so the planner can trust
60
60
  them. When dispatched with an order, also write the WorkResult envelope
61
61
  (`.shapeup/<feat>/results/<order-suffix>.json`, `work-result.schema.json`): `status`,
@@ -63,10 +63,10 @@ them. When dispatched with an order, also write the WorkResult envelope
63
63
 
64
64
  | File | Purpose | Consumed by |
65
65
  |------|---------|-------------|
66
- | `orient/code-surface.md` | where the pitch lands in real code: modules, files, existing entities, seams | `ba` Phase 1 (ingest), Phase 2 (DDD) |
67
- | `orient/spike-<area>.md` | findings from de-risking the single riskiest area | `ba` Phase 1b / contracts; tech-lead L1a |
68
- | `orient/discovered-seed.md` | imagined + already-discovered tasks, grouped by suspected scope | `ba` Phase 6 (task gen) |
69
- | `orient/hill-signal.md` | per-area inventory of open unknowns (raw signal, not a report) | `tech-lead` GATE L1a hill render |
66
+ | `orient/code-surface.md` | where the pitch lands in real code: modules, files, existing entities, seams | the plan step's Phase 1 (ingest), Phase 2 (DDD) |
67
+ | `orient/spike-<area>.md` | findings from de-risking the single riskiest area | the plan step's Phase 1b / contracts; the loop L1a |
68
+ | `orient/discovered-seed.md` | imagined + already-discovered tasks, grouped by suspected scope | the plan step's Phase 6 (task gen) |
69
+ | `orient/hill-signal.md` | per-area inventory of open unknowns (raw signal, not a report) | `building` GATE L1a hill render |
70
70
 
71
71
  ---
72
72
 
@@ -91,10 +91,10 @@ Phase 5 │ Seed discovered tasks ► imagined + discovered, grouped by suspe
91
91
  │ → write orient/discovered-seed.md
92
92
  Phase 6 │ Emit hill signal ────► per-area open-unknown inventory
93
93
  │ → write orient/hill-signal.md
94
- ✅ Done └─► 4 artifacts in .shapeup/<feat>/orient/ — hand back to tech-lead for GATE L1a
94
+ ✅ Done └─► 4 artifacts in .shapeup/<feat>/orient/ — hand back to the loop for GATE L1a
95
95
  ```
96
96
 
97
- Under `--auto` (passed by `tech-lead` when its run level is `--auto`/`--unattended`), run
97
+ Under `--auto` (passed by `building` when its run level is `--auto`/`--unattended`), run
98
98
  straight through, auto-confirming O-A and O-B with sensible defaults.
99
99
 
100
100
  ---
@@ -105,7 +105,7 @@ straight through, auto-confirming O-A and O-B with sensible defaults.
105
105
  Confirm (do not guess):
106
106
  - kicked-off pitch path (shaping.md / pitch.md)
107
107
  Shaped signal: frontmatter status: shaped AND bet: <S1|S2|...> (or equivalent).
108
- If the pitch lacks appetite AND solution boundaries → STOP and tell tech-lead:
108
+ If the pitch lacks appetite AND solution boundaries → STOP and tell the loop:
109
109
  "Orient runs on a kicked-off pitch, not a raw idea. Shape/bet first (PO upstream)."
110
110
  - breadboard — read `payload.breadboard` when present; absent means the pitch has no separate
111
111
  breadboard — look for Places and affordance tables in the pitch itself
@@ -160,7 +160,7 @@ Rank candidate areas by **(open unknowns) × (integration risk)**. The riskiest
160
160
  where the pitch meets an unproven seam: a third-party API, a data-shape you can't confirm from
161
161
  code, a cross-layer contract, a performance assumption. Pick the **single** highest — the
162
162
  Scout spikes one thing well, not five things shallowly. List the rest as known unknowns (they
163
- feed the hill signal and `ba`'s rabbit-hole handling).
163
+ feed the hill signal and the plan step's rabbit-hole handling).
164
164
 
165
165
  ## GATE O-B — Spike scope
166
166
 
@@ -187,33 +187,33 @@ the time-box; a partial answer with a clear residual unknown is a valid result.
187
187
 
188
188
  ## Phase 5 — Seed discovered tasks → `discovered-seed.md`
189
189
 
190
- Write the task seed `ba` Phase 6 will turn into the board. Two kinds, clearly labelled:
190
+ Write the task seed the plan step's Phase 6 will turn into the board. Two kinds, clearly labelled:
191
191
  - **Imagined** — what you'd expect from the pitch alone.
192
192
  - **Discovered** — what the code-surface scan and spike actually surfaced (the higher-value
193
193
  set; in Shape Up these dominate). **Every discovered task must cite `file:line` or seam.**
194
194
  If you can't cite a real location, it belongs in Imagined, not Discovered.
195
195
 
196
- Group by **suspected scope** so `ba` can map scopes naturally. Do **not** assign IDs, order,
196
+ Group by **suspected scope** so the plan step can map scopes naturally. Do **not** assign IDs, order,
197
197
  or dependencies — that is the planner's job. You are handing over raw material, not a plan.
198
198
 
199
199
  > This is the seed for the planner's first board. The *in-build* discovered-task loop
200
- > (build WorkResults' discoveries[] ingested into the live ledger, reconciled by a planner
201
- reconcile order) is
200
+ > (build WorkResults' discoveries[] applied to the live ledger, reconciled by a plan spec step
201
+ in `reconcile` mode) is
202
202
  > a separate, later mechanism — don't conflate the two.
203
203
 
204
204
  ## Phase 6 — Emit hill signal → `hill-signal.md`
205
205
 
206
206
  For each suspected scope/area, list its **open unknowns** (unresolved spike question, `⏳ TBD`
207
- data shape, unproven seam, ambiguous requirement). This is the raw input `tech-lead` renders
207
+ data shape, unproven seam, ambiguous requirement). This is the raw input `building` renders
208
208
  into the Hill at GATE L1a — a scope with open unknowns sits **uphill**; one whose approach the
209
- spike proved sits toward the **crest**. Emit the *facts*; let `tech-lead` position the dots.
210
- Keep it per-area (not per-slice) — slices don't exist until `ba` maps them at step 8.
209
+ spike proved sits toward the **crest**. Emit the *facts*; let `building` position the dots.
210
+ Keep it per-area (not per-slice) — slices don't exist until the plan step maps them at step 8.
211
211
 
212
212
  ---
213
213
 
214
214
  ## Done — completion output
215
215
 
216
- When all four artifacts are written, emit this summary (to tech-lead or directly to the user
216
+ When all four artifacts are written, emit this summary (to the loop or directly to the user
217
217
  in standalone mode):
218
218
 
219
219
  ```
@@ -225,12 +225,12 @@ in standalone mode):
225
225
  discovered-seed.md — <N imagined> + <M discovered> tasks seeded across <K> scopes
226
226
  hill-signal.md — <summary line from hill, e.g. "No uphill areas; spike at crest.">
227
227
 
228
- Ready for ba (step 8):
229
- Pass --orient-dir .shapeup/<feat>/orient/ to ba-pitch-analyzer.
230
- ba Phase 1 skips its own codebase scan and reads code-surface.md as its authoritative map.
228
+ Ready for the plan step (step 8):
229
+ The plan activity's spec step carries .shapeup/<feat>/orient/ as its orient directory.
230
+ Its INGEST phase skips its own codebase scan and reads code-surface.md as its authoritative map.
231
231
  ```
232
232
 
233
- Tech-lead uses this to render the GATE L1a Hill and confirm the spike before handing to `ba`.
233
+ The loop uses this to render the GATE L1a Hill and confirm the spike before handing to the plan step.
234
234
 
235
235
  ---
236
236
 
@@ -242,25 +242,25 @@ Tech-lead uses this to render the GATE L1a Hill and confirm the spike before han
242
242
  | Writes the four artifacts, nothing else | The Scout is a pure worker; no code, no board, no run-state, no report |
243
243
  | Spike exactly one area OR declare SPIKE-NOT-NEEDED | Depth on the scariest unknown beats shallow coverage; don't spike for its own sake |
244
244
  | Every Discovered task in the seed cites `file:line` | If no real location exists, it belongs in Imagined, not Discovered |
245
- | Never assign task IDs/order/deps in the seed | Mapping scopes is `ba`'s job (step 8) — the Scout hands over raw material |
246
- | Receives `feature`/`spec`/`stack` as args; never touches run-state | `tech-lead` is the sole run-state writer |
247
- | Emits hill *signal*, never a hill *report* | `tech-lead` renders progress; workers emit facts |
245
+ | Never assign task IDs/order/deps in the seed | Mapping scopes is the plan step's job (step 8) — the Scout hands over raw material |
246
+ | Receives `feature`/`spec`/`stack` as args; never touches run-state | `building` is the sole run-state writer |
247
+ | Emits hill *signal*, never a hill *report* | `building` renders progress; workers emit facts |
248
248
 
249
249
  ---
250
250
 
251
251
  ## Invocation
252
252
 
253
253
  ```bash
254
- # Invoked by tech-lead at step 7 (canonical) — compile-order --operation orient --slug <feat> …
254
+ # Invoked by the loop at step 7 (canonical) — the order the loop wrote
255
255
  /orient --order .shapeup/<feat>/orders/orient.json
256
256
 
257
- # Standalone flags (the preamble shim compiles the same envelope)
257
+ # Standalone flags (the preamble shim writes the same envelope by hand)
258
258
  /orient --pitch shapeup/<feat>/shaping/shaping.md --spec shapeup/<feat>/spec/ --stack "pnpm, Next 16 web :3000"
259
259
 
260
260
  # Standalone recon (no orchestrator) — still writes only the four artifacts
261
261
  /orient --pitch shapeup/<feat>/shaping/shaping.md --spec shapeup/<feat>/spec/
262
262
 
263
- # Auto (tech-lead passes this under --auto/--unattended): run straight through
263
+ # Auto (the loop passes this under --auto/--unattended): run straight through
264
264
  /orient --pitch ... --spec ... --auto
265
265
  ```
266
266
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: qa-edge-hunter
3
- description: "Use this skill for the post-PASS exploratory QA pass — Shape Up's \"QA is for the edges\", made explicit for the harness. Triggers on: \"hunt edge cases\", \"QA pass on this feature\", \"exploratory test the running app\", \"edge hunt before ship\", \"run qa-edge-hunter\", \"the evaluator passed — what did it miss?\". tech-lead invokes it after the run's first PASS at GATE L3, before SHIP; it also runs standalone given a spec folder, a PASS EVAL report, and a running app, or on a tech-lead --order dispatch. It charters edges OUTSIDE what the evaluator probed and hunts them through six fixed lenses. NOT for checking AC (spec-evaluator), deriving test cases (ba), or fixing bugs (task-executor)."
3
+ description: "Use this skill for the post-PASS exploratory QA pass — Shape Up's \"QA is for the edges\", made explicit for the harness. Triggers on: \"hunt edge cases\", \"QA pass on this feature\", \"exploratory test the running app\", \"edge hunt before ship\", \"run qa-edge-hunter\", \"the evaluator passed — what did it miss?\". the loop invokes it after the run's first PASS at the Verdict gate, before ship; it also runs standalone given a spec folder, a PASS EVAL report, and a running app, or on a loop --order dispatch. It charters edges OUTSIDE what the evaluator probed and hunts them through six fixed lenses. NOT for checking AC (spec-evaluator), deriving test cases (ba), or fixing bugs (task-executor)."
4
4
  ---
5
5
 
6
6
  # QA Edge Hunter — the post-PASS edge pass (v1.1)
@@ -13,7 +13,7 @@ case* is invisible to it. The Hunter covers exactly that blind spot: behavior th
13
13
  never wrote down.
14
14
 
15
15
  ```
16
- tech-lead: ... GATE L2 → EVAL → GATE L3 PASS ──► QA EDGE HUNT (you) ──► SHIP S.0 triage → L4
16
+ the loop: ... GATE L2 → EVAL → GATE L3 PASS ──► QA EDGE HUNT (you) ──► SHIP S.0 triage → L4
17
17
  charters · hunts · ~ findings → ledger
18
18
  GATE L3 FAIL → fix round (never reaches you — conformance first, edges after)
19
19
  ```
@@ -22,7 +22,7 @@ tech-lead: ... GATE L2 → EVAL → GATE L3 PASS ──► QA EDGE HUNT (you)
22
22
 
23
23
  | Tier | Owner | When |
24
24
  |---|---|---|
25
- | Derivable tests (boundaries, error codes, no-go breaches the spec implies) | `ba` `## Test Surface` + evaluator `test-surface-conformance` | spec time / every EVAL |
25
+ | Derivable tests (boundaries, error codes, no-go breaches the spec implies) | the plan step's `## Test Surface` + evaluator `test-surface-conformance` | spec time / every EVAL |
26
26
  | **Exploratory edges (this skill)** | `/qa-edge-hunter` | once, post-first-PASS |
27
27
 
28
28
  ---
@@ -32,7 +32,7 @@ tech-lead: ... GATE L2 → EVAL → GATE L3 PASS ──► QA EDGE HUNT (you)
32
32
  | Does | Does NOT |
33
33
  |------|----------|
34
34
  | Read EVAL-*.md to map covered territory — then hunt OUTSIDE it | Re-probe anything the evaluator already graded |
35
- | Charter edges via six fixed lenses, minus covered territory | Author or extend `## Test Surface` (that is the planner's retrofit-surface operation) |
35
+ | Charter edges via six fixed lenses, minus covered territory | Author or extend `## Test Surface` (that is the planner's `retrofit-surface` spec mode) |
36
36
  | Execute charters against the **running deliverable** (session-based exploratory) | Read-only speculate from code ("this looks racy") — every finding needs a live repro |
37
37
  | Return each finding in the WorkResult's `discoveries[]`, **always `~`** | Promote `~` → must-have (PO/TL at SHIP S.0; severity-hint is advice, not a decision) |
38
38
  | Emit `qa/hunt-report.md` — charters run/cut, findings by lens | Render a verdict, score, or PASS/FAIL of any kind |
@@ -48,7 +48,7 @@ zero exit as the deliverable reached; `build_gate` records that the round's gate
48
48
  Drive it with the tools the project's knowledge base names, by the path it gives.
49
49
  Do not refuse the hunt, and do not invent a URL. Its write surface is
50
50
  `.shapeup/<feature>/qa/**` only. The Hunter never touches the discovery ledger itself —
51
- ingest appends its `discoveries[]` under a `## Discovered` section, preserving single-writer
51
+ the loop appends its `discoveries[]` under a `## Discovered` section, preserving single-writer
52
52
  mechanically.
53
53
 
54
54
  ---
@@ -77,18 +77,18 @@ HARD (any miss → STOP, report which):
77
77
  real invocation of the entry point (not a ping, not a guess that a tool is missing). When the
78
78
  order carries `launch_cmd`, run it before concluding anything; the report names the command
79
79
  and its exit. A hunt that reached nothing returns `status: failed`, never `done`. A hunt that
80
- reached the app runs at least one charter: ingest refuses a `done` whose report says
80
+ reached the app runs at least one charter: the loop sends back a `done` whose report says
81
81
  `charters: 0/…` while the order carried `launch_cmd` or `app_url`.
82
82
  ✅ EVAL-FEATURE-<slug>.md exists with verdict: PASS
83
83
  ✅ if discovery/ledger.md exists: ledger.feature == <feature> (read-only context check —
84
- a missing ledger is fine; ingest creates it when your findings land)
84
+ a missing ledger is fine; the loop creates it when your findings land)
85
85
  SOFT:
86
86
  ⚠️ any usecases/UC-*.md has `## Test Surface`?
87
87
  NO → DEGRADED MODE:
88
88
  "Test Surface absent — derivable cases (boundaries, error codes, no-go breaches)
89
89
  were never systematically probed. Lenses ① and ⑤ will widen to compensate
90
90
  (charters tagged [derivable-fallback]). Better: run
91
- a ba-pitch-analyzer retrofit-surface order + one evaluator pass first, then hunt
91
+ a plan spec step in `retrofit-surface` mode + one evaluator pass first, then hunt
92
92
  with a narrower charter. Continue degraded? [y/n]"
93
93
  Degraded is first-class, not an error — for old specs, a degraded hunt beats no hunt.
94
94
  Questions: max 2. The standing one: "Any areas OUT OF BOUNDS for exploratory testing?
@@ -101,7 +101,7 @@ from charters and listed in the report, never silently skipped.
101
101
  ⏸ GATE Q0 — Preflight
102
102
  App : [url] ✅ reachable
103
103
  EVAL : EVAL-FEATURE-[slug].md — PASS (dims: [...])
104
- Ledger : [✅ feature match | absent — ingest will create it]
104
+ Ledger : [✅ feature match | absent — the loop will create it]
105
105
  Surface : [present | ABSENT → degraded mode]
106
106
  Out-of-bounds? (max 2 questions) …
107
107
  ```
@@ -111,7 +111,7 @@ Out-of-bounds? (max 2 questions) …
111
111
  ## Phase Q1 — Charter Map
112
112
 
113
113
  A **charter** is a hunting ground + a mission — NOT a test case (test cases are the
114
- derivable tier; writing them here would re-do `ba`'s job badly). Generate charters by
114
+ derivable tier; writing them here would re-do the plan step's job badly). Generate charters by
115
115
  crossing the UC tree with the **six fixed lenses**, then subtract covered territory.
116
116
 
117
117
  | Lens | Mission | Typical prey |
@@ -137,7 +137,7 @@ A charter is a license to deviate within a hunting ground; a test case is a scri
137
137
 
138
138
  ```
139
139
  Q1.0 Read team guidelines: the file at `payload.kb_rules_path` (if present; absent field = none).
140
- `/coach`-distilled edge classes that kept biting past features (e.g. "session-expiry
140
+ retro-distilled edge classes that kept biting past features (e.g. "session-expiry
141
141
  mid-form keeps surfacing"). Steering, never spec and never a verdict: use them to
142
142
  PRIORITIZE charters within the six fixed lenses — never to add a seventh lens, skip
143
143
  covered-territory subtraction, or promote a finding on their say-so. Absent = none recorded.
@@ -209,7 +209,7 @@ Per charter:
209
209
  "severity_hint": "data-integrity | boundary-breach | ux-degradation | cosmetic",
210
210
  "test_gap": "unit | integration | exploratory-only" }
211
211
 
212
- Always `~` — ingest appends these to the discovery ledger verbatim; you never open
212
+ Always `~` — the loop appends these to the discovery ledger verbatim; you never open
213
213
  the ledger file. severity_hint is the Hunter's advice to triage — the promotion
214
214
  decision is PO/TL's at SHIP S.0, never made here.
215
215
  test_gap is advisory for reconciliation: unit = a targeted unit test would have
@@ -307,7 +307,7 @@ hammered out at GATE Q1 (not hunted): […]
307
307
  | ① Boundary | C-01, C-05 | 2 | 0 |
308
308
  | … | | | |
309
309
  → details live in .shapeup/<feature>/discovery/ledger.md under the `## Discovered` section
310
- ingest appends for this hunt's order
310
+ the loop appends for this hunt's order
311
311
 
312
312
  ## Shaping-quality signal (advisory, for the PO — next cycle's input)
313
313
  - lens ⑤ findings ≈ No-gos written loosely (breach routes left open)
@@ -353,7 +353,7 @@ No verdict line exists in this file by design. The Hunter's last words:
353
353
  1. **Never a verdict.** The run's verdict is the evaluator's PASS. One judge.
354
354
  2. **Never promote.** Every finding is born `~`. severity-hint advises; PO/TL decide.
355
355
  3. **Never fix.** Read-only on code; execute-only on the app; write-only to
356
- qa/hunt-report.md + its own WorkResult (findings return as data; ingest owns the ledger).
356
+ qa/hunt-report.md + its own WorkResult (findings return as data; the loop owns the ledger).
357
357
  4. **Never block ship.** A hunt with 40 findings and a hunt with 0 both end the same way:
358
358
  report, then triage at L4. The circuit breaker outranks the Hunter.
359
359
  5. **Never re-probe covered territory.** EVAL-*.md territory is subtracted at Q1; an
@@ -237,7 +237,7 @@ INPUT: raw idea / brief / feature description
237
237
  ✅ rabbit holes listed ✅ fit check clean ✅ ≤9 slices
238
238
  ▼
239
239
  OUTPUT: shaping.md + breadboard.md (+ spike-[part].md if applicable)
240
- → kicked-off pitch, ready for /ba-pitch-analyzer or /tech-lead
240
+ → kicked-off pitch, ready for `/ship` (the plan activity takes it from here)
241
241
  ```
242
242
 
243
243
  ### Progress Markers
@@ -368,7 +368,7 @@ Two roots, separated by artifact **nature** (full design →
368
368
  | Root | Contents | Nature | Git |
369
369
  |---|---|---|---|
370
370
  | `shapeup/[slug]/shaping/` | shaping · breadboard · spike · pitch · kickoff | **durable source** | commit, shared |
371
- | `shapeup/[slug]/spec/` | domain model · UC · contracts · tasks (ba-pitch-analyzer output) | **durable deliverable** | commit, shared |
371
+ | `shapeup/[slug]/spec/` | domain model · UC · contracts · tasks (the plan activity's output) | **durable deliverable** | commit, shared |
372
372
  | `.shapeup/[slug]/` | run-state · gate log · **digest.md** · orient/ · evaluation/ · qa/ · ledger | **ephemeral / derived** | **gitignore (hidden)** |
373
373
 
374
374
  - **Shared** root `shapeup/[slug]/` = what the team contributes to
@@ -378,7 +378,7 @@ Two roots, separated by artifact **nature** (full design →
378
378
  harvest shards `.shapeup/metrics/*.jsonl`, lives under the local root.
379
379
  - `digest.md` is the run's derived decision context (the 4-field, two-zone read
380
380
  model the gates consume). It is **never** the source of truth and never crosses
381
- a skill boundary — `ba-pitch-analyzer` reads `pitch.md`/`shaping.md`, never the
381
+ a skill boundary — the plan activity reads `pitch.md`/`shaping.md`, never the
382
382
  digest.
383
383
  - **Ripple-check rule (mandatory):** the digest carries **no `shaping: true`** —
384
384
  it is a sink, not a node. The ripple-check **must glob-exclude
@@ -387,14 +387,14 @@ Two roots, separated by artifact **nature** (full design →
387
387
 
388
388
  ---
389
389
 
390
- ## Integration with ba-pitch-analyzer
390
+ ## Integration with the plan activity
391
391
 
392
392
  ```
393
393
  /shapeup shaping → shaping.md
394
394
  /shapeup spike → spike-[part].md (as needed)
395
395
  /shapeup breadboarding → breadboard.md (with slices)
396
396
  ↓
397
- /ba-pitch-analyzer shapeup/[feature-slug]/shaping/shaping.md
397
+ /ship shapeup/[feature-slug]/shaping/shaping.md (its plan step reads the pitch)
398
398
  ↓
399
399
  shapeup/[feature-slug]/spec/ (domain model, contracts, use cases, tasks)
400
400
  ```
@@ -357,7 +357,7 @@ status: breadboarded
357
357
  |---|-------|-----------|------|
358
358
  ```
359
359
 
360
- **Note:** This file is the second half of the kicked-off pitch (with `shaping.md`). `/ba-pitch-analyzer` and `/tech-lead` consume it as-is — affordance IDs (U[N], N[N]) are the traceability anchors downstream tasks and commits reference.
360
+ **Note:** This file is the second half of the kicked-off pitch (with `shaping.md`). `/ship` (its plan step) consumes it as-is — affordance IDs (U[N], N[N]) are the traceability anchors downstream tasks and commits reference.
361
361
 
362
362
  ---
363
363
 
@@ -161,7 +161,7 @@ mostly: *on confirm, demote the block from prose to a frozen one-liner + wikilin
161
161
  | *Pitch* | betting handoff | everything → 5 ingredients | compaction already exists |
162
162
 
163
163
  **Benefit is back-loaded.** GATE 0–1 have almost nothing to compact; the wins are
164
- at GATE 3–4 and especially the **handoff to ba-pitch-analyzer**. If staging the
164
+ at GATE 3–4 and especially the **handoff to the plan activity**. If staging the
165
165
  work, build the digest for the B-phases + pitch first.
166
166
 
167
167
  ---
@@ -183,8 +183,8 @@ Everything keys off the feature `<slug>`. Two roots, split by **who needs it**:
183
183
  fully gitignorable, dies with the run. It is derived from the same `<slug>`.
184
184
  - `.gitignore`: one line — `.shapeup/`. The whole local root is ignored; no
185
185
  carve-out is needed because everything machine-written at run time lives there,
186
- including the harvested signal shards `.shapeup/metrics/*.jsonl` (written by
187
- the tech-lead at SHIP, fact-only; see the tech-lead skill's SHIP step). The
186
+ including the harvested signal shards `.shapeup/metrics/*.jsonl` (an earlier release wrote
187
+ a fact-only row there at SHIP; nothing does now). The
188
188
  committed report surface is the frozen `shapeup/[slug]/REPORT.md`.
189
189
  - All paths are **project-relative, resolved from the project root / cwd.** Never
190
190
  `/mnt/...` — that is the claude.ai authoring sandbox and dies in a user repo.
@@ -196,13 +196,13 @@ mandates *status without asking* — hill position, verdict, ship sign-off, and
196
196
  surprise count are signals, not noise. Split inside the workspace:
197
197
  - **live scratch** (raw ledger, gate transition log, digest) → ephemeral, hidden;
198
198
  - **report surface** (hill / surprise / verdict / sign-off) → harvested at ship
199
- (the tech-lead's metrics row), surfaced or archived to a `run-summary.md`.
199
+ (the ship report and the run export), surfaced or archived to a `run-summary.md`.
200
200
 
201
201
  ---
202
202
 
203
203
  ## Handoff boundary — the digest never crosses a skill
204
204
 
205
- **`ba-pitch-analyzer` does NOT read the digest. It reads `pitch.md` / `shaping.md`.**
205
+ **The plan activity does NOT read the digest. It reads `pitch.md` / `shaping.md`.**
206
206
 
207
207
  The digest lives in `.shapeup/` — ephemeral, gitignored, run-scoped;
208
208
  it dies when the shaping run ends. `pitch.md`/`shaping.md` are durable source,
@@ -178,7 +178,7 @@ A2: ...
178
178
  - [ ] [unknown 1] → spike-[slug].md
179
179
  ```
180
180
 
181
- **Note:** This file is a kicked-off pitch. `/ba-pitch-analyzer` and `/tech-lead` consume it as-is — the appetite, rabbit holes, and no-goes inform scope decisions downstream.
181
+ **Note:** This file is a kicked-off pitch. `/ship` (its plan step) consumes it as-is — the appetite, rabbit holes, and no-goes inform scope decisions downstream.
182
182
 
183
183
  ---
184
184