shapeup-sdlc 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +36 -103
- package/README.md +60 -67
- package/SECURITY.md +31 -16
- package/bin/init.mjs +24 -69
- package/commands/build.md +19 -0
- package/commands/eval.md +5 -4
- package/commands/scopes.md +5 -4
- package/commands/shape.md +1 -1
- package/commands/ship.md +37 -4
- package/hooks/anti-rationalization.mjs +7 -13
- package/hooks/compact-snapshot.mjs +5 -5
- package/hooks/gate-deadline.mjs +12 -16
- package/hooks/gate-intake.mjs +13 -14
- package/hooks/gate-l2.mjs +3 -3
- package/hooks/gate-zerowork.mjs +97 -16
- package/hooks/lib/decision.mjs +21 -13
- package/hooks/safety-spine.mjs +1 -1
- package/hooks/sandbox-guard.mjs +83 -47
- package/hooks/session-rehydrate.mjs +8 -9
- package/hooks/slop-cleaner.mjs +1 -1
- package/oracles/_shared.mjs +1 -1
- package/oracles/http-oracle.mjs +1 -1
- package/oracles/index.mjs +1 -1
- package/oracles/process-oracle.mjs +1 -1
- package/oracles/snapshot-oracle.mjs +1 -1
- package/oracles/test-oracle.mjs +1 -1
- package/package.json +3 -7
- package/skills/ba-pitch-analyzer/SKILL.md +20 -15
- package/skills/ba-pitch-analyzer/references/doc-schemas.md +1 -1
- package/skills/ba-pitch-analyzer/references/task-generation.md +6 -6
- package/skills/ba-pitch-analyzer/references/test-surface.md +1 -1
- package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +5 -5
- package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +2 -2
- package/skills/coach/SKILL.md +3 -3
- package/skills/orient/SKILL.md +2 -1
- package/skills/qa-edge-hunter/SKILL.md +9 -39
- package/skills/scope-architect/SKILL.md +17 -12
- package/skills/scope-hammer/SKILL.md +5 -5
- package/skills/shapeup/SKILL.md +3 -3
- package/skills/shapeup/resources/context-compaction.md +4 -3
- package/skills/solution-architect/SKILL.md +18 -11
- package/skills/spec-evaluator/SKILL.md +12 -5
- package/skills/spec-evaluator/references/dimensions/_registry.md +2 -2
- package/skills/spec-evaluator/references/dimensions/completeness.md +1 -1
- package/skills/spec-evaluator/references/dimensions/integration.md +98 -67
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +4 -4
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +1 -1
- package/skills/spec-evaluator/references/probing.md +42 -23
- package/skills/spec-evaluator/references/report-schema.md +2 -2
- package/skills/spec-evaluator/scripts/verdict-ledger.mjs +1 -1
- package/skills/task-executor/SKILL.md +25 -12
- package/skills/tech-lead/SKILL.md +115 -438
- package/skills/tech-lead/references/delegation.md +38 -31
- package/skills/tech-lead/references/gates.md +75 -33
- package/skills/tech-lead/references/hard-rules.md +34 -0
- package/skills/tech-lead/references/invocation.md +2 -2
- package/skills/tech-lead/references/ledger-schema.md +17 -18
- package/skills/tech-lead/references/round-protocol.md +77 -27
- package/skills/tech-lead/references/state-model.md +1 -1
- package/skills/tech-lead/schemas/domain.schema.json +320 -148
- package/skills/tech-lead/schemas/gate-answers.schema.json +2 -2
- package/skills/tech-lead/schemas/work-result.schema.json +55 -17
- package/skills/tech-lead/scripts/aegis-digest.mjs +1 -1
- package/skills/tech-lead/scripts/budget-check.mjs +7 -13
- package/skills/tech-lead/scripts/compile-order.mjs +69 -22
- package/skills/tech-lead/scripts/fit-check.mjs +10 -10
- package/skills/tech-lead/scripts/gate-answers.mjs +11 -12
- package/skills/tech-lead/scripts/hill-derive.mjs +133 -0
- package/skills/tech-lead/scripts/ingest-result.mjs +7 -19
- package/skills/tech-lead/scripts/init-run.mjs +60 -18
- package/skills/tech-lead/scripts/lib/argv.mjs +1 -1
- package/skills/tech-lead/scripts/lib/contract-md.mjs +10 -10
- package/skills/tech-lead/scripts/lib/is-main.mjs +11 -12
- package/skills/tech-lead/scripts/lib/paths.mjs +15 -13
- package/skills/tech-lead/scripts/resume-state.mjs +387 -0
- package/skills/tech-lead/scripts/run-snapshot.mjs +1 -6
- package/skills/tech-lead/scripts/run-workflow.mjs +381 -0
- package/skills/tech-lead/scripts/ship-report.mjs +33 -2
- package/skills/tech-lead/scripts/stats.mjs +9 -10
- package/skills/tech-lead/scripts/t0-verify.mjs +4 -4
- package/skills/tech-lead/scripts/trace-lint.mjs +2 -2
- package/skills/tech-lead/workflows/shapeup-run.js +911 -0
- package/skills/translator/SKILL.md +2 -2
- package/skills/advisor-protocol/SKILL.md +0 -171
|
@@ -8,452 +8,129 @@ description: "Use this skill whenever the user wants to orchestrate a whole feat
|
|
|
8
8
|
## ▶ RUN THIS FIRST — do not summarise this file
|
|
9
9
|
|
|
10
10
|
**Your first output must be a tool call, not a plan.** Everything you emit before the first tool
|
|
11
|
-
call is narration, and a narrated run is a failed run
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
call is narration, and a narrated run is a failed run — it reads like a clean success and leaves
|
|
12
|
+
escaped defects behind it. `hooks/gate-zerowork.mjs` (Stop) blocks a session
|
|
13
|
+
that **reached the orchestrator and left no receipt** — where "reached the orchestrator" means
|
|
14
|
+
dispatching this skill or launching a `shapeup-*` workflow by either surface, and the receipt is
|
|
15
|
+
what `init-run.mjs` writes. Working around the harness is not an exemption: a busy session used to
|
|
16
|
+
switch this gate off and no longer does. Loading these instructions is not running them.
|
|
16
17
|
|
|
17
|
-
**Step 1 — open the run.**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
quoting for six turns (measured):
|
|
18
|
+
**Step 1 — open the run.** Write the requirement to a file first, then pass the path — a
|
|
19
|
+
multi-line requirement inlined into a shell argument is where this step goes wrong (measured: six
|
|
20
|
+
turns fighting shell quoting):
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
# 1a. put the requirement somewhere (Write tool, or it is already on disk as a pitch/spec)
|
|
24
|
-
# 1b. open the run against it
|
|
25
23
|
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/init-run.mjs" \
|
|
26
|
-
--slug <slug-from-the-request> \
|
|
27
|
-
--intake-file <path/to/the/requirement.md> \
|
|
24
|
+
--slug <slug-from-the-request> --intake-file <path/to/the/requirement.md> \
|
|
28
25
|
--auto-level <interactive|auto|unattended> \
|
|
29
|
-
[--gate-answers <ci|guarded|path.json>] [--wall-clock-budget <seconds>] [--max-rounds 3]
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
**Step 2 — resolve the gate, don't reason about permission.** At every ⏸ gate, emit the gate
|
|
64
|
-
block, then run:
|
|
26
|
+
[--dimensions <a,b>] [--gate-answers <ci|guarded|path.json>] [--wall-clock-budget <seconds>] [--max-rounds 3]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Exit 3 means a run is ALREADY OPEN.** Resume it; do not re-open it. The refusal prints the
|
|
30
|
+
derived RESUME STATE (slug, status, round, board counts) — read it and go straight to Step 2;
|
|
31
|
+
`shapeup-run.js`'s own fast-forward will re-derive exactly where to continue from disk, never from
|
|
32
|
+
this session's memory. `--force` re-opens deliberately and discards the round history the breaker
|
|
33
|
+
counts.
|
|
34
|
+
|
|
35
|
+
**If this command comes back "requires approval", stop and say so.** These scripts ship with the
|
|
36
|
+
plugin and need a one-time permission grant (`npx shapeup-sdlc init` writes it). Do not route
|
|
37
|
+
around it, and do not silently hand-build the feature instead.
|
|
38
|
+
|
|
39
|
+
**Language gate (delegated to `translator`, not this skill):** at GATE L0, before Step 2, dispatch
|
|
40
|
+
an Agent (model: exec) that calls `Skill(shapeup-sdlc-plugin:translator) --check <intake>`.
|
|
41
|
+
English → proceed as-is. Non-English → dispatch a second Agent (`--auto` under auto/unattended)
|
|
42
|
+
and orchestrate against the produced `<name>.en.md`. The tech lead detects and sequences; it never
|
|
43
|
+
translates itself.
|
|
44
|
+
|
|
45
|
+
**Step 2 — pin GATE L0, then launch.** Collect the L0.1–L0.9 config (spec folder, lens, stack,
|
|
46
|
+
eval dims, max_rounds, the model/budget matrix — see `references/gates.md` GATE L0 for the full
|
|
47
|
+
collect-list), write the SHARED `project-profile.md` yourself (`{schema_version:1, archetype,
|
|
48
|
+
entry_point}` — the only artifact this skill writes directly; `shapeup-run.js` has no filesystem
|
|
49
|
+
of its own), emit the `⏸ GATE L0` block, then check the lane:
|
|
50
|
+
|
|
51
|
+
- **`--tiny`, or the spec has no committed `scopes/*.md` yet** (pre-v0.3.0 spec): `shapeup-run.js`
|
|
52
|
+
is out of scope for this lane by design (it targets scope-contract specs). Run the unchanged
|
|
53
|
+
legacy loop instead — `references/round-protocol.md` (BUILD(r)/EVAL) + `references/delegation.md`
|
|
54
|
+
carry the full step-by-step for both the tiny lane and a scope-less BUILD loop, verbatim, non-
|
|
55
|
+
regression. Stop reading this file here for that run.
|
|
56
|
+
- **Otherwise** (the common case — a scoped spec, any auto level): write `RunArgs`
|
|
57
|
+
(`domain.schema.json` `$defs/RunArgs` — `{slug, autoLevel, answers, models:{exec,eval,qa},
|
|
58
|
+
budgets:{maxRounds,attemptBudget,wallClockS}, pluginRoot, startedAt}`) to
|
|
59
|
+
`.shapeup/<slug>/run-args.json`, then launch it as a **background** Bash call:
|
|
65
60
|
|
|
66
61
|
```bash
|
|
67
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
a
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
62
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/run-workflow.mjs" \
|
|
63
|
+
"${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/workflows/shapeup-run.js" \
|
|
64
|
+
--args-file .shapeup/<slug>/run-args.json --run-dir .shapeup/<slug>/workflow-run
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`shapeup-run.js` (`domain.schema.json` `$defs/RunArgs`/`RunReturn`) owns everything from ORIENT
|
|
68
|
+
through GATE H and ship-report — every gate inside that range resolves via `gate-answers.mjs`'s
|
|
69
|
+
exit code, in code, not by this skill's own reading of a paragraph. The `RunReturn` arrives as
|
|
70
|
+
`result` in `.shapeup/<slug>/workflow-run/result.json`, and on stdout.
|
|
71
|
+
|
|
72
|
+
**Background, and by Bash — both are load-bearing.** A real run outlives any foreground tool-call
|
|
73
|
+
ceiling. And **do not launch this with the `Workflow` tool** unless the project has explicitly
|
|
74
|
+
granted it: that call is denied by default in a headless session — the lane then executes zero
|
|
75
|
+
times while the session improvises the feature by hand — and the only grant that unblocks it is
|
|
76
|
+
the unscoped token `"Workflow"`, which permits *every*
|
|
77
|
+
dynamic workflow script in the project. `run-workflow.mjs` runs the same script under the
|
|
78
|
+
path-scoped grant `npx shapeup-sdlc init` already writes. Headless runs also need
|
|
79
|
+
`CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0`, or the wait is cut at 600 s and a truncated run is
|
|
80
|
+
reported as a clean one. If the launch comes back "requires approval", stop
|
|
81
|
+
and say so — do not hand-build the feature instead.
|
|
82
|
+
|
|
83
|
+
## Step 3 — the pause protocol: branch on `RunReturn.status`
|
|
84
|
+
|
|
85
|
+
| `status` | What the workflow is telling you | What you do |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `paused` | A gate resolved "ask" — `paused_at` names it, `block` is composed and ready | Emit `block` **verbatim** (never re-summarise it — that is the paraphrase channel this design exists to close). Put it to the PO, get a decision. Write it to `.shapeup/<slug>/gate-answers.json` (`{"version":1,"preset":"custom","answers":{"<paused_at>":{"decision":"<answer>"}}}`, merging with any prior gate's answer already there). **Relaunch the SAME command, same `--args-file`** — the fast-forward re-derives from disk and re-dispatches nothing already done (verify: `orders/` minus `results/` is empty before it proceeds) |
|
|
88
|
+
| `aborted` | A gate resolved "abort", or a hard stop (spec-lint red, scope-hammer CANNOT SHIP) | Report `aborted_at` + `reason` to the PO. Do not relaunch without a human decision — `--force` on `init-run.mjs` if truly restarting |
|
|
89
|
+
| `gate_h` | A circuit breaker tripped (`breaker`: outer \| inner \| deadline) — `green_scopes` shipped nothing, `hammer_proposals` needs a census | Dispatch a fresh Agent (model: exec): `Skill(shapeup-sdlc-plugin:scope-hammer) --slug <slug> --breaker <breaker> [--scope <id>]` for the census + cut list, put the PO's decision to `references/gates.md` GATE H, then close out via Step 4 below |
|
|
90
|
+
| `shipped` | The board's final round passed EVAL, QA ran, GATE H accepted the cut list, `report` names the frozen `shapeup/<slug>/REPORT.md` | Go straight to Step 4 |
|
|
91
|
+
|
|
92
|
+
**Never** treat a `paused` return as a stall to work around, and never invent an answer this skill
|
|
93
|
+
did not actually receive from the PO — an unattended lane with no answer for a gate is meant to
|
|
94
|
+
`abort` (see `gate-answers.mjs`'s `on_missing`), not silently proceed.
|
|
95
|
+
|
|
96
|
+
## Step 4 — GATE L4 — Ship Sign-Off (this skill's own gate; the workflow never sees it)
|
|
97
|
+
|
|
98
|
+
FIRST freeze the evidence — run state is gitignored, so `shapeup/<slug>/REPORT.md` (already
|
|
99
|
+
written by `shapeup-run.js` via `ship-report.mjs`, or write it now on a `gate_h` close) is all a
|
|
100
|
+
teammate sees. Then emit:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
⏸ GATE L4 — Ship Sign-Off
|
|
104
|
+
Feature : [slug] — [SHIPPED (deployed) | BUILT & VERIFIED — deploy pending (PO)]
|
|
105
|
+
Rounds : [rounds_used]
|
|
106
|
+
Verdict : [verdict] (dims: [spec-conformance]; not evaluated: [dims_not_evaluated])
|
|
107
|
+
QA : [qa_findings] findings | skipped
|
|
108
|
+
Ledger : harness-run.md
|
|
109
|
+
```
|
|
110
|
+
Ask (max 1): "Anything to record before I close the run?" On substantive feedback, delegate
|
|
111
|
+
`Skill(shapeup-sdlc-plugin:coach)` for RLHF (its own GATE COACH-1 — the tech lead never
|
|
112
|
+
categorizes feedback itself). Then output the final `✅ [slug] …` line.
|
|
113
|
+
|
|
114
|
+
## Scope boundary
|
|
115
|
+
|
|
116
|
+
Owns the Shape Up **Building phase (steps 7–11)** only. Shaping (1–4), Betting (5) and Kick-off
|
|
117
|
+
(6) are PO-personal and upstream: intake is a *kicked-off pitch*, never a raw idea. The tech lead
|
|
118
|
+
never orients, plans, builds, or judges itself — `shapeup-run.js` **sequences** the skills that do
|
|
119
|
+
and returns to the PO at every gate.
|
|
120
|
+
|
|
121
|
+
> **Gate collect-lists + output-block formats** → `references/gates.md`
|
|
122
|
+
> **How each sub-skill is invoked + handoff files (the envelope port)** → `references/delegation.md`
|
|
123
|
+
> **The round loop, stop conditions, three-level breaker rationale** → `references/round-protocol.md`
|
|
112
124
|
> **Run ledger format + Hill report** → `references/ledger-schema.md`
|
|
113
|
-
> **State ownership,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
## Workflow Overview
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
INTAKE kicked-off pitch (shaped + bet by the PO) + project context
|
|
121
|
-
⏸ L0 Intake & Run Config ....... receipt (L0.1), lane + answer set (L0.2), spec folder, lens,
|
|
122
|
-
stack, eval dims, max_rounds, budgets. No shaping here.
|
|
123
|
-
▶ 7 ORIENT ................... delegate orient (Scout) → orient/: code-surface map, spike
|
|
124
|
-
findings, discovered-task seed, hill signal. Before any board.
|
|
125
|
-
⏸ L1a Orient Review ............ 🗻 area-level Hill; riskiest area + spike result.
|
|
126
|
-
▶ 7.5 ✚ WIRE ..................... delegate solution-architect → wiring-map.md (UC → engine →
|
|
127
|
-
seam → entry-point call site → affordance).
|
|
128
|
-
⏸ L1a.5 Wiring Review ............ every UC has a declared seam; no engine orphaned. Spine-only.
|
|
129
|
-
▶ 8 MAP SCOPES ............... delegate ba-pitch-analyzer (orient-informed) → spec tree +
|
|
130
|
-
tasks/_index.md; then scope-architect → scopes/*.md.
|
|
131
|
-
⏸ L1b Board Review ............. slices, spine, ~ nice-to-haves, deps, scope. PO signs off
|
|
132
|
-
BEFORE any code is written.
|
|
133
|
-
▶ 9 BUILD r .................. per dispatch: compile-order → task-executor(--order) →
|
|
134
|
-
ingest-result. r=1 all ready tasks; r>1 ONLY last EVAL's bugs.
|
|
135
|
-
Discoveries → ledger → reconcile order → back to L1b.
|
|
136
|
-
⏸ L2 Build Round Complete ..... EVERY task status=done. Hook WARNS if not; you still decide.
|
|
137
|
-
▶ EVAL r ................... delegate spec-evaluator --single-pass → ONE verdict + bugs.
|
|
138
|
-
Once over the whole feature. Never inside BUILD.
|
|
139
|
-
⏸ L3 Verdict & Loop ........... 🗻 slice-level Hill + verdict. PASS → SHIP. FAIL → bugs →
|
|
140
|
-
BUILD r+1. Out of rounds/clock → GATE H.
|
|
141
|
-
▶ 10 QA ....................... qa-edge-hunter, post-PASS, pre-ship. Discovers; never blocks.
|
|
142
|
-
▶ 11 SHIP / GATE H ............ scope-hammer: census, baseline comparison, cut list.
|
|
143
|
-
⏸ L4 Ship Sign-Off ............ PO confirms before close.
|
|
144
|
-
✅ shipped, ledger closed, verdict recorded
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
## Precondition — English-only intake (delegated to `translator`)
|
|
148
|
-
|
|
149
|
-
The whole harness (`ba-pitch-analyzer`, `task-executor`, `spec-evaluator`) is English-only
|
|
150
|
-
end to end and HARD-FAILs on anything else. The tech lead does **not** translate — that is a
|
|
151
|
-
separate single-purpose concern owned by the **`translator`** skill. The orchestrator only
|
|
152
|
-
*detects* the gap and *sequences* the translator before PLAN; it never does the translation
|
|
153
|
-
itself.
|
|
154
|
-
|
|
155
|
-
At GATE L0 the tech lead dispatches an Agent (model: exec — see references/delegation.md
|
|
156
|
-
"Invocation mechanism") that calls `Skill(shapeup-sdlc-plugin:translator) --check <intake>`:
|
|
157
|
-
- **English** → proceed straight to ORIENT against the original.
|
|
158
|
-
- **non-English** → dispatch a second Agent (model: exec) that calls
|
|
159
|
-
`Skill(shapeup-sdlc-plugin:translator) <intake>` (pass `--auto` under `--auto`/`--unattended`),
|
|
160
|
-
then orchestrate against the produced `<name>.en.md` copies. Record the translator pass in
|
|
161
|
-
the ledger.
|
|
162
|
-
|
|
163
|
-
The tech lead's job stays orchestration faithful to Shape Up: kicked-off pitch → ORIENT →
|
|
164
|
-
MAP SCOPES → BUILD rounds → single end-of-round EVAL → SHIP. Language normalization is
|
|
165
|
-
upstream and out of scope here.
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## GATE L0 — Intake & Run Config
|
|
170
|
-
|
|
171
|
-
**L0.0 — INTAKE PRECONDITION** (`hooks/gate-intake.mjs`, rationale in `references/gates.md`): no pitch/spec/requirement text → **ABORT**, never narrate the pipeline.
|
|
172
|
-
**L0.1 — OPEN THE RUN** (`scripts/init-run.mjs`): the first tool call of the run, before any prose. Writes `receipt.json` + `intake.md` + `harness-run.md` + `active-scope`. A session that reaches `Stop` having dispatched this skill with no receipt is blocked by `hooks/gate-zerowork.mjs` — narration is not a reachable ending.
|
|
173
|
-
**L0.2 — RESOLVE THE LANE** (`scripts/gate-answers.mjs`): under `--auto`/`--unattended`, verify the answer set covers every gate this lane will hit (`--verify --auto-level <level>`) BEFORE ORIENT. A missing or `ask` answer in a headless lane is a stall that spends the whole wall-clock budget and reports as a slow harness — catch it in the first ten seconds instead. `--unattended` defaults to `--preset ci`, `--auto` to `--preset guarded`.
|
|
174
|
-
Then pin the run config once, up front (pitch source, language gate, appetite, workspace roots, lens, stack, eval dims, max_rounds, auto level, the L0.8 model/budget matrix, L0.9 attempt_budget); emit the `⏸ GATE L0` block, wait for PO confirm (proceed under `--unattended`), don't start ORIENT until confirmed.
|
|
175
|
-
→ **Playbook (collect list L0.1–L0.9 + gate-output block):** `references/gates.md` — GATE L0.
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## ORIENT (step 7) — delegate to orient (the Scout)
|
|
180
|
-
|
|
181
|
-
Building opens with Orient, not planning: dispatch `orient` (model: exec) to read real code + spike the scary parts, writing the four `orient/` artifacts that are the orient → ba contract.
|
|
182
|
-
→ **Playbook (invoke line, artifacts, ledger record):** `references/gates.md` — ORIENT.
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## GATE L1a — Orient Review
|
|
187
|
-
|
|
188
|
-
First Hill read (area-level): render the 🗻 Hill from `hill-signal.md`, print code-surface headline + spiked area + result + riskiest unknowns, ask ≤2; don't enter MAP SCOPES until Orient is accepted.
|
|
189
|
-
→ **Playbook:** `references/gates.md` — GATE L1a.
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## WIRE (step 7.5) + traceability spine ✚ — delegate to solution-architect
|
|
194
|
-
|
|
195
|
-
Spine-only (self-skips on a legacy spec): you write `project-profile.md` at L0; `solution-architect` (`wire`) is the sole writer of `wiring-map.md`; `ba` writes the `requirements.md` registry (`coverage`); `trace-lint` runs ADVISORY at L1b. ⏸ GATE L1a.5: confirm each UC has a declared seam before slicing.
|
|
196
|
-
→ **Playbook (PROFILE/WIRE/COVERAGE/trace-lint steps):** `references/gates.md` — WIRE / L1a.5.
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## MAP SCOPES (step 8) — delegate to ba-pitch-analyzer (orient-informed)
|
|
201
|
-
|
|
202
|
-
Two orders, two workers, one step: `ba-pitch-analyzer` (`analyze`) writes the spec tree + board from the orient artifacts (no re-scan); `scope-architect` (`map-scopes`) is the sole writer of the committed `scopes/*.md` contracts. Keep the planner ambitious on scope, high-level on tech.
|
|
203
|
-
→ **Playbook (both compile-order lines, faithful/deviation notes):** `references/gates.md` — MAP SCOPES.
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## GATE L1b — Board Review (Plan Acceptance)
|
|
208
|
-
|
|
209
|
-
PO sees the shape before any code — scope cut/confirmed here (cheap now, expensive later): on a scoped spec the PO reviews the SHARED plan (usecases + `scopes/*.md` + scope-summary), never the LOCAL board; bootstrap a missing board via a generate-board order; re-assert disjointness + PA1/PA2 (`spec-lint.mjs`); order scopes riskiest-first; ask ≤2; don't enter BUILD until accepted.
|
|
210
|
-
→ **Playbook (bootstrap check, scoped/legacy reads, disjointness assertion):** `references/gates.md` — GATE L1b.
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## BUILD round r — compile order → dispatch → ingest result → verify
|
|
215
|
-
|
|
216
|
-
**The pipeline sub-layer (pure-skill architecture v1.0).** Every dispatch to a worker is four
|
|
217
|
-
mechanical calls — the WorkOrder/WorkResult envelopes are the harness's canonical port, and
|
|
218
|
-
the two pipeline scripts (not the workers) own all shared-state reads/writes. Every script path
|
|
219
|
-
below is written in full because that is the exact shape `npx shapeup-sdlc init` grants in
|
|
220
|
-
`permissions.allow` — run them as written; do not shorten them.
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
a. COMPILE node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" … → .shapeup/<slug>/orders/<id>.json
|
|
224
|
-
b. DISPATCH Agent (model: exec) — fresh subagent, the zero-memory-handoff boundary:
|
|
225
|
-
Skill(shapeup-sdlc-plugin:task-executor) --order <order path>
|
|
226
|
-
The worker implements, then writes its WorkResult envelope to
|
|
227
|
-
.shapeup/<slug>/results/<same id>.json (its output contract). It writes NO
|
|
228
|
-
board/ledger/run-state files itself.
|
|
229
|
-
c. INGEST node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ingest-result.mjs" <result path>
|
|
230
|
-
→ ticks AC boxes, flips task/board status, appends the Execution Log, propagates
|
|
231
|
-
unblocks, appends discoveries to the ledger, queues any ESCALATEs — schema-
|
|
232
|
-
validated, deterministic, the single writer of shared state (D6, closed).
|
|
233
|
-
d. VERIFY (scope contracts only) node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/t0-verify.mjs" …
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
A `validate-envelope.mjs` PreToolUse hook denies any dispatch whose `--order` file is missing
|
|
237
|
-
or schema-invalid — a malformed order never reaches a worker.
|
|
238
|
-
|
|
239
|
-
**No scope contracts (pre-v0.3.0 spec, or a scope-less run):**
|
|
240
|
-
```
|
|
241
|
-
r = 1 (first build):
|
|
242
|
-
Loop until compile-order --next reports no ready task (board all ✅):
|
|
243
|
-
a. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" --next --slug <slug> [--test-cmd "<cmd>"]
|
|
244
|
-
b. dispatch (fresh Agent, model: exec): Skill(shapeup-sdlc-plugin:task-executor) --order <path>
|
|
245
|
-
c. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ingest-result.mjs" .shapeup/<slug>/results/<id>.json
|
|
246
|
-
SPIKE tasks resolve first (they block; compile-order's dependency check enforces the order).
|
|
247
|
-
|
|
248
|
-
Discovered Tasks:
|
|
249
|
-
ingest-result appends any discoveries[] to the ledger. When the board finishes with new
|
|
250
|
-
ledger entries, compile a reconcile order for the planner:
|
|
251
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" --operation reconcile --slug <slug>
|
|
252
|
-
--worker ba-pitch-analyzer --payload '{"discovered_ledger": ".shapeup/<slug>/discovery/ledger.md"}'
|
|
253
|
-
dispatch it, ingest its result, then route back to GATE L1b (Board Review) for PO approval
|
|
254
|
-
before resuming BUILD on the newly generated tasks.
|
|
255
|
-
|
|
256
|
-
r > 1 (fix build, after a FAIL):
|
|
257
|
-
Input = the bug list in evaluation/EVAL-FEATURE-<slug>.md from the previous EVAL.
|
|
258
|
-
Build ONLY those bugs: per bug,
|
|
259
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" --task <id> --slug <slug> --operation fix
|
|
260
|
-
--payload '{"bugs": [<the bug entries for this task>]}'
|
|
261
|
-
then dispatch + ingest as above. Do NOT re-run the whole board. Do NOT touch passing areas.
|
|
262
|
-
```
|
|
263
|
-
Record per task in the ledger: task id, status, files touched (all read from the WorkResult).
|
|
264
|
-
|
|
265
|
-
**Scope contracts present — the isolated attempt loop (design spec §3.5/§5.1, Blueprint A):**
|
|
266
|
-
```
|
|
267
|
-
For each scope in the L1b sequence (riskiest-first), not yet FINISHED:
|
|
268
|
-
0. checkout(branch-of-scope) — branch-per-scope isolation (PA3/PA5). Write the pointer
|
|
269
|
-
.shapeup/active-scope = {slug, scope_id} — this is what the PreToolUse sandbox
|
|
270
|
-
hook reads to enforce the scope's allowed_file_substrate on every Edit/Write this round.
|
|
271
|
-
|
|
272
|
-
for attempt in 1..attempt_budget (L0.9, default 5):
|
|
273
|
-
a. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" --scope shapeup/<slug>/scopes/<id>.md
|
|
274
|
-
--round <N> --attempt <M> [--test-cmd "<cmd>"]
|
|
275
|
-
→ orders/r<N>-a<M>.json: scope contract + tasks + ledger decisions + `trial_history` —
|
|
276
|
-
the last 8 trials from t0/trials.jsonl, CROSSING the round boundary, each with score,
|
|
277
|
-
status and top-3 digest. No chat history (zero-memory handoff, PA6): facts only.
|
|
278
|
-
b. dispatch Agent (model: exec) — a fresh subagent, this IS the zero-memory-handoff
|
|
279
|
-
boundary: Skill(shapeup-sdlc-plugin:task-executor) --order <path>
|
|
280
|
-
c. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ingest-result.mjs" .shapeup/<slug>/results/r<N>-a<M>.json
|
|
281
|
-
Escalates queued by ingest → dispatch Agent (model: exec):
|
|
282
|
-
Skill(shapeup-sdlc-plugin:advisor-protocol) --ledger round-ledger.md
|
|
283
|
-
--escalate <block> [--unattended]; persist the answer immediately (it must survive
|
|
284
|
-
the next attempt's fresh context — compile-order reads it back from the ledger).
|
|
285
|
-
Cap: 3/scope/round (advisor-protocol's own budget).
|
|
286
|
-
d. t0 = run `node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/t0-verify.mjs" <scope-contract> --round <N> --attempt <M>
|
|
287
|
-
--seesaw-registry .shapeup/<slug>/seesaw/registry.json`
|
|
288
|
-
→ writes t0/verdicts/r<N>-a<M>-t<T>.json (spec-evaluator must cite it at L2/EVAL) and
|
|
289
|
-
appends a row to t0/trials.jsonl. The `-t<T>` term + a `wx` write mean a retry of the
|
|
290
|
-
same attempt lands BESIDE its predecessor — no verdict is ever overwritten (I4).
|
|
291
|
-
e. THE RATCHET. t0-verify already scored this attempt against the last kept one and acted
|
|
292
|
-
on the tree. Do not branch on red/green — read `status` from its output:
|
|
293
|
-
kept strictly better (incl. RED-BUT-IMPROVED, 2/5 → 4/5 — the whole ratchet).
|
|
294
|
-
Tree snapshotted. overall=green → break the loop (DOWNHILL_EXECUTION);
|
|
295
|
-
else continue, and attempt N+1 now builds ON attempt N.
|
|
296
|
-
reverted not better (a tie is not better); tree already restored from the last kept
|
|
297
|
-
snapshot. Subsumes the old seesaw `git stash` branch — a regression raises
|
|
298
|
-
score.regressions and reverts through this same rule.
|
|
299
|
-
rebased incomparable (fixtures_total changed by a split/remap); tree kept, baseline
|
|
300
|
-
reset — not a verdict, not a failure.
|
|
301
|
-
crash spawn failure/timeout; tree restored. Fix the fixture, not the code.
|
|
302
|
-
if attempt_budget is exhausted without green, OR compile-order prints the stagnation breaker
|
|
303
|
-
on stderr (`no_progress_k` consecutive non-kept trials, L0.9, default 2) → inner circuit
|
|
304
|
-
breaker tripped. Do NOT block the round. Queue a hammer PROPOSAL (scope_id + last t0
|
|
305
|
-
artifact + reason) for GATE H, and move to the next scope in sequence.
|
|
306
|
-
|
|
307
|
-
Discovered Tasks (unchanged mechanism, now scope-aware):
|
|
308
|
-
If a scope's discoveries don't fit its own substrate, compile a remap order for the
|
|
309
|
-
scope-architect (sole writer of scope contracts):
|
|
310
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" --operation remap --slug <slug>
|
|
311
|
-
--worker scope-architect --payload '{"discovered_ledger": ".shapeup/<slug>/discovery/ledger.md"}'
|
|
312
|
-
dispatch + ingest — it may extend a scope or propose a new one; it never silently widens a
|
|
313
|
-
substrate. Route back to GATE L1b for the delta before resuming.
|
|
314
|
-
```
|
|
315
|
-
Record per attempt in `harness-run.md` (LOCAL): scope_id, attempt, t0 overall, files touched.
|
|
316
|
-
Record per scope in the committed `round-ledger.md` (SHARED, Tier A) the moment it settles:
|
|
317
|
-
final hill phase this round + any ESCALATE decisions (design spec addendum F.3 — a decision
|
|
318
|
-
made must survive a crash, so it is promoted immediately, not batched to round close).
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## GATE L2 — Build Round Complete
|
|
323
|
-
|
|
324
|
-
**Purpose:** The single most important gate — it is the **only** thing that unlocks the
|
|
325
|
-
evaluator. No evaluation runs while any task is unbuilt.
|
|
326
|
-
|
|
327
|
-
> **Runtime-enforced (not honor-system).** A `PreToolUse` hook (`hooks/gate-l2.mjs`) hard-blocks
|
|
328
|
-
> the once-per-round EVAL delegation (`spec-evaluator --single-pass`/`--feature`, no `--task`) when
|
|
329
|
-
> `tasks/_index.md` is not fully green — the deny message names the unfinished tasks. You still emit
|
|
330
|
-
> the gate block below for the PO; the hook is the backstop that makes "never EVAL on a partial
|
|
331
|
-
> board" a precondition the model cannot talk past. Per-task evals (`--task`) are intentionally not
|
|
332
|
-
> gated.
|
|
333
|
-
|
|
334
|
-
```
|
|
335
|
-
L2.1 Read tasks/_index.md. Assert: every task status = done (board fully green).
|
|
336
|
-
→ If any task is ready/in-progress/blocked: BUILD is not complete. Return to BUILD.
|
|
337
|
-
Never proceed to EVAL on a partial board — the L2 hook only WARNS now (ADR-0001).
|
|
338
|
-
L2.2 Tech-lead judgment call (surface, default = run eval):
|
|
339
|
-
Is this feature within what the model builds reliably solo (trivial CRUD, tiny scope)?
|
|
340
|
-
If clearly yes, offer to SKIP evaluation this run (--no-eval) — the evaluator is not a
|
|
341
|
-
fixed yes/no; it earns its cost when work sits beyond easy solo capability.
|
|
342
|
-
Default: run the single eval pass.
|
|
343
|
-
L2.3 T0 completeness pre-check (scope contracts only — avoids a wasted EVAL dispatch that
|
|
344
|
-
spec-evaluator's own GATE V0.7 would hard-stop anyway): every scope reaching this round
|
|
345
|
-
boundary as DOWNHILL_EXECUTION or FINISHED must have a t0/verdicts/r<N>-*.json with
|
|
346
|
-
overall=green. A scope only present as a hammer PROPOSAL (attempt_budget exhausted) is
|
|
347
|
-
fine — it's not claiming done, it's queued for GATE H.
|
|
348
|
-
L2.4 Hill derivation (mechanical facts only, DD-10 — scope contracts only; falls back to the
|
|
349
|
-
open-unknowns heuristic in references/ledger-schema.md "Hill report" when no contracts
|
|
350
|
-
exist). Per scope, from this round's t0 artifact + the latest spec-evaluator verdict +
|
|
351
|
-
seesaw result — never self-reported by any worker:
|
|
352
|
-
UPHILL_UNKNOWN open_unknowns > 0 in the ledger for this scope
|
|
353
|
-
UPHILL_SOLVED unknowns = 0, no T0-green attempt recorded yet this run
|
|
354
|
-
DOWNHILL_EXECUTION ≥1 T0-green attempt; T1 PASS or seesaw still pending
|
|
355
|
-
FINISHED T1 PASS AND seesaw green AND merged to main
|
|
356
|
-
Write/update hill/<scope-id>.yml (committed shard, single-writer = whoever holds that
|
|
357
|
-
scope's branch — addendum Δ2) and regenerate hill-chart.md from all shards.
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
**GATE L2 Output:**
|
|
361
|
-
```
|
|
362
|
-
⏸ GATE L2 — Build Round [r] Complete
|
|
363
|
-
Board : [N]/[N] tasks ✅
|
|
364
|
-
T0 : [n/a | [k]/[k] touched scopes T0-green]
|
|
365
|
-
Ready to EVAL: yes
|
|
366
|
-
Eval plan : spec-evaluator --feature [slug] --single-pass (dims: [spec-conformance])
|
|
367
|
-
```
|
|
368
|
-
Emit this block, then **stop and wait for PO confirmation** (interactive/--auto) before delegating to spec-evaluator. This is the PO's last chance to cut scope or skip eval (`--no-eval`) before the evaluator runs — make that explicit. Under --unattended, proceed.
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## EVAL round r — delegate to spec-evaluator (ONCE)
|
|
373
|
-
|
|
374
|
-
```
|
|
375
|
-
Compile the eval order (pins spec folder, feature, dimensions, run command, T0 artifacts):
|
|
376
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" --operation evaluate --slug <slug>
|
|
377
|
-
--worker spec-evaluator --round <r>
|
|
378
|
-
--payload '{"dimensions": ["spec-conformance"], "run_cmd": "<cmd>",
|
|
379
|
-
"t0_artifacts": [<per-scope t0/verdicts paths from GATE L2.3>]}'
|
|
380
|
-
Invoke via Agent (model: eval — see references/delegation.md "Invocation mechanism") ONE
|
|
381
|
-
feature-level pass over the whole running app:
|
|
382
|
-
Skill(shapeup-sdlc-plugin:spec-evaluator) --order <path>
|
|
383
|
-
(the legacy `--spec <path> --feature <slug> --single-pass` form still works standalone;
|
|
384
|
-
the GATE L2 hook gates both shapes)
|
|
385
|
-
The evaluator exercises the running feature against ALL acceptance criteria + Done-when,
|
|
386
|
-
writes ONE evaluation/EVAL-FEATURE-<slug>.md (verdict + bug list) + its WorkResult. Then
|
|
387
|
-
ingest: node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ingest-result.mjs" .shapeup/<slug>/results/evaluate-r<r>.json
|
|
388
|
-
— ingest appends the verdict ledger lines and un-ticks refuted AC boxes; the judge itself
|
|
389
|
-
never touches the board and never sets status: done.
|
|
390
|
-
Record in ledger: eval duration, verdict, bug count.
|
|
391
|
-
```
|
|
392
|
-
This is the single point where the evaluator runs in a round. It is not called per task,
|
|
393
|
-
not called inside the BUILD loop, not called before GATE L2.
|
|
394
|
-
|
|
395
|
-
---
|
|
396
|
-
|
|
397
|
-
## GATE L3 — Verdict & Loop
|
|
398
|
-
|
|
399
|
-
Render the 🗻 Hill report (slice-level, never a task count) + read the EVAL verdict. PASS → first PASS (unless `--no-qa`) delegates the QA Edge Hunt then SHIP; subsequent PASS runs `--recheck` on promoted items then SHIP. FAIL → print bugs by task/severity (name scope, never prescribe fixes), ask ≤1 to approve a bug-only BUILD r+1, stop + escalate if r+1 > max_rounds. Emit the `⏸ GATE L3` block.
|
|
400
|
-
→ **Playbook (PASS/FAIL scripts + gate-output block):** `references/gates.md` — GATE L3.
|
|
401
|
-
|
|
402
|
-
---
|
|
403
|
-
|
|
404
|
-
## SHIP (step 11) — close out
|
|
405
|
-
|
|
406
|
-
S.0 GATE H is delegated to `scope-hammer` (Shape Up's "Decide When to Stop") — census, baseline comparison, cut list + verdict; the tech lead records the PO decision and performs the close, never ships on its own. Then confirm board green + PASS, assert checklist hygiene, print the summary (incl. dims NOT evaluated), never auto-deploy, harvest one facts-only metrics row.
|
|
407
|
-
→ **Playbook (S.0–S.6):** `references/gates.md` — SHIP.
|
|
408
|
-
|
|
409
|
-
---
|
|
410
|
-
|
|
411
|
-
## GATE L4 — Ship Sign-Off
|
|
412
|
-
|
|
413
|
-
FIRST freeze the evidence — run state is gitignored, so `shapeup/<slug>/REPORT.md` is all a teammate sees: `node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ship-report.mjs" --slug <slug>` (derived from artifacts, never from your summary). Then emit the `⏸ GATE L4` sign-off block (feature state, rounds, verdict + dims not evaluated, QA status, ledger), ask ≤1; substantive PO feedback → auto-delegate `coach` (its own GATE COACH-1); then output the final `✅ [slug] …` line.
|
|
414
|
-
→ **Playbook (sign-off block + coach hand-off):** `references/gates.md` — GATE L4.
|
|
415
|
-
|
|
416
|
-
---
|
|
125
|
+
> **State ownership, the central domain registry, two-ledger split** → `references/state-model.md`
|
|
126
|
+
> **Hard rules this design enforces, and why** → `references/hard-rules.md`
|
|
127
|
+
> **Full invocation examples + the complete flag table** → `references/invocation.md`
|
|
128
|
+
> **The small-change lane (`--tiny`)** → `references/tiny-lane.md`
|
|
417
129
|
|
|
418
130
|
## Invocation
|
|
419
131
|
|
|
420
|
-
`/tech-lead --pitch <shaping.md> --spec <spec/> --lens standard` for an interactive run; `--auto`
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
---
|
|
426
|
-
|
|
427
|
-
## Hard Rules (never override without explicit user instruction)
|
|
428
|
-
|
|
429
|
-
| Rule | Rationale |
|
|
430
|
-
|------|-----------|
|
|
431
|
-
| Orchestrates Building only (steps 7–11); shaping/betting/kick-off are PO-personal, upstream | Intake is a kicked-off pitch, not a raw idea — the tech lead does no shaping/planning-authority work |
|
|
432
|
-
| ORIENT (step 7) runs before MAP SCOPES (step 8) | Roadmap: no pre-divided tasks at kick-off; the team orients first so the board is reality-born |
|
|
433
|
-
| Intake must be English before ORIENT; tech lead does NOT translate — it delegates to `translator` at GATE L0 | Translation is a separate single-purpose skill; orchestrator only detects + sequences |
|
|
434
|
-
| Tech lead is the SOLE WRITER of run-state (`harness-run.md`); workers get run metadata as args | Stateless workers, one stateful orchestrator — don't fragment run-state across worker files; protects `--from` resume |
|
|
435
|
-
| Every worker dispatch goes through the envelope port: compile-order → `--order` → ingest-result; shared state is written ONLY by ingest | The single-writer rule is mechanically true (D6 closed): a worker that writes boards/ledgers/run-state is a defect, and a malformed envelope is denied by the validate-envelope hook before it can corrupt run truth |
|
|
436
|
-
| Progress is reported by Hill position, never by counting tasks | The roadmap forbids task-counting; a 90%-done slice can still be stuck uphill on the one unknown that matters |
|
|
437
|
-
| Discovered tasks are reconciled and reviewed | Discoveries land in the ledger via ingest; dispatch a reconcile order (ba-pitch-analyzer) and route back to GATE L1b; do not ignore them |
|
|
438
|
-
| Evaluator runs once per round, only after GATE L2 (board 100% done) | The whole point: cheap end-of-round QA, never per task |
|
|
439
|
-
| Evaluator never called inside the BUILD loop | Keeps the build coherent and the run cheap |
|
|
440
|
-
| r>1 builds bugs only, never the whole board | Don't re-do passing work; minimize churn |
|
|
441
|
-
| Stop at max_rounds; escalate honestly | No infinite fix loops; the PO decides next |
|
|
442
|
-
| Tech lead delegates, never reimplements a sub-skill | Stays thin; each skill keeps its own gates and authority |
|
|
443
|
-
| Every delegation to a sub-skill (except the mechanical `t0-verify.mjs`) goes through the `Agent` tool on the L0.8-resolved model, never a direct `Skill` call from the tech lead's own turn | A direct `Skill` call runs inline on the orchestrator's own model — it silently drops the model matrix (nothing left to route) and the zero-memory-handoff isolation task-executor's isolated attempt loop already assumes; see references/delegation.md "Invocation mechanism" |
|
|
444
|
-
| Planner stays high-level on tech | Spec errors cascade into every build round |
|
|
445
|
-
| Never auto-deploy; "shipped" never silently means "deployed" | Deploy is outward-facing, PO-gated; record "deploy pending (PO)" otherwise |
|
|
446
|
-
| "Shipped" names the dims NOT evaluated | Prevents reading a spec-only PASS as fully verified |
|
|
447
|
-
| Every gate emits the canonical `⏸ GATE LN — Title` block before any narrative | Conversational output is not a gate; the block is the handoff contract |
|
|
448
|
-
| In interactive/--auto: emit the gate block, then stop and wait for PO confirmation | Never auto-proceed past a gate; the PO must cross each threshold explicitly |
|
|
449
|
-
| At GATE L3 FAIL: name scope (task + failed criterion), never prescribe fix options | Root cause analysis and fix paths belong to the implementer, not the orchestrator |
|
|
450
|
-
| Max questions per gate: L0/L1a/L1b = 2; L3/L4 = 1 | Gates are pauses, not interrogations; excess questions shift authority to the wrong role |
|
|
451
|
-
| SHIP harvest records facts only — copies existing structured output, never computes a new verdict/score | A self-computed score = a second judge behind spec-evaluator (breaks single-judge, invites Goodhart); the eval suite interprets, harvest records |
|
|
452
|
-
| Three-level circuit breaker: attempt_budget (inner, per scope) nests inside round_budget (outer), with an opt-in wall_clock_budget_s deadline | An exhausted scope queues a GATE H hammer proposal, it never blocks the round; only round_budget hitting 0 stops the whole run; the deadline breaker routes to GATE H so a run out of clock still ships what is green instead of being killed from outside |
|
|
453
|
-
| The tech lead never hand-edits a scope contract | scope-architect is its sole writer (single-writer-per-file, addendum C4); a substrate-expansion is routed through advisor-protocol → a scope-architect remap order |
|
|
454
|
-
| Substrate-disjointness + PA1/PA2 lints are re-asserted at GATE L1b (spec-lint.mjs) even when scope-architect already checked them | A human may have hand-approved past a 🔴 at the architect's checkpoint; the orchestrator's own gate is the last line before BUILD starts writing |
|
|
455
|
-
| Hill phase is read from mechanical facts (T0/T1/seesaw), never declared by a worker | DD-10 — closes the self-reported-confidence risk (R3) outright |
|
|
456
|
-
| ESCALATE answers promote to the committed round-ledger the instant they're given | Zero-memory handoff means a decision kept only in a session vanishes with the next attempt's fresh context |
|
|
457
|
-
| GATE H is delegated to scope-hammer, never adjudicated inline by the tech lead | Keeps the orchestrator thin; census/baseline-comparison/cut-list logic has one owner |
|
|
458
|
-
| GATE L1b reviews the SHARED plan (usecases/scopes), never the LOCAL task board; a missing local board is bootstrapped via a generate-board order, never treated as a blocker | `tasks/` is a LOCAL, gitignored, regenerable execution-planning artifact (v3.2) — the PO gate and grading both moved to the committed spec it was derived from |
|
|
459
|
-
|
|
132
|
+
`/tech-lead --pitch <shaping.md> --spec <spec/> --lens standard` for an interactive run; `--auto`
|
|
133
|
+
(pause only at L1a/L1b/L3/L4), `--unattended` (headless/CI), `--from build` (resume), `--no-eval`/
|
|
134
|
+
`--no-qa` to skip passes. **`--tiny`** stays a prose-only lane (`references/tiny-lane.md`) —
|
|
135
|
+
`shapeup-run.js` targets specs with committed scope contracts; a tiny change or a pre-scope-
|
|
136
|
+
contract spec runs the unchanged v0.2.6 flow this file's Hard Rules already describe.
|