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,459 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tech-lead
|
|
3
|
+
description: "Use this skill whenever the user wants to orchestrate a whole feature end-to-end across the harness skills — ba-pitch-analyzer (planner), task-executor (generator), spec-evaluator (judge) — acting as the tech lead that owns the run and reports to the PO at round boundaries. Trigger on: \"run the full harness\", \"act as tech lead\", \"ship this feature end to end\", \"from pitch to ship\", \"orchestrate the build\", \"plan build evaluate\". Use it even when the user describes a multi-step build flow without naming the skills."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tech Lead (harness orchestrator)
|
|
7
|
+
|
|
8
|
+
## ▶ RUN THIS FIRST — do not summarise this file
|
|
9
|
+
|
|
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: on the SDD harness benchmark a session that
|
|
12
|
+
described this pipeline instead of executing it scored 29% with 10 escaped defects while reading
|
|
13
|
+
like a clean success (Haiku 4.5, n=5, zero variance). A `Stop` hook (`hooks/gate-zerowork.mjs`)
|
|
14
|
+
now blocks any session that dispatches this skill and leaves no run receipt, so a description is
|
|
15
|
+
not an ending you can reach. Loading these instructions is not running them.
|
|
16
|
+
|
|
17
|
+
**Step 1 — open the run.** Right now, before any prose. **Write the requirement to a file first,
|
|
18
|
+
then pass the path** — a multi-line requirement inlined into a shell argument is where this step
|
|
19
|
+
goes wrong, and it is the difference between a run that starts and a run that fights its own
|
|
20
|
+
quoting for six turns (measured):
|
|
21
|
+
|
|
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
|
+
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> \
|
|
28
|
+
--auto-level <interactive|auto|unattended> \
|
|
29
|
+
[--gate-answers <ci|guarded|path.json>] [--wall-clock-budget <seconds>] [--max-rounds 3] [--tiny]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`--intake-text "<text>"` also works and is fine for a one-line request. Piping works too:
|
|
33
|
+
`cat spec.md | node .../init-run.mjs --slug x --intake-stdin …`.
|
|
34
|
+
|
|
35
|
+
This writes `.shapeup/<slug>/{receipt.json,intake.md,harness-run.md}` and `active-scope`.
|
|
36
|
+
It is the mechanical fact that the run started — every downstream guard reads it.
|
|
37
|
+
|
|
38
|
+
**Step 1c — EXIT 3 MEANS A RUN IS ALREADY OPEN. Resume it; do not re-open it and do not restart
|
|
39
|
+
the pipeline.** The refusal prints the run's real state (`RESUME STATE`: slug, status, round,
|
|
40
|
+
attempt, board counts, dispatched-not-ingested orders), derived from files. Read `status` and
|
|
41
|
+
continue from that phase — `orienting` → L1a, `mapping` → L1b, `building` → L2, `evaluating` → L3 —
|
|
42
|
+
re-reading `harness-run.md` and the board first, and never re-dispatching an order that already has
|
|
43
|
+
a result. **You will most often meet this in a fresh session with no memory of the run**, which is
|
|
44
|
+
also when re-running intake and rebuilding the spec tree looks like the obvious thing to do; it is
|
|
45
|
+
the measured cause of a handoff that spent 82–120 turns before its first write and recovered
|
|
46
|
+
nothing. `--force` re-opens deliberately and discards the round history the breaker counts.
|
|
47
|
+
|
|
48
|
+
**If this command comes back "requires approval", stop and say so.** The harness's scripts ship
|
|
49
|
+
with the plugin, so they live outside your project and need a one-time permission grant
|
|
50
|
+
(`npx shapeup-sdlc init` writes it; it is `permissions.allow` in `.claude/settings.json`). Do not
|
|
51
|
+
route around it with wrapper scripts or sub-agents, and do not silently hand-build the feature
|
|
52
|
+
instead — an unrunnable harness is a real answer, and a feature built outside the harness with no
|
|
53
|
+
board, no T0 and no verdict is exactly the un-evidenced "done" this whole project exists to stop.
|
|
54
|
+
|
|
55
|
+
**Step 1b — honour the lane the receipt gives you.** `init-run.mjs` computes it (GATE L0.3,
|
|
56
|
+
`fit-check.mjs`) and prints it as `config.fit.lane`. `tiny` → orient (light) → single-task board →
|
|
57
|
+
build → T0 → ⏸ L4; skip WIRE, scope contracts, spec tree, EVAL and QA. **Do not talk yourself into
|
|
58
|
+
the full lane on a change the fit-check called tiny** — that is the measured cause of a benchmark
|
|
59
|
+
feature that never once finished across four attempts: a three-file change run through eleven
|
|
60
|
+
gates. The check is advisory (fitted on three features) and the PO may override with `--lane`, but
|
|
61
|
+
*you* do not override it.
|
|
62
|
+
|
|
63
|
+
**Step 2 — resolve the gate, don't reason about permission.** At every ⏸ gate, emit the gate
|
|
64
|
+
block, then run:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/gate-answers.mjs" \
|
|
68
|
+
--resolve <L0|L1a|L1a.5|L1b|L2|L3|QA|H|L4|COACH-1> [--preset ci|--file <path>] [--slug <slug>]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Exit `0` → cross the gate and append the returned `ledger_row` to the Decisions log.
|
|
72
|
+
Exit `4` → **stop and put the block to the PO.** Exit `5` → abort, quoting the reason.
|
|
73
|
+
Never infer sign-off from prose in the prompt — under `--unattended`/`--auto`, sign-off comes
|
|
74
|
+
from the answer set, and if there is no answer set, `--preset ci` / `--preset guarded` is the lane.
|
|
75
|
+
|
|
76
|
+
**Step 3 — walk the pipeline**, in this order, delegating each step:
|
|
77
|
+
`ORIENT → WIRE → MAP SCOPES → BUILD (compile-order → task-executor → ingest-result) → EVAL → QA → SHIP`.
|
|
78
|
+
Each step is a delegation with an envelope, not a paragraph about a delegation.
|
|
79
|
+
|
|
80
|
+
**Never do:** print the gate list and stop · promise what the harness "will" do · report a phase
|
|
81
|
+
complete without the artifact it produces · cross a gate on your own authority.
|
|
82
|
+
|
|
83
|
+
> The rest of this file is reference for those steps. Read the section you need when you reach it.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
The conductor over the build-phase skills. It does not orient, plan, build, or judge itself —
|
|
88
|
+
it **sequences** the skills that do and puts decisions to the PO at gates.
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
orient (scout) → ba-pitch-analyzer (planner) → task-executor (generator) → spec-evaluator (judge)
|
|
92
|
+
ORIENT (7) MAP SCOPES (8) BUILD (9, loop) EVALUATE (once)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Scope boundary.** Owns the Shape Up **Building phase (steps 7–11)** only. Shaping (1–4),
|
|
96
|
+
Betting (5) and Kick-off (6) are PO-personal and upstream: intake is a *kicked-off pitch*, never
|
|
97
|
+
a raw idea (D0/D1). **Orient runs before Map Scopes**, so `ba`'s board is reality-born from the
|
|
98
|
+
Scout's code-surface map rather than imagined at kick-off.
|
|
99
|
+
|
|
100
|
+
**The load-bearing rule — why this skill exists.** The evaluator runs **exactly once per build
|
|
101
|
+
round, only after the board is 100% done.** Never per task. The tech lead is the only component
|
|
102
|
+
that can enforce this timing, because no sub-skill sees the whole board.
|
|
103
|
+
|
|
104
|
+
**Three invariants at every gate:**
|
|
105
|
+
|
|
106
|
+
1. **Gate block first.** Every gate emits the canonical `⏸ GATE LN — Title` block before any narrative. Conversational output without the block is not a gate — it's a note.
|
|
107
|
+
2. **Resolve, then cross.** Every crossing comes from `gate-answers.mjs` (see RUN THIS FIRST, step 2): exit 0 crosses and yields the ledger row, exit 4 stops for the PO, exit 5 aborts. Never cross on your own authority, and never read sign-off out of prose in the prompt.
|
|
108
|
+
3. **Thin at L3 FAIL.** When listing bugs, name the scope (task ID + failed Done-when criterion). Do NOT prescribe fixes or root-cause hypotheses — that belongs to the implementer. The tech lead routes, it does not diagnose.
|
|
109
|
+
|
|
110
|
+
> **Round loop, stop conditions, r=1 vs r>1 semantics** → `references/round-protocol.md`
|
|
111
|
+
> **How each sub-skill is invoked + handoff files** → `references/delegation.md`
|
|
112
|
+
> **Run ledger format + Hill report** → `references/ledger-schema.md`
|
|
113
|
+
> **State ownership, run receipt, domain registry, two-ledger split** → `references/state-model.md`
|
|
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
|
+
---
|
|
417
|
+
|
|
418
|
+
## Invocation
|
|
419
|
+
|
|
420
|
+
`/tech-lead --pitch <shaping.md> --spec <spec/> --lens standard` for an interactive run; `--auto` (pause only at L1a/L1b/L3/L4), `--unattended` (headless/CI), `--from build` (resume), `--no-eval`/`--no-qa` to skip passes.
|
|
421
|
+
|
|
422
|
+
**`--tiny`** — small-change lane: `⏸ L0 fit-check → orient (light) → build → T0 → ⏸ L4`. Ceremony scales down (WIRE/contracts/spec-tree/EVAL/QA/retro skipped); the floor does not (envelope dispatch + T0 + `lane: tiny` ledger row). Fit-check mandatory; outgrown mid-build ⇒ STOP, escalate. → `references/tiny-lane.md`.
|
|
423
|
+
→ **Full invocation examples + the complete flag table:** `references/invocation.md`.
|
|
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
|
+
|