shapeup-sdlc 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.claude/settings.local.example.json +20 -0
  2. package/.claude-plugin/marketplace.json +16 -0
  3. package/.claude-plugin/plugin.json +18 -0
  4. package/.env.shapeup.example +14 -0
  5. package/AGENTS.md +133 -0
  6. package/LICENSE +21 -0
  7. package/README.md +362 -0
  8. package/SECURITY.md +72 -0
  9. package/bin/init.mjs +329 -0
  10. package/commands/build.md +14 -0
  11. package/commands/eval.md +15 -0
  12. package/commands/hammer.md +12 -0
  13. package/commands/orient.md +11 -0
  14. package/commands/qa.md +12 -0
  15. package/commands/retro.md +13 -0
  16. package/commands/scopes.md +14 -0
  17. package/commands/shape.md +12 -0
  18. package/commands/ship.md +53 -0
  19. package/commands/wire.md +11 -0
  20. package/hooks/anti-rationalization.mjs +244 -0
  21. package/hooks/compact-snapshot.mjs +47 -0
  22. package/hooks/gate-deadline.mjs +151 -0
  23. package/hooks/gate-intake.mjs +110 -0
  24. package/hooks/gate-l2.mjs +161 -0
  25. package/hooks/gate-zerowork.mjs +264 -0
  26. package/hooks/hooks.json +118 -0
  27. package/hooks/lib/decision.mjs +183 -0
  28. package/hooks/safety-spine.mjs +296 -0
  29. package/hooks/sandbox-guard.mjs +172 -0
  30. package/hooks/session-rehydrate.mjs +109 -0
  31. package/hooks/slop-cleaner.mjs +176 -0
  32. package/oracles/_shared.mjs +46 -0
  33. package/oracles/http-oracle.mjs +155 -0
  34. package/oracles/index.mjs +36 -0
  35. package/oracles/process-oracle.mjs +146 -0
  36. package/oracles/snapshot-oracle.mjs +119 -0
  37. package/oracles/test-oracle.mjs +138 -0
  38. package/package.json +49 -0
  39. package/skills/advisor-protocol/SKILL.md +171 -0
  40. package/skills/ba-pitch-analyzer/SKILL.md +175 -0
  41. package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +84 -0
  42. package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +65 -0
  43. package/skills/ba-pitch-analyzer/assets/templates/assess-report.tmpl.md +127 -0
  44. package/skills/ba-pitch-analyzer/assets/templates/contracts/be-service.contract.tmpl.md +62 -0
  45. package/skills/ba-pitch-analyzer/assets/templates/contracts/offline-storage.contract.tmpl.md +92 -0
  46. package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +66 -0
  47. package/skills/ba-pitch-analyzer/assets/templates/cross-context/context-map.tmpl.md +64 -0
  48. package/skills/ba-pitch-analyzer/assets/templates/cross-context/event-choreography.tmpl.md +77 -0
  49. package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +104 -0
  50. package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +79 -0
  51. package/skills/ba-pitch-analyzer/assets/templates/domain-model.tmpl.md +79 -0
  52. package/skills/ba-pitch-analyzer/assets/templates/feedback.tmpl.md +87 -0
  53. package/skills/ba-pitch-analyzer/assets/templates/integration.tmpl.md +64 -0
  54. package/skills/ba-pitch-analyzer/assets/templates/run-state.tmpl.md +77 -0
  55. package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +105 -0
  56. package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +215 -0
  57. package/skills/ba-pitch-analyzer/assets/templates/task-board.tmpl.md +35 -0
  58. package/skills/ba-pitch-analyzer/assets/templates/task-spike.tmpl.md +86 -0
  59. package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +84 -0
  60. package/skills/ba-pitch-analyzer/assets/templates/usecase.tmpl.md +105 -0
  61. package/skills/ba-pitch-analyzer/assets/templates/ux-behavior.tmpl.md +65 -0
  62. package/skills/ba-pitch-analyzer/references/contract-patterns.md +152 -0
  63. package/skills/ba-pitch-analyzer/references/ddd-patterns.md +173 -0
  64. package/skills/ba-pitch-analyzer/references/doc-schemas.md +275 -0
  65. package/skills/ba-pitch-analyzer/references/integration-analysis.md +152 -0
  66. package/skills/ba-pitch-analyzer/references/task-generation.md +623 -0
  67. package/skills/ba-pitch-analyzer/references/test-surface.md +102 -0
  68. package/skills/ba-pitch-analyzer/references/ux-behavior-patterns.md +269 -0
  69. package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +241 -0
  70. package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +239 -0
  71. package/skills/coach/SKILL.md +202 -0
  72. package/skills/orient/SKILL.md +262 -0
  73. package/skills/qa-edge-hunter/SKILL.md +369 -0
  74. package/skills/scope-architect/SKILL.md +111 -0
  75. package/skills/scope-hammer/SKILL.md +186 -0
  76. package/skills/shapeup/SKILL.md +403 -0
  77. package/skills/shapeup/resources/breadboard-reflection.md +88 -0
  78. package/skills/shapeup/resources/breadboarding.md +334 -0
  79. package/skills/shapeup/resources/context-compaction.md +240 -0
  80. package/skills/shapeup/resources/framing-doc.md +92 -0
  81. package/skills/shapeup/resources/kickoff-doc.md +95 -0
  82. package/skills/shapeup/resources/shaping.md +194 -0
  83. package/skills/shapeup/resources/spike.md +86 -0
  84. package/skills/solution-architect/SKILL.md +129 -0
  85. package/skills/spec-evaluator/README.md +93 -0
  86. package/skills/spec-evaluator/SKILL.md +213 -0
  87. package/skills/spec-evaluator/references/anti-leniency.md +50 -0
  88. package/skills/spec-evaluator/references/dimension-contract.md +126 -0
  89. package/skills/spec-evaluator/references/dimensions/_registry.md +40 -0
  90. package/skills/spec-evaluator/references/dimensions/completeness.md +102 -0
  91. package/skills/spec-evaluator/references/dimensions/integration.md +129 -0
  92. package/skills/spec-evaluator/references/dimensions/performance.md +48 -0
  93. package/skills/spec-evaluator/references/dimensions/security.md +60 -0
  94. package/skills/spec-evaluator/references/dimensions/spec-conformance.md +134 -0
  95. package/skills/spec-evaluator/references/dimensions/tdd-surface.md +110 -0
  96. package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +100 -0
  97. package/skills/spec-evaluator/references/probing.md +177 -0
  98. package/skills/spec-evaluator/references/report-schema.md +101 -0
  99. package/skills/spec-evaluator/references/verdict-ledger.md +92 -0
  100. package/skills/spec-evaluator/scripts/verdict-ledger.mjs +166 -0
  101. package/skills/task-executor/SKILL.md +194 -0
  102. package/skills/tech-lead/README.md +71 -0
  103. package/skills/tech-lead/SKILL.md +459 -0
  104. package/skills/tech-lead/references/delegation.md +254 -0
  105. package/skills/tech-lead/references/gates.md +379 -0
  106. package/skills/tech-lead/references/invocation.md +45 -0
  107. package/skills/tech-lead/references/ledger-schema.md +214 -0
  108. package/skills/tech-lead/references/round-protocol.md +184 -0
  109. package/skills/tech-lead/references/state-model.md +66 -0
  110. package/skills/tech-lead/references/tiny-lane.md +52 -0
  111. package/skills/tech-lead/schemas/domain.schema.json +2294 -0
  112. package/skills/tech-lead/schemas/gate-answers.schema.json +92 -0
  113. package/skills/tech-lead/schemas/work-order.schema.json +21 -0
  114. package/skills/tech-lead/schemas/work-result.schema.json +40 -0
  115. package/skills/tech-lead/scripts/aegis-digest.mjs +124 -0
  116. package/skills/tech-lead/scripts/budget-check.mjs +156 -0
  117. package/skills/tech-lead/scripts/compile-order.mjs +518 -0
  118. package/skills/tech-lead/scripts/fit-check.mjs +196 -0
  119. package/skills/tech-lead/scripts/gate-answers.mjs +338 -0
  120. package/skills/tech-lead/scripts/ingest-result.mjs +270 -0
  121. package/skills/tech-lead/scripts/init-run.mjs +326 -0
  122. package/skills/tech-lead/scripts/lib/argv.mjs +224 -0
  123. package/skills/tech-lead/scripts/lib/contract-md.mjs +481 -0
  124. package/skills/tech-lead/scripts/lib/is-main.mjs +82 -0
  125. package/skills/tech-lead/scripts/lib/paths.mjs +278 -0
  126. package/skills/tech-lead/scripts/lib/ratchet-tree.mjs +112 -0
  127. package/skills/tech-lead/scripts/run-snapshot.mjs +269 -0
  128. package/skills/tech-lead/scripts/ship-report.mjs +275 -0
  129. package/skills/tech-lead/scripts/stats.mjs +423 -0
  130. package/skills/tech-lead/scripts/t0-verify.mjs +470 -0
  131. package/skills/tech-lead/scripts/trace-lint.mjs +367 -0
  132. package/skills/tech-lead/scripts/validate-envelope.mjs +283 -0
  133. package/skills/translator/README.md +66 -0
  134. package/skills/translator/SKILL.md +258 -0
  135. package/skills/translator/references/preservation-rules.md +102 -0
