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.
- package/.claude/settings.local.example.json +20 -0
- package/.claude-plugin/marketplace.json +16 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.env.shapeup.example +14 -0
- package/AGENTS.md +133 -0
- package/LICENSE +21 -0
- package/README.md +362 -0
- package/SECURITY.md +72 -0
- package/bin/init.mjs +329 -0
- package/commands/build.md +14 -0
- package/commands/eval.md +15 -0
- package/commands/hammer.md +12 -0
- package/commands/orient.md +11 -0
- package/commands/qa.md +12 -0
- package/commands/retro.md +13 -0
- package/commands/scopes.md +14 -0
- package/commands/shape.md +12 -0
- package/commands/ship.md +53 -0
- package/commands/wire.md +11 -0
- package/hooks/anti-rationalization.mjs +244 -0
- package/hooks/compact-snapshot.mjs +47 -0
- package/hooks/gate-deadline.mjs +151 -0
- package/hooks/gate-intake.mjs +110 -0
- package/hooks/gate-l2.mjs +161 -0
- package/hooks/gate-zerowork.mjs +264 -0
- package/hooks/hooks.json +118 -0
- package/hooks/lib/decision.mjs +183 -0
- package/hooks/safety-spine.mjs +296 -0
- package/hooks/sandbox-guard.mjs +172 -0
- package/hooks/session-rehydrate.mjs +109 -0
- package/hooks/slop-cleaner.mjs +176 -0
- package/oracles/_shared.mjs +46 -0
- package/oracles/http-oracle.mjs +155 -0
- package/oracles/index.mjs +36 -0
- package/oracles/process-oracle.mjs +146 -0
- package/oracles/snapshot-oracle.mjs +119 -0
- package/oracles/test-oracle.mjs +138 -0
- package/package.json +49 -0
- package/skills/advisor-protocol/SKILL.md +171 -0
- package/skills/ba-pitch-analyzer/SKILL.md +175 -0
- package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +84 -0
- package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +65 -0
- package/skills/ba-pitch-analyzer/assets/templates/assess-report.tmpl.md +127 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/be-service.contract.tmpl.md +62 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/offline-storage.contract.tmpl.md +92 -0
- package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +66 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/context-map.tmpl.md +64 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/event-choreography.tmpl.md +77 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +104 -0
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +79 -0
- package/skills/ba-pitch-analyzer/assets/templates/domain-model.tmpl.md +79 -0
- package/skills/ba-pitch-analyzer/assets/templates/feedback.tmpl.md +87 -0
- package/skills/ba-pitch-analyzer/assets/templates/integration.tmpl.md +64 -0
- package/skills/ba-pitch-analyzer/assets/templates/run-state.tmpl.md +77 -0
- package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +105 -0
- package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +215 -0
- package/skills/ba-pitch-analyzer/assets/templates/task-board.tmpl.md +35 -0
- package/skills/ba-pitch-analyzer/assets/templates/task-spike.tmpl.md +86 -0
- package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +84 -0
- package/skills/ba-pitch-analyzer/assets/templates/usecase.tmpl.md +105 -0
- package/skills/ba-pitch-analyzer/assets/templates/ux-behavior.tmpl.md +65 -0
- package/skills/ba-pitch-analyzer/references/contract-patterns.md +152 -0
- package/skills/ba-pitch-analyzer/references/ddd-patterns.md +173 -0
- package/skills/ba-pitch-analyzer/references/doc-schemas.md +275 -0
- package/skills/ba-pitch-analyzer/references/integration-analysis.md +152 -0
- package/skills/ba-pitch-analyzer/references/task-generation.md +623 -0
- package/skills/ba-pitch-analyzer/references/test-surface.md +102 -0
- package/skills/ba-pitch-analyzer/references/ux-behavior-patterns.md +269 -0
- package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +241 -0
- package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +239 -0
- package/skills/coach/SKILL.md +202 -0
- package/skills/orient/SKILL.md +262 -0
- package/skills/qa-edge-hunter/SKILL.md +369 -0
- package/skills/scope-architect/SKILL.md +111 -0
- package/skills/scope-hammer/SKILL.md +186 -0
- package/skills/shapeup/SKILL.md +403 -0
- package/skills/shapeup/resources/breadboard-reflection.md +88 -0
- package/skills/shapeup/resources/breadboarding.md +334 -0
- package/skills/shapeup/resources/context-compaction.md +240 -0
- package/skills/shapeup/resources/framing-doc.md +92 -0
- package/skills/shapeup/resources/kickoff-doc.md +95 -0
- package/skills/shapeup/resources/shaping.md +194 -0
- package/skills/shapeup/resources/spike.md +86 -0
- package/skills/solution-architect/SKILL.md +129 -0
- package/skills/spec-evaluator/README.md +93 -0
- package/skills/spec-evaluator/SKILL.md +213 -0
- package/skills/spec-evaluator/references/anti-leniency.md +50 -0
- package/skills/spec-evaluator/references/dimension-contract.md +126 -0
- package/skills/spec-evaluator/references/dimensions/_registry.md +40 -0
- package/skills/spec-evaluator/references/dimensions/completeness.md +102 -0
- package/skills/spec-evaluator/references/dimensions/integration.md +129 -0
- package/skills/spec-evaluator/references/dimensions/performance.md +48 -0
- package/skills/spec-evaluator/references/dimensions/security.md +60 -0
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +134 -0
- package/skills/spec-evaluator/references/dimensions/tdd-surface.md +110 -0
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +100 -0
- package/skills/spec-evaluator/references/probing.md +177 -0
- package/skills/spec-evaluator/references/report-schema.md +101 -0
- package/skills/spec-evaluator/references/verdict-ledger.md +92 -0
- package/skills/spec-evaluator/scripts/verdict-ledger.mjs +166 -0
- package/skills/task-executor/SKILL.md +194 -0
- package/skills/tech-lead/README.md +71 -0
- package/skills/tech-lead/SKILL.md +459 -0
- package/skills/tech-lead/references/delegation.md +254 -0
- package/skills/tech-lead/references/gates.md +379 -0
- package/skills/tech-lead/references/invocation.md +45 -0
- package/skills/tech-lead/references/ledger-schema.md +214 -0
- package/skills/tech-lead/references/round-protocol.md +184 -0
- package/skills/tech-lead/references/state-model.md +66 -0
- package/skills/tech-lead/references/tiny-lane.md +52 -0
- package/skills/tech-lead/schemas/domain.schema.json +2294 -0
- package/skills/tech-lead/schemas/gate-answers.schema.json +92 -0
- package/skills/tech-lead/schemas/work-order.schema.json +21 -0
- package/skills/tech-lead/schemas/work-result.schema.json +40 -0
- package/skills/tech-lead/scripts/aegis-digest.mjs +124 -0
- package/skills/tech-lead/scripts/budget-check.mjs +156 -0
- package/skills/tech-lead/scripts/compile-order.mjs +518 -0
- package/skills/tech-lead/scripts/fit-check.mjs +196 -0
- package/skills/tech-lead/scripts/gate-answers.mjs +338 -0
- package/skills/tech-lead/scripts/ingest-result.mjs +270 -0
- package/skills/tech-lead/scripts/init-run.mjs +326 -0
- package/skills/tech-lead/scripts/lib/argv.mjs +224 -0
- package/skills/tech-lead/scripts/lib/contract-md.mjs +481 -0
- package/skills/tech-lead/scripts/lib/is-main.mjs +82 -0
- package/skills/tech-lead/scripts/lib/paths.mjs +278 -0
- package/skills/tech-lead/scripts/lib/ratchet-tree.mjs +112 -0
- package/skills/tech-lead/scripts/run-snapshot.mjs +269 -0
- package/skills/tech-lead/scripts/ship-report.mjs +275 -0
- package/skills/tech-lead/scripts/stats.mjs +423 -0
- package/skills/tech-lead/scripts/t0-verify.mjs +470 -0
- package/skills/tech-lead/scripts/trace-lint.mjs +367 -0
- package/skills/tech-lead/scripts/validate-envelope.mjs +283 -0
- package/skills/translator/README.md +66 -0
- package/skills/translator/SKILL.md +258 -0
- 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
|
+
|