@@ -0,0 +1,254 @@
1
+ # Delegation
2
+
3
+ The tech lead invokes the build-phase skills and reads their handoff files. It never
4
+ reimplements their logic. Each sub-skill keeps its own gates; pass `--auto` to a sub-skill
5
+ only when the run's auto level is `--auto` or `--unattended`.
6
+
7
+ ## Invocation mechanism โ€” Agent, not Skill
8
+
9
+ Every "Invoke:" line below means: call the **Agent** tool โ€” a real subagent, on its own
10
+ context and (where a role is named) its own model โ€” whose prompt tells it to run
11
+ `Skill(shapeup-sdlc-plugin:<name>)` with the given args and report back the artifacts. It does
12
+ **not** mean the tech lead calls the `Skill` tool itself. A direct `Skill` call executes
13
+ inline, in the tech lead's own turn, on the tech lead's own model โ€” that silently drops GATE
14
+ L0.8's model matrix (there is no per-role model left to route once the call is inline) and
15
+ breaks the isolation the zero-memory-handoff design (`round-protocol.md`, the compiled
16
+ WorkOrder in `orders/r<N>-a<M>.json`) already assumes every worker below has.
17
+
18
+ Standard shape (pure-skill architecture v1.0 โ€” the envelope port):
19
+ ```
20
+ 1. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" <mode flags> # โ†’ orders/<id>.json
21
+ 2. Agent({
22
+ description: "<short task description>",
23
+ subagent_type: "general-purpose",
24
+ model: "<role model resolved at GATE L0.8>",
25
+ prompt: "Call Skill(shapeup-sdlc-plugin:<skill>) --order <orders/<id>.json>.
26
+ Report back: the WorkResult path (.shapeup/<slug>/results/<id>.json)."
27
+ })
28
+ 3. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ingest-result.mjs" .shapeup/<slug>/results/<id>.json
29
+ ```
30
+ The WorkOrder carries everything the worker may rely on (payload, decisions, digested errors,
31
+ substrate write-contract); the WorkResult carries everything the worker used to write into
32
+ shared files. `validate-envelope.mjs` runs as a PreToolUse hook on Skill|Agent and DENIES a
33
+ dispatch whose `--order` file is missing or schema-invalid. Workers write only their own
34
+ domain artifacts inside their substrate โ€” never boards, ledgers, or run-state (D6, closed).
35
+
36
+ Role โ†’ model, resolved once at GATE L0.8 from the `orch`/`exec`/`eval`/`qa` matrix
37
+ (`t0-verify.mjs` is mechanical tooling run directly via Bash, never an Agent โ€” DD-7, zero LLM
38
+ tokens):
39
+
40
+ | Skill | L0.8 role | Why this tier |
41
+ |-------|-----------|---------------|
42
+ | translator | exec | one-shot text transform โ€” builder tier |
43
+ | orient (Scout) | exec | reads/spikes code โ€” builder tier, not judgment |
44
+ | ba-pitch-analyzer | exec | planner โ€” builder tier, not judgment |
45
+ | scope-architect | exec | scope-contract author (sole writer of scopes/*.md) โ€” builder tier |
46
+ | task-executor | exec | the builder itself |
47
+ | advisor-protocol | exec | adjudicates ESCALATE by precedent/default, budget-capped โ€” not the single judge |
48
+ | spec-evaluator | eval | the single judge (judge โ‰  doer) โ€” keep its own matrix key even if a PO points it at the same model as `exec`, so it can be split later without a harness change |
49
+ | qa-edge-hunter | qa | cheapest tier by design โ€” exploratory breadth over depth |
50
+ | scope-hammer | exec | census + baseline comparison, proposes only โ€” not a verdict |
51
+ | coach | exec | categorization gate, not a verdict |
52
+
53
+ The tech lead itself is `orch` โ€” this conversation, never delegated to.
54
+
55
+ The order is **Orient (7) โ†’ Map Scopes (8) โ†’ Build (9) โ†’ Eval**, faithful to Shape Up: the
56
+ team orients before any board exists, so the planner's board is reality-born. The tech lead
57
+ is the **sole writer of run-state** (`harness-run.md`) โ€” it passes each worker the run
58
+ metadata it needs (`feature`, `spec`, `stack`, `discovered_rounds`, `--auto`) as **args**;
59
+ workers keep only their own product-idempotency key and emit domain artifacts.
60
+
61
+ ## 0. LANGUAGE GATE โ†’ translator (GATE L0, only if non-English)
62
+ ```
63
+ Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:translator) --check "<intake path>"
64
+ # detect-only, writes nothing
65
+ English โ†’ skip; ORIENT against the original.
66
+ non-English โ†’ Agent (model: exec): Skill(shapeup-sdlc-plugin:translator) "<intake path>" [--auto]
67
+ # full pass
68
+ Writes: <name>.en.md (English copy; original untouched) + glossary.md
69
+ + translation-report.md.
70
+ ORIENT against the <name>.en.md copy.
71
+ Read back: the detect table (--check) / the .en.md path + residual scan result (full pass).
72
+ Authority: translator normalizes language only โ€” it does not orient/plan/build/judge. The tech
73
+ lead never translates itself; it only detects and sequences this step before ORIENT.
74
+ ```
75
+
76
+ ## 1. ORIENT โ†’ orient (the Scout, step 7) โ€” runs BEFORE planning
77
+ ```
78
+ Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:orient)
79
+ --pitch "<kicked-off pitch path>" --spec <path> --stack "<hint>" [--auto]
80
+ Owns: its own GATE O-A/O-B (or runs straight through under --auto)
81
+ Writes: .shapeup/<slug>/orient/ โ†’ code-surface.md, spike-<area>.md, discovered-seed.md, hill-signal.md (LOCAL run-trace)
82
+ Read back: hill-signal.md (render the area-level Hill at GATE L1a) + the spiked area/result.
83
+ Why first: at Orient time NO board exists; the Scout's map + discovered seed make the planner's
84
+ board reality-born instead of imagined. The four artifacts are the orientโ†’ba contract.
85
+ Authority: pure worker โ€” no code, no board, no run-state, no reporting.
86
+ ```
87
+
88
+ ## 2. MAP SCOPES โ†’ ba-pitch-analyzer + scope-architect (step 8, orient-informed)
89
+ ```
90
+ Order A (the spec tree + board):
91
+ compile-order --operation analyze --slug <slug> --worker ba-pitch-analyzer
92
+ --payload '{"pitch": "<path>", "lens": "<lens>", "orient_dir": ".shapeup/<slug>/orient/"}'
93
+ Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>
94
+ The order hands it code-surface.md (Phase-1 ingest, no re-scan), discovered-seed.md (task
95
+ gen from reality), spike-<area>.md (feasibility/contracts).
96
+ Writes (its substrate): spec_folder โ†’ _index.md, domain-model.md, ux-behavior.md, usecases/*,
97
+ contracts/*.contract.md, scope-summary.md (+ api-feasibility.md if third-party) and the
98
+ LOCAL board .shapeup/<slug>/tasks/ (v3.2; regenerable via a generate-board order).
99
+ Returns: WorkResult (artifacts list + discoveries) โ†’ ingest-result.
100
+ Order B (the scope contracts):
101
+ compile-order --operation map-scopes --slug <slug> --worker scope-architect
102
+ Agent (model: exec): Skill(shapeup-sdlc-plugin:scope-architect) --order <path>
103
+ Writes (its substrate): shapeup/<slug>/scopes/*.md + scope-board.md โ€” sole
104
+ writer. Lint mechanically: node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/spec-lint.mjs" <slug> (PA1/PA2 +
105
+ substrate disjointness) before GATE L1b.
106
+ Read back: .shapeup/<slug>/tasks/_index.md (the board) + scope-summary.md (Done-when)
107
+ + the spec-lint verdict.
108
+ Pass-through rule: do not coach the planner to over-specify implementation โ€” keep tech high-level.
109
+ ```
110
+
111
+ ## 2b. RECONCILE โ†’ ba-pitch-analyzer (discovered task reconciliation, operation: reconcile)
112
+ ```
113
+ compile-order --operation reconcile --slug <slug> --worker ba-pitch-analyzer
114
+ --payload '{"discovered_ledger": ".shapeup/<slug>/discovery/ledger.md"}'
115
+ Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>
116
+ Effect: reconciles raw ledger discoveries into board tasks + appended UC invariants/TS rows,
117
+ inside the reconcile write-contract (frozen zone enforced by the sandbox hook, not
118
+ prose). Appetite Guard runs mechanically: node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/board-derive.mjs".
119
+ Returns: WorkResult โ†’ ingest-result (which updates the board and bumps discovered_rounds in
120
+ harness-run.md โ€” the worker holds no counter).
121
+ Read back: updated tasks/_index.md + scope-summary.md before routing back to GATE L1b.
122
+ ```
123
+
124
+ ## 2c. BOOTSTRAP LOCAL BOARD โ†’ ba-pitch-analyzer (operation: generate-board, v3.2)
125
+ ```
126
+ Only when GATE L1b's bootstrap check fires (LOCAL .shapeup/<slug>/tasks/_index.md missing
127
+ AND SHARED shapeup/<slug>/spec/usecases/ present):
128
+ compile-order --operation generate-board --slug <slug> --worker ba-pitch-analyzer
129
+ Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>
130
+ Effect: regenerates the LOCAL task board fresh from the committed usecases/domain-model/scopes
131
+ โ€” no ledger, no reconciliation. Status bootstraps from committed T0/hill facts at
132
+ SCOPE granularity; unlocks recomputed by node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/board-derive.mjs" --write.
133
+ Read back: the freshly regenerated tasks/_index.md before entering BUILD.
134
+ ```
135
+
136
+ ## 3. BUILD โ†’ task-executor (always through the envelope port)
137
+ ```
138
+ r=1 loop:
139
+ compile-order --next --slug <slug> [--test-cmd "<cmd>"] # exit 2 = no ready task
140
+ Agent (model: exec), one fresh subagent per order:
141
+ Skill(shapeup-sdlc-plugin:task-executor) --order <path>
142
+ ingest-result <results/<id>.json> # ticks ACs, marks done, updates board, propagates unblocks
143
+ Repeat until compile-order --next reports no ready task (board all โœ…).
144
+
145
+ r>1 (fix) per bug:
146
+ compile-order --task <id> --slug <slug> --operation fix --payload '{"bugs": [<entries>]}'
147
+ โ†’ dispatch + ingest as above. Scope the change to the bug only.
148
+
149
+ Scope contracts present (isolated attempt loop, per scope, per attempt):
150
+ compile-order --scope shapeup/<slug>/scopes/<id>.md --round <N> --attempt <M>
151
+ โ†’ orders/r<N>-a<M>.json inlines the scope contract, this scope's tasks, promoted ledger
152
+ decisions, and the previous attempt's AEGIS triples โ€” the zero-memory handoff, compiled
153
+ from facts only. Dispatch a fresh Agent per attempt (this IS the isolation boundary):
154
+ Skill(shapeup-sdlc-plugin:task-executor) --order <path>
155
+ ingest-result โ€” any escalates[] in the WorkResult are queued โ†’ dispatch 3b below.
156
+
157
+ Read back: ingest-result's summary line (tasks updated, unblocked, escalates) โ€” not raw board
158
+ files. SPIKE tasks close before the tasks they block can build (compile-order enforces the
159
+ dependency order).
160
+ ```
161
+
162
+ ## 3b. ESCALATE adjudication โ†’ advisor-protocol (scope contracts present, mid-attempt)
163
+ ```
164
+ Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:advisor-protocol)
165
+ --ledger shapeup/<slug>/round-ledger.md --escalate <block> [--unattended]
166
+ Effect: adjudicates via precedent / substrate-expansion (โ†’ a scope-architect remap order) / PO ask / conservative
167
+ default; appends one row to round-ledger.md "Decisions" the instant it resolves.
168
+ Read back: the answer, to fold into the SAME attempt if still in progress, or the next
169
+ attempt's isolated brief otherwise.
170
+ Authority: advises; never designs, builds, or judges. Budget โ‰ค3/scope/round โ€” the 4th+
171
+ ESCALATE this scope/round auto-resolves conservatively and flags a GATE H proposal.
172
+ ```
173
+
174
+ ## 3c. T0 verify โ†’ scripts/t0-verify.mjs (skill-local; scope contracts present, every attempt)
175
+ ```
176
+ Invoke via Bash directly โ€” NOT an Agent, this is deterministic tooling, not a worker (DD-7):
177
+ node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/t0-verify.mjs" shapeup/<slug>/scopes/<scope-id>.md
178
+ --round <N> --attempt <M> --seesaw-registry .shapeup/<slug>/seesaw/registry.json
179
+ Effect: runs the scope's e2e fixtures + DB probe, then (on green) the seesaw regression check
180
+ over every FINISHED scope's fixtures. Writes the verdict artifact spec-evaluator's
181
+ GATE V0.7 will require a citation to. Zero LLM tokens โ€” deterministic tooling, not a
182
+ judge (this is what keeps "T1 once per round" true even though verification runs
183
+ every attempt, DD-7).
184
+ Read back: overall (green|red) + regression (bool) โ€” drives the attempt-loop branch in
185
+ round-protocol.md "Isolated attempt loop". On red, its `discovered_tasks` field is
186
+ the AEGIS digest to fold into the next brief โ€” no separate digester dispatch needed
187
+ (t0-verify.mjs calls its sibling aegis-digest.mjs internally on failure).
188
+ ```
189
+
190
+ ## 4. EVAL โ†’ spec-evaluator (once per round)
191
+ ```
192
+ compile-order --operation evaluate --slug <slug> --worker spec-evaluator --round <r>
193
+ --payload '{"dimensions": ["spec-conformance"], "run_cmd": "<cmd>", "t0_artifacts": [...]}'
194
+ Invoke via Agent (model: eval), ONCE, after GATE L2:
195
+ Skill(shapeup-sdlc-plugin:spec-evaluator) --order <path>
196
+ Effect: one feature-level pass over the running app against all AC + Done-when; writes
197
+ evaluation/EVAL-FEATURE-<slug>.md (verdict + bug list) + its WorkResult (criteria
198
+ verdicts, refuted boxes, T0 citations). It touches NO task file and NO board.
199
+ ingest-result <results/evaluate-r<r>.json>: appends the .verdicts JSONL ledger, un-ticks the
200
+ refuted AC boxes, sets eval_verdict frontmatter โ€” the judge returns data, ingest writes.
201
+ Read back: EVAL-FEATURE-<slug>.md โ†’ verdict (pass|fail) + the bug list (each bug has
202
+ task ref, severity, file:line, expected vs actual).
203
+ ```
204
+
205
+ > Dependency note: this uses spec-evaluator's **feature-level** pass (`--feature <slug>`),
206
+ > which evaluates the whole board in one session rather than one task at a time. If your
207
+ > installed spec-evaluator is the per-task v0.1, add the `--feature` mode (a small v0.2
208
+ > patch: iterate the board's AC/Done-when in one probe+grade session, emit one
209
+ > EVAL-FEATURE report) before wiring the tech lead to it. The per-task invocation still
210
+ > works for ad-hoc checks, but the round loop expects one feature pass.
211
+
212
+ ## 5. SHIP / GATE H โ†’ scope-hammer
213
+ ```
214
+ Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:scope-hammer)
215
+ --slug <slug> [--baseline <path>] [--breaker outer|inner --scope <id>]
216
+ Effect: GATE H0 census (scopes + QA findings + discovered ledger + advisor-overflow flags) โ†’
217
+ H1 baseline comparison (never vs. a perfect ideal) โ†’ H2 cut list + verdict.
218
+ Read back: the proposed cut list + verdict (SHIP now | SHIP after fixing ship-blocking items |
219
+ CANNOT SHIP). The tech lead records the PO's decision in round-ledger.md and performs
220
+ the actual close (SHIP S.1 onward) โ€” scope-hammer proposes, it never ships.
221
+ ```
222
+
223
+ ## Authority boundaries (do not cross)
224
+ - The Scout orients; it never plans, builds, or judges โ€” it hands raw material to the planner.
225
+ - The planner decides scope; the tech lead confirms it with the PO at GATE L1b.
226
+ - The generator reports task outcomes in its WorkResult; `ingest-result.mjs` flips `status:
227
+ done` from that report. The tech lead confirms the feature-level close at GATE L4.
228
+ - The evaluator issues verdicts only; it never closes tasks. Judge โ‰  doer.
229
+ - The tech lead decides *when* and *whether* each skill runs and how rounds proceed, owns
230
+ run-state + the Hill report โ€” it does not decide *what* a task contains or *whether* a
231
+ single AC passes.
232
+
233
+ ## Handoff files (the shared state)
234
+ | File | Written by | Read by |
235
+ |------|-----------|---------|
236
+ | `<name>.en.md` + `glossary.md` | translator (L0, if non-English) | tech lead (ORIENT input), Scout, planner |
237
+ | `orient/code-surface.md` | Scout (step 7) | planner Phase 1 (ingest, no re-scan) |
238
+ | `orient/spike-<area>.md` | Scout (step 7) | planner Phase 1b/contracts; tech lead (L1a) |
239
+ | `orient/discovered-seed.md` | Scout (step 7) | planner Phase 6 (task gen) |
240
+ | `orient/hill-signal.md` | Scout (step 7) | tech lead (renders L1a Hill) |
241
+ | `orders/<id>.json` (WorkOrder) | **compile-order.mjs (mechanical)** | every worker (its ONLY pipeline input), validate-envelope hook |
242
+ | `results/<id>.json` (WorkResult) | the dispatched worker (its ONLY pipeline output) | ingest-result.mjs (the single writer of everything below it) |
243
+ | `.shapeup/<slug>/tasks/*` (LOCAL board, v3.2) | **ingest-result.mjs** (status, AC ticks, unblocks) + planner orders (task bodies) | tech lead (board status), compile-order (next task, ACs) |
244
+ | `discovery/ledger.md` | **ingest-result.mjs** (from workers' `discoveries[]`) | reconcile orders (ba), scope-hammer (H0 census) |
245
+ | `scope-summary.md` | planner (analyze/reconcile orders) | tech lead (Done-when), evaluator (Done-when criteria) |
246
+ | `evaluation/EVAL-FEATURE-<slug>.md` + `.verdicts-*.jsonl` | evaluator (report) / **ingest-result.mjs** (verdict ledger, un-ticks) | tech lead (verdict), next fix order (bug list) |
247
+ | `harness-run.md` | **tech lead (sole writer)** | tech lead (round ledger + Hill + run-state), PO (audit) |
248
+ | `scopes/<scope-id>.md` | `scope-architect` (sole writer, incl. remap/split orders) | tech lead (substrate/sequence), sandbox hook (write-whitelist), compile-order (inlined into orders) |
249
+ | `t0/verdicts/r<N>-a<M>.json` | `scripts/t0-verify.mjs` (skill-local, mechanical โ€” not a worker) | spec-evaluator (required citation), tech lead (hill derivation), compile-order (digested errors) |
250
+ | `round-ledger.md` | **tech lead (sole writer)** | compile-order (decisions into every order), advisor-protocol (appends), PO (audit) |
251
+ | `hill/<scope-id>.yml` + `hill-chart.md` | **tech lead (sole writer)** | PO ("status without asking"), scope-hammer (H0 census) |
252
+
253
+ > D6 is closed (v1.0): no worker writes `run-state.md`, the board, or the ledger. A worker
254
+ > performing a shared-state write is a defect โ€” route it back through its WorkResult.
@@ -0,0 +1,379 @@
1
+ # Tech-Lead Gate Playbooks
2
+
3
+ The full collect-lists, gate-output blocks, and delegation scripts for every gate and delegation
4
+ step, extracted from `SKILL.md` (progressive disclosure). **Read the relevant section when you
5
+ reach that gate** โ€” `SKILL.md` carries the workflow spine, the build/eval loop, and the hard
6
+ rules; this file carries the step-by-step playbooks. The L2/L4 gates stay hook-enforced regardless
7
+ of where the prose lives.
8
+
9
+ Order matches the run: GATE L0 โ†’ ORIENT โ†’ GATE L1a โ†’ WIRE/L1a.5 โ†’ MAP SCOPES โ†’ GATE L1b โ†’
10
+ (BUILD โ†’ GATE L2 โ†’ EVAL, in SKILL.md) โ†’ GATE L3 โ†’ SHIP โ†’ GATE L4.
11
+
12
+ ---
13
+
14
+ ## GATE L0 โ€” Intake & Run Config
15
+
16
+ **Purpose:** Pin everything the run needs once, up front, so the loop never has to guess.
17
+
18
+ ```
19
+ Collect (explicit โ€” never inferred):
20
+ L0.1 Kicked-off pitch source: path to a shaping.md / pitch.md (already shaped + bet by PO).
21
+ Not a raw idea โ€” shaping (1-4) / betting (5) / kick-off (6) are PO-personal, upstream.
22
+ L0.1a Language gate: Agent (model: exec) โ†’ Skill(shapeup-sdlc-plugin:translator) --check <intake>.
23
+ English โ†’ use intake as-is.
24
+ non-English โ†’ Agent (model: exec) โ†’ Skill(shapeup-sdlc-plugin:translator) <intake>
25
+ (--auto under auto/unattended), then use the produced <name>.en.md as
26
+ the ORIENT/MAP-SCOPES input. Log in ledger.
27
+ L0.1b Appetite: read the `appetite` field from the pitch's YAML frontmatter (set by /shapeup).
28
+ Surface it in the gate output. Use it to:
29
+ - Contextualise the scope at L1b (right-size cuts to the budget).
30
+ - Anchor max_rounds suggestion: 1-week โ†’ 2 rounds, 2-week โ†’ 3, 6-week โ†’ 4.
31
+ If appetite is missing or "TBD (uncapped)": flag as a risk and note it in the ledger;
32
+ proceed, but the PO should set scope expectations manually at GATE L1b.
33
+ L0.2 Workspace roots (both keyed off <slug>, set here and threaded to every worker as args):
34
+ - SHARED shapeup/<slug>/ โ€” durable source + deliverable (committed):
35
+ shaping/ (from /shapeup), spec/ (where ba-pitch-analyzer writes the spec tree:
36
+ _index, domain-model, usecases/, contracts/, scopes/, scope-summary.md โ€” NOT tasks/)
37
+ - LOCAL .shapeup/<slug>/ โ€” run-trace (hidden, gitignorable):
38
+ harness-run.md (this ledger), digest, orient/, evaluation/, qa/,
39
+ discovery/ledger.md, orders/ + results/ (the envelope port), tasks/ (the task
40
+ board, v3.2 โ€” regenerable via a generate-board order on any machine)
41
+ spec_folder = shapeup/<slug>/spec/ (the deliverable arg passed to ba/eval/exec)
42
+ L0.3 lens: lite | standard | cross-context (passed to planner at step 8)
43
+ L0.4 stack hint (e.g. "pnpm, Next 16 web :3000") โ€” aims orient's code-surface sweeps + run commands
44
+ L0.5 eval dimensions: default [spec-conformance]; only add if user asks
45
+ L0.6 max_rounds: default 3, appetite-informed (see L0.1b)
46
+ L0.7 auto level:
47
+ interactive (default) โ€” pause at every L-gate; sub-skills keep their own gates
48
+ --auto โ€” sub-skills run unattended (--auto); tech lead still pauses
49
+ at L1a/L1b (orient+plan), L3 (verdict), L4 (ship)
50
+ --unattended โ€” auto-confirm all L-gates too; stop only on PASS,
51
+ max_rounds, or hard error (for headless / Agent SDK / CI)
52
+ L0.8 Model & budget resolution (addendum Blueprint F, four layers, highest precedence
53
+ first) โ€” resolve ONCE here, record the resulting matrix in the ledger header:
54
+ /ship flags โ†’ .claude/settings.local.json (per-member, Tier C) โ†’
55
+ .claude/settings.json (team defaults, committed) โ†’ skill-shipped defaults
56
+ Env knobs read at this layer: SHAPEUP_ORCH_MODEL, SHAPEUP_EXEC_MODEL,
57
+ SHAPEUP_EVAL_MODEL, SHAPEUP_QA_MODEL, SHAPEUP_ATTEMPT_BUDGET (default 5),
58
+ SHAPEUP_DIGESTER_MODEL (default "script" โ€” aegis-digest.mjs's regex pass; falls
59
+ back to a Sonnet dispatch only when the digester reports unrecognized log formats).
60
+ A requested model unavailable on the member's plan โ†’ degrade to the next tier down,
61
+ record the degrade in the ledger (R2 โ€” invariants are code paths, so adherence
62
+ survives even when the model tier doesn't).
63
+ L0.9 attempt_budget: the INNER circuit breaker (design spec DD-9), nested inside
64
+ max_rounds (the OUTER breaker, unchanged, L0.6). Default 5 โ€” the number of T0 verify
65
+ attempts a single scope gets inside one round before its attempt loop trips and
66
+ queues a hammer PROPOSAL for GATE H rather than blocking the round. Only meaningful
67
+ when the spec folder has scope contracts; a spec with none skips the attempt loop
68
+ entirely and BUILD behaves exactly as in v0.2.6 (task-executor --next, no T0/seesaw).
69
+ no_progress_k (v1.5): the STAGNATION term of the same inner breaker. Default 2 โ€” the
70
+ number of consecutive non-`kept` trials after which a scope ends early and queues the
71
+ same GATE H proposal. attempt_budget counts ATTEMPTS and cannot see that the last two
72
+ produced nothing; this term can, and on a flailing scope it saves three of five
73
+ attempts. Set per scope (`no_progress_k` on the contract) or per run in the payload.
74
+ ```
75
+
76
+ **L0.0 โ€” intake precondition (before any other L0 collection):**
77
+ ```
78
+ resolve intake from, in order:
79
+ 1. --pitch <path> (a shaping/pitch file on disk)
80
+ 2. --spec <folder> (an existing spec tree)
81
+ 3. <intake> requirement text passed to the skill
82
+ none resolvable -> ABORT. Print the โœ‹ NO INTAKE block from SKILL.md and stop.
83
+ Do NOT emit the GATE L0 block. Do NOT list downstream gates.
84
+ Do NOT describe the pipeline that "will" run.
85
+ ```
86
+ An orchestrator with no spec has nothing to orchestrate. Narrating the gate list in that state
87
+ produces output that reads exactly like a successful run and contains no work โ€” measured at 29%
88
+ acceptance, n=3, on the benchmark. Fail loudly instead.
89
+
90
+ **GATE L0 Output:**
91
+ ```
92
+ โธ GATE L0 โ€” Intake & Run Config
93
+ Feature : [slug] (kicked-off pitch: [path])
94
+ Intake lang : [English | translated via /translator โ†’ <name>.en.md]
95
+ Appetite : [~1 week | ~2 weeks | ~6 weeks | โš ๏ธ missing โ€” scope uncapped]
96
+ Spec folder : [path] (lens: [lite|standard])
97
+ Eval dims : [spec-conformance] max_rounds: [N, appetite-informed] auto: [interactive|auto|unattended]
98
+ Run commands : [web: ... | api: ... | mobile: ...]
99
+ Model matrix : orch=[model] exec=[model] eval=[model] qa=[model] digester=[script|sonnet] (source: [flags|settings.local|settings.json|default])
100
+ Budgets : round_budget=[N] (outer) attempt_budget=[N] (inner, per scope)
101
+ ```
102
+ Do NOT start ORIENT until confirmed (interactive/auto). Under --unattended, proceed.
103
+
104
+ ---
105
+
106
+ ## ORIENT (step 7) โ€” delegate to orient (the Scout)
107
+
108
+ The Shape Up Building phase opens with **Orient, not planning**: the team reads the real code
109
+ and spikes the scary parts *before* any board exists, so the board comes out reality-born.
110
+
111
+ ```
112
+ Invoke via Agent (model: exec โ€” see references/delegation.md "Invocation mechanism"):
113
+ Skill(shapeup-sdlc-plugin:orient) --pitch <intake> --spec <path> --stack "<hint>" [--auto]
114
+ Owns: its own GATE O-A/O-B; runs straight through under --auto.
115
+ Writes: .shapeup/<slug>/orient/ โ†’ code-surface.md, spike-<area>.md, discovered-seed.md, hill-signal.md.
116
+ Record in ledger: orient duration + the spiked area + spike result (resolved | SPIKE-UNRESOLVED).
117
+ ```
118
+ The four artifacts are the **orient โ†’ ba contract**: `ba` (step 8) consumes them instead of
119
+ re-scanning the codebase. Pass `--auto` only when the run level is `--auto`/`--unattended`.
120
+
121
+ ---
122
+
123
+ ## GATE L1a โ€” Orient Review
124
+
125
+ **Purpose:** PO sees where the pitch lands in real code and what's still unknown โ€” *before*
126
+ committing to a scope map. This is the first Hill read (area-level โ€” slices don't exist yet).
127
+
128
+ ```
129
+ Read .shapeup/<slug>/orient/. Render the ๐Ÿ—ป Hill from hill-signal.md (see ledger-schema.md "Hill report"):
130
+ - each suspected area โ†’ uphill (open unknowns) | crest (approach proven by the spike) | downhill
131
+ Print: the code-surface headline (where it lands), the spiked area + result, the riskiest
132
+ open unknowns going into mapping.
133
+ Ask (max 2): is the riskiest area the right one to have spiked? any unknown that must be
134
+ resolved (another spike) before we map scopes?
135
+ ```
136
+ Do NOT enter MAP SCOPES until Orient is accepted.
137
+
138
+ ---
139
+
140
+ ## WIRE (step 7.5) + traceability spine โœš โ€” delegate to solution-architect
141
+
142
+ **Active only when the spine is in use** โ€” on a legacy spec skip it; `trace-lint` self-skips every arm whose artifact is absent (non-regression).
143
+
144
+ ```
145
+ 1. PROFILE (you write it at L0 โ€” compile-order stays pipeline-blind): SHARED project-profile.md
146
+ = {schema_version:1, archetype, entry_point}. archetype โˆˆ {client-only-game|web-service|
147
+ mobile|library|data-pipeline}; entry_point is the reachability seam (a game's main.js is NOT a
148
+ service's src/server.ts). Validate the enum โ€” a typo must fail, not silently disable the check.
149
+ 2. WIRE โ€” compile-order --operation wire --slug <slug> (workerโ†’solution-architect), payload
150
+ {project_profile}. Sole writer of committed wiring-map.md (per-UC engine โ†’ seam โ†’ entry-point
151
+ call site โ†’ affordance). โธ GATE L1a.5: confirm each UC has a declared seam before slicing.
152
+ 3. COVERAGE (folds into MAP SCOPES) โ€” compile-order --operation coverage โ†’ ba writes the SHARED
153
+ requirements.md registry (atomic REQ clauses, frozen ids).
154
+ 4. trace-lint โ€” node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/trace-lint.mjs" --slug <slug>. ADVISORY at L1b:
155
+ covers-closure (every covered REQ named by โ‰ฅ1 AC's covers:) + reachability (every UC engine
156
+ reaches entry_point). Promote to --gate only once covers: is populated.
157
+ ```
158
+
159
+ ---
160
+
161
+ ## MAP SCOPES (step 8) โ€” delegate to ba-pitch-analyzer (orient-informed)
162
+
163
+ ```
164
+ Two orders, two workers, one step (both model: exec โ€” see references/delegation.md):
165
+ 1. ANALYZE + BOARD โ€” compile-order --operation analyze --slug <slug> --worker ba-pitch-analyzer
166
+ --payload '{"pitch": "<path>", "lens": "<lens>", "orient_dir": ".shapeup/<slug>/orient/"}'
167
+ dispatch: Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>. The order hands it
168
+ code-surface.md (Phase-1 ingest consumes the map, does not re-scan), discovered-seed.md
169
+ (task gen starts from reality), spike-<area>.md (feasibility/contracts).
170
+ Output expected: spec_folder populated with _index, domain-model, usecases/, contracts/,
171
+ scope-summary.md (all SHARED/committed) + tasks/TASK-NNN*.md, tasks/_index.md (board)
172
+ written to the LOCAL root .shapeup/<slug>/tasks/ (v3.2) + a WorkResult โ†’ ingest.
173
+ 2. MAP SCOPES โ€” compile-order --operation map-scopes --slug <slug> --worker scope-architect
174
+ dispatch: Skill(shapeup-sdlc-plugin:scope-architect) --order <path>. Sole writer of the
175
+ committed scopes/<scope-id>.md contracts (import-graph slicing, substrate whitelists,
176
+ affordance manifest, fixtures, PA1/PA2 โ€” mechanically linted by spec-lint.mjs).
177
+ Record in ledger: planner duration + task count + scope count.
178
+ ```
179
+ Faithful note: keep the planner ambitious on scope but high-level on tech โ€” do not push it
180
+ to over-specify implementation. Errors baked into the spec cascade into every build round.
181
+ Honest deviation: `ba` is heavier than Shape Up's light "map scopes" bucketing โ€” that extra
182
+ upfront spec-traceability is a deliberate trade for an LLM builder (redesign doc D8), not
183
+ "pure Shape Up". State it; don't pretend otherwise.
184
+
185
+ ---
186
+
187
+ ## GATE L1b โ€” Board Review (Plan Acceptance)
188
+
189
+ **Purpose:** PO sees the shape of the work before a single line of code. This is where scope
190
+ is cut or confirmed โ€” cheap here, expensive later.
191
+
192
+ **v3.2 (local-tasks-architecture):** on a spec with
193
+ scope contracts, the PO reviews the SHARED, committed plan โ€” `usecases/_index.md` +
194
+ `scopes/*.md` + `scope-summary.md`'s Done-when headlines โ€” never the LOCAL task board
195
+ (`tasks/_index.md`, gitignored, per-machine run-trace). Implementation-level task detail stays
196
+ hidden at this gate by design; the PO signs off on the UCs covered and how they're cut into
197
+ scopes, not a line-by-line task list. A pre-v0.3.0 spec (no scope contracts) has no scope
198
+ board to substitute for โ€” this gate still reads `tasks/_index.md` directly, unchanged from
199
+ v0.2.6 (non-regression).
200
+
201
+ **Bootstrap check (local tasks board) โ€” run BEFORE the read below, always:**
202
+ ```
203
+ `.shapeup/<slug>/tasks/_index.md` missing AND `shapeup/<slug>/spec/usecases/`
204
+ exists โ†’ a teammate (or a `--from build` resumed run) has the SHARED spec via git but no LOCAL
205
+ task board on this machine โ€” `.shapeup/` is gitignored and never travels with a branch.
206
+ compile-order --operation generate-board --slug <slug> --worker ba-pitch-analyzer, then
207
+ Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path> + ingest โ€”
208
+ regenerates the board from the committed usecases/domain-model/scopes. Record the bootstrap in
209
+ the ledger. No-op on a fresh r=1 run (MAP SCOPES just wrote the board on this same machine) or
210
+ any machine that already has one โ€” this only fires for the second-developer / resumed-run case.
211
+ ```
212
+
213
+ ```
214
+ Scope contracts present:
215
+ Read usecases/_index.md + scopes/*.md (scope-board.md) + scope-summary.md. Print:
216
+ - UC count + actors (usecases/_index.md)
217
+ - scope board: scope_id, topology_type, substrate file count (scopes/*.md / scope-board.md)
218
+ - any SPIKE blockers (scope-summary.md)
219
+ - scope-summary "Done when" headline statements
220
+ No scope contracts (pre-v0.3.0, unchanged from v0.2.6):
221
+ Read tasks/_index.md (LOCAL root). Print:
222
+ - task count by package/variant (.shared / .be / .web / .mobile / .e2e)
223
+ - layer distribution (Layer 1โ†’6) and the critical dependency path
224
+ - any SPIKE tasks (third-party feasibility) that block others
225
+ - scope-summary "Done when" headline statements
226
+
227
+ Substrate-disjointness assertion (design spec ยง5.1 Blueprint A, only when
228
+ shapeup/<slug>/scopes/*.md exist โ€” scope-architect's lint pass already ran;
229
+ this is the orchestrator's own re-confirmation before committing to a build sequence):
230
+ - Run `node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/spec-lint.mjs" --slug <slug>`: DISJOINT (a file in two
231
+ scopes' `allowed_file_substrate` without BOTH declaring it `shared_substrate` โ€” PA3
232
+ waiting to happen), PA1 (directory-aligned scope), PA2 (size cap). Any red โ†’ HARD STOP,
233
+ route a remap order to scope-architect before BUILD โ€” a human may have hand-approved
234
+ past a ๐Ÿ”ด at the architect's own checkpoint.
235
+ - Lock the build SEQUENCE riskiest-first: order scopes by open-unknowns count (from
236
+ hill/<scope-id>.yml if present, else the orient hill signal), not by file count or
237
+ alphabetical โ€” Shape Up's "solve in the right sequence" (step 10).
238
+
239
+ Ask (max 2): scope cuts? lens correct? any SPIKE to resolve before build?
240
+ Scope-hammer framing: reference the appetite from the pitch
241
+ (e.g. "Given a ~1-week appetite, which of these scopes feels right-sized?").
242
+ Also surface any rabbit holes identified in the pitch โ€” they flag where scope
243
+ may expand unexpectedly if not cut now. A scope cut here is cheap; after
244
+ BUILD round 1 it's expensive.
245
+ ```
246
+ Do NOT enter BUILD until the board is accepted.
247
+
248
+ ---
249
+
250
+ ## GATE L3 โ€” Verdict & Loop
251
+
252
+ ```
253
+ Render the ๐Ÿ—ป Hill report (slice-level) โ€” NOT a task count. Scope contracts present โ†’ read
254
+ committed hill/<scope-id>.yml shards (mechanical phases from GATE L2.4, DD-10). No contracts โ†’
255
+ fall back to the board + open-unknowns heuristic (uphill/crest/downhill/done). See
256
+ references/ledger-schema.md "Hill report". Roadmap rule unchanged either way: progress is
257
+ reported by hill position, never by "N/M tasks done".
258
+
259
+ Read EVAL-FEATURE-<slug>.md verdict.
260
+
261
+ PASS:
262
+ โ†’ first PASS of the run AND not --no-qa:
263
+ delegate โ–ถ QA EDGE HUNT โ†’ Agent (model: qa โ€” see references/delegation.md
264
+ "Invocation mechanism"): Skill(shapeup-sdlc-plugin:qa-edge-hunter) (pure worker; see
265
+ round-protocol "QA edge hunt"). Args: spec folder, EVAL report path, ledger path, app URL.
266
+ Its GATE Q0/Q1 pauses surface here. Output: `~` findings โ†’ .shapeup/<slug>/discovery/ledger.md
267
+ + .shapeup/<slug>/qa/hunt-report.md. No verdict โ€” the run's verdict stays this EVAL's PASS.
268
+ โ†’ then proceed to SHIP (triage of QA findings happens at SHIP S.0/GATE L4).
269
+ โ†’ subsequent PASS (a promoted-findings fix round): Agent (model: qa):
270
+ Skill(shapeup-sdlc-plugin:qa-edge-hunter) --recheck on the promoted items only, then SHIP.
271
+ โ†’ --no-qa or skill absent: proceed straight to SHIP; ledger records `qa: skipped`.
272
+
273
+ FAIL:
274
+ โ†’ print the bug list grouped by task/severity. For each bug: task ID + failed Done-when criterion + repro.
275
+ DO NOT prescribe fix options or root cause hypotheses โ€” that is the implementer's job.
276
+ The tech lead names scope; the implementer diagnoses and fixes.
277
+ โ†’ ask (max 1): approve fixing these in BUILD round r+1? (or cut scope / waive a bug)
278
+ โ†’ if r+1 > max_rounds: STOP. Escalate to PO with the residual bug list โ€” do not loop
279
+ forever. The harness reports honestly that it hit its round budget.
280
+ โ†’ else: go to BUILD round r+1 (bug-only).
281
+ ```
282
+
283
+ **GATE L3 Output:**
284
+ ```
285
+ โธ GATE L3 โ€” Verdict (round [r])
286
+ ๐Ÿ—ป Hill : S1-spine ๐Ÿ”ฝ downhill ยท S2-filters โ›ฐ๏ธ crest ยท S3-export ๐Ÿ”ผ uphill
287
+ Verdict : [PASS | FAIL] bugs: [N] (rounds used: [r]/[max])
288
+ Decision : [SHIP | re-build bugs in round r+1 | escalate: max rounds hit]
289
+ ```
290
+ The Hill is the progress narrative; the board's `N/N โœ…` is execution substrate (it gates
291
+ EVAL at L2), never the headline. Slices come from `ba`'s board; if slice IDs aren't present
292
+ yet (D3 deferred), report at task-group level and note the fallback in the ledger.
293
+
294
+ ---
295
+
296
+ ## SHIP (step 11) โ€” close out
297
+
298
+ ```
299
+ S.0 GATE H โ€” delegate to scope-hammer (this IS Shape Up's "Decide When to Stop", step 11):
300
+ Invoke via Agent (model: exec โ€” see references/delegation.md "Invocation mechanism"):
301
+ Skill(shapeup-sdlc-plugin:scope-hammer) --slug <slug> --baseline <shaping/baseline.md if present>
302
+ [--breaker outer] when round_budget hit 0 with scopes still open
303
+ [--breaker inner --scope <id>] once per queued hammer proposal (attempt_budget
304
+ exhausted scopes accumulated during BUILD)
305
+ (no --breaker flag) normal stop โ€” all scopes FINISHED, post-QA-hunt
306
+ Feeds it: qa/hunt-report.md findings (when present), discovery/ledger.md open items,
307
+ advisor-protocol budget-overflow flags, the hammer-proposal queue from BUILD.
308
+ Reads back: its GATE H0/H1/H2 output โ€” census, baseline comparison, cut list + verdict.
309
+ Authority: scope-hammer proposes; the tech lead records the PO's decision in
310
+ round-ledger.md and performs the actual close (S.1 onward). It never ships on its own.
311
+ - Cut list confirmed โ†’ all cuts carried to discovery/ledger.md as raw ideas (debt-free).
312
+ - Verdict = CANNOT SHIP (a must-have item failed H1.2) โ†’ do NOT proceed to S.1; escalate
313
+ to PO honestly with scope-hammer's ship-blocking list, same spirit as a max-rounds
314
+ escalation.
315
+ Pre-v0.3.0 spec (no scope contracts) โ†’ scope-hammer still runs; H0's only census sources
316
+ are QA + discovery ledger (no scope/attempt-budget inputs), equivalent to the old inline
317
+ triage this step used to do.
318
+ S.1 Confirm board green + latest eval verdict = PASS.
319
+ S.1b Checklist-hygiene assert: `grep -c "^- \[ \]" .shapeup/<slug>/tasks/TASK-*.md` โ†’
320
+ every count must be 0 on a shipping board. An unchecked AC box on a done task means
321
+ either an unverified criterion (real gap โ€” back to BUILD/EVAL) or an ingest miss (the
322
+ WorkResult's ac_results never covered it โ€” re-run ingest-result on that result, or route
323
+ back to the owning worker for a corrected result; the tech lead does not tick boxes
324
+ itself). Do not SHIP past a non-zero count without logging the reason in the ledger.
325
+ S.2 Print a feature summary: tasks shipped, rounds used, final verdict, dims evaluated
326
+ (and explicitly: dims NOT evaluated, so "shipped" is never read as "verified for all").
327
+ S.3 Point to the traceability: tasks/_index.md (all โœ…) + EVAL-FEATURE-<slug>.md (PASS) +
328
+ harness-run.md (the round ledger).
329
+ S.4 task-executor's GATE E remains the formal per-task close; the tech lead confirms the
330
+ feature-level close.
331
+ S.5 Deploy truth โ€” "done means deployed", honestly. Building stops at "built & verified";
332
+ deployment is an outward-facing action gated to the PO. Either:
333
+ - PO says yes โ†’ run the project deploy (docs/infra/DEPLOYMENT.md) and record "deployed".
334
+ - otherwise โ†’ record "built & verified โ€” deploy pending (PO)".
335
+ NEVER auto-deploy; "shipped" must never silently mean "deployed".
336
+ (Baseline-anchored scope-hammering at ship time is redesign-doc D5 โ€” deferred; for now,
337
+ `ba`'s Appetite Guard covers overflow and cuts go to synthesis "Hammered Out".)
338
+ S.6 Harvest one signal row โ†’ append to `shapeup/metrics/<machine-id>.jsonl`
339
+ (committed, SHARED root; sharded per machine so concurrent runs never merge-conflict on
340
+ one file โ€” addendum ฮ”3; an aggregate view is `cat shapeup/metrics/*.jsonl`).
341
+ Copy fields that ALREADY exist as structured output (run-state, final EVAL report,
342
+ discovery ledger, qa/hunt-report, breadboard B5). Two hard rules:
343
+ 1. Harvest only fields that already exist at ship time โ€” never evaluate something new.
344
+ 2. Record facts, never compute a new verdict (no `run_quality_score` โ€” that would be
345
+ a second judge behind spec-evaluator). The eval suite interprets; harvest records.
346
+ `final_audit_score` is COPIED from the EVAL report, never re-graded.
347
+ ALSO copy the two v1.5 exit measurements, both produced by scripts at zero model tokens:
348
+ node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/stats.mjs" --ratchet --slug <slug>
349
+ โ†’ `ratchet`: {trials, scopes_multi_trial, improvement_rate, monotone_rate,
350
+ sawtooth_count, mean_trials_to_green}
351
+ node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/stats.mjs" --hooks
352
+ โ†’ `hooks`: {evaluations, denials, errors, per_hook}
353
+ Harvest them HERE or lose them: both read LOCAL ledgers (t0/trials.jsonl,
354
+ decisions.jsonl) under the gitignored `.shapeup/` root, so a number left there
355
+ answers its question exactly once and is then wiped. The committed shard is the only
356
+ record that accumulates across runs and across machines โ€” which is what both exit
357
+ criteria require, since neither is meaningful from a single run.
358
+ โ†’ full field list + row template: references/ledger-schema.md "Harvest row".
359
+ ```
360
+
361
+ ---
362
+
363
+ ## GATE L4 โ€” Ship Sign-Off
364
+
365
+ ```
366
+ โธ GATE L4 โ€” Ship Sign-Off
367
+ Feature : [slug] โ€” [SHIPPED (deployed) | BUILT & VERIFIED โ€” deploy pending (PO)]
368
+ Rounds : [r] (build+eval cycles)
369
+ Verdict : PASS (dims: [spec-conformance]; not evaluated: [security, performance])
370
+ QA : [hunt done โ€” N findings, M promoted+fixed, rest ~ | skipped (--no-qa) | n/a (pre-QA spec)]
371
+ Ledger : harness-run.md
372
+ ```
373
+ Question (max 1): "Anything to record before I close the run? (y/n) or provide feedback for the next sprint."
374
+ On confirm:
375
+ - If the PO provides substantive feedback (not just 'y' or empty) โ†’ automatically delegate via Agent (model: exec โ€” see references/delegation.md "Invocation mechanism"): Skill(shapeup-sdlc-plugin:coach) with the provided feedback for RLHF. The coach runs its own GATE COACH-1 to have the PO categorize each rule, then files it under the responsible skill in `shapeup/knowledge-base/<skill>.md` (committed โ†’ team-shared). Coachable skills: `task-executor`, `ba-pitch-analyzer`, `qa-edge-hunter`; each reads its own file at the top of its next run. The tech lead does not categorize the feedback itself โ€” that is the coach's gate, by design (no assumptions).
376
+ - Then output โ†’ `โœ… [slug] [shipped & deployed | built & verified, deploy pending] โ€” [r] rounds, verdict PASS.`
377
+
378
+ ---
379
+