shapeup-sdlc 1.6.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.example.json +5 -5
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +54 -107
- package/README.md +165 -151
- package/SECURITY.md +49 -27
- package/bin/init.mjs +93 -108
- package/bin/lib/grant.mjs +145 -0
- package/commands/build.md +20 -0
- package/commands/eval.md +5 -4
- package/commands/scopes.md +5 -4
- package/commands/shape.md +1 -1
- package/commands/ship.md +53 -7
- package/commands/wire.md +1 -1
- package/hooks/dispatch-receipt.mjs +195 -0
- package/hooks/gate-intake.mjs +16 -17
- package/hooks/gate-zerowork.mjs +107 -25
- package/hooks/hooks.json +9 -48
- package/hooks/lib/decision.mjs +38 -19
- package/hooks/safety-spine.mjs +4 -4
- package/hooks/sandbox-guard.mjs +130 -50
- package/{skills/tech-lead/scripts/compile-order.mjs → kernel/compile.mjs} +344 -55
- package/{skills/tech-lead/scripts/gate-answers.mjs → kernel/gate.mjs} +69 -26
- package/kernel/harness.mjs +134 -0
- package/{skills/tech-lead/scripts/fit-check.mjs → kernel/init/fit.mjs} +25 -22
- package/kernel/init/run.mjs +489 -0
- package/{skills/tech-lead/scripts → kernel}/lib/argv.mjs +52 -31
- package/{skills/tech-lead/scripts/lib/contract-md.mjs → kernel/lib/contract.mjs} +261 -17
- package/kernel/lib/paths.mjs +491 -0
- package/kernel/probe/concurrency.mjs +510 -0
- package/{skills/tech-lead/scripts/aegis-digest.mjs → kernel/probe/digest.mjs} +10 -11
- package/kernel/probe/eval.mjs +77 -0
- package/kernel/probe/leg.mjs +125 -0
- package/kernel/probe/resume.mjs +528 -0
- package/{skills/tech-lead/scripts → kernel/probe}/stats.mjs +102 -21
- package/kernel/probe/t0.mjs +66 -0
- package/{skills/ba-pitch-analyzer/scripts/board-derive.mjs → kernel/reduce/board.mjs} +104 -28
- package/kernel/reduce/graph.mjs +437 -0
- package/kernel/reduce/hill.mjs +152 -0
- package/kernel/reduce/ingest.mjs +633 -0
- package/{hooks/slop-cleaner.mjs → kernel/reduce/leftovers.mjs} +40 -57
- package/{skills/tech-lead/scripts/ship-report.mjs → kernel/reduce/ship.mjs} +93 -14
- package/{skills/tech-lead/scripts/run-snapshot.mjs → kernel/reduce/snapshot.mjs} +22 -21
- package/{skills/spec-evaluator/scripts/verdict-ledger.mjs → kernel/reduce/verdict.mjs} +14 -8
- package/kernel/report/export.mjs +325 -0
- package/kernel/report/facts.mjs +347 -0
- package/{skills/tech-lead/scripts/budget-check.mjs → kernel/verify/budget.mjs} +22 -25
- package/kernel/verify/dispatch.mjs +114 -0
- package/{skills/tech-lead/scripts/validate-envelope.mjs → kernel/verify/envelope.mjs} +20 -15
- package/{skills/tech-lead/scripts/lib → kernel/verify}/ratchet-tree.mjs +36 -14
- package/kernel/verify/skills.mjs +125 -0
- package/kernel/verify/spec.mjs +559 -0
- package/{skills/tech-lead/scripts/t0-verify.mjs → kernel/verify/t0.mjs} +138 -28
- package/{skills/tech-lead/scripts/trace-lint.mjs → kernel/verify/trace.mjs} +28 -13
- package/oracles/_shared.mjs +1 -1
- package/oracles/http-oracle.mjs +2 -2
- package/oracles/index.mjs +1 -1
- package/oracles/process-oracle.mjs +2 -2
- package/oracles/snapshot-oracle.mjs +2 -2
- package/oracles/test-oracle.mjs +2 -2
- package/package.json +11 -13
- package/skills/ba-pitch-analyzer/SKILL.md +24 -19
- package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +1 -1
- package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +12 -7
- package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +6 -3
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +5 -4
- package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +23 -13
- package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +17 -12
- package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +17 -38
- package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +3 -0
- package/skills/ba-pitch-analyzer/references/contract-patterns.md +8 -4
- package/skills/ba-pitch-analyzer/references/doc-schemas.md +3 -1
- package/skills/ba-pitch-analyzer/references/task-generation.md +8 -8
- package/skills/ba-pitch-analyzer/references/test-surface.md +1 -1
- package/skills/coach/SKILL.md +3 -3
- package/skills/orient/SKILL.md +2 -1
- package/skills/qa-edge-hunter/SKILL.md +15 -41
- package/skills/scope-architect/SKILL.md +57 -18
- 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 +37 -15
- package/skills/spec-evaluator/SKILL.md +24 -7
- 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/task-executor/SKILL.md +32 -18
- package/skills/tech-lead/SKILL.md +127 -438
- package/skills/tech-lead/references/gates.md +140 -49
- package/skills/tech-lead/references/protocol.md +832 -0
- package/skills/tech-lead/schemas/domain.schema.json +645 -198
- package/skills/tech-lead/schemas/gate-answers.schema.json +2 -2
- package/skills/tech-lead/schemas/work-order.schema.json +11 -2
- package/skills/tech-lead/schemas/work-result.schema.json +56 -18
- package/skills/tech-lead/workflows/shapeup-run.js +1474 -0
- package/skills/translator/SKILL.md +2 -2
- package/hooks/anti-rationalization.mjs +0 -244
- package/hooks/compact-snapshot.mjs +0 -47
- package/hooks/gate-deadline.mjs +0 -151
- package/hooks/gate-l2.mjs +0 -161
- package/hooks/session-rehydrate.mjs +0 -109
- package/skills/advisor-protocol/SKILL.md +0 -171
- package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +0 -239
- package/skills/spec-evaluator/README.md +0 -93
- package/skills/tech-lead/README.md +0 -71
- package/skills/tech-lead/references/delegation.md +0 -254
- package/skills/tech-lead/references/invocation.md +0 -45
- package/skills/tech-lead/references/ledger-schema.md +0 -214
- package/skills/tech-lead/references/round-protocol.md +0 -184
- package/skills/tech-lead/references/state-model.md +0 -66
- package/skills/tech-lead/scripts/ingest-result.mjs +0 -270
- package/skills/tech-lead/scripts/init-run.mjs +0 -326
- package/skills/tech-lead/scripts/lib/is-main.mjs +0 -82
- package/skills/tech-lead/scripts/lib/paths.mjs +0 -278
- package/skills/translator/README.md +0 -66
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# tech-lead
|
|
2
|
-
|
|
3
|
-
The orchestrator over the harness. Acts as the tech lead that runs a feature end-to-end
|
|
4
|
-
across three skills, makes round decisions, and reports to the PO at gates. It is **thin** —
|
|
5
|
-
it sequences and decides, it does not plan, build, or judge itself.
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
ba-pitch-analyzer (planner) → task-executor (generator) → spec-evaluator (judge)
|
|
9
|
-
PLAN BUILD (loop all tasks) EVALUATE (once / round)
|
|
10
|
-
▲ │
|
|
11
|
-
└──── bugs, round r+1 ◄────────┘ on FAIL
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
**Core rule:** the evaluator runs exactly once per build round, only after the task board
|
|
15
|
-
is 100% done — never per task. That single end-of-round QA pass is the long-running harness
|
|
16
|
-
V2 lesson, and enforcing its timing is the reason this skill exists.
|
|
17
|
-
|
|
18
|
-
## Resource map
|
|
19
|
-
```
|
|
20
|
-
tech-lead/
|
|
21
|
-
├── SKILL.md # entry — GATE L0–L4, the round loop, flags, hard rules
|
|
22
|
-
├── README.md # this file
|
|
23
|
-
└── references/
|
|
24
|
-
├── round-protocol.md # ★ the loop: r=1 vs r>1, stop conditions, eval timing rule
|
|
25
|
-
├── delegation.md # how each of the 3 sub-skills is invoked + handoff files
|
|
26
|
-
└── ledger-schema.md # harness-run.md — the round table / decisions / escalation
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
| Resource | Loaded at | Purpose |
|
|
30
|
-
|----------|-----------|---------|
|
|
31
|
-
| `SKILL.md` | always | L-gates, phase sequence, invocation, authority rules |
|
|
32
|
-
| `references/round-protocol.md` | BUILD/EVAL | the loop semantics + the "eval once at end" rule |
|
|
33
|
-
| `references/delegation.md` | each phase | exact sub-skill commands + which handoff files to read |
|
|
34
|
-
| `references/ledger-schema.md` | throughout | the run ledger that carries state across rounds/sessions |
|
|
35
|
-
|
|
36
|
-
## Install
|
|
37
|
-
```bash
|
|
38
|
-
cp -r tech-lead <repo>/.claude/skills/ # or ~/.claude/skills/
|
|
39
|
-
```
|
|
40
|
-
Requires the harness skills installed: `ba-pitch-analyzer`, `task-executor`,
|
|
41
|
-
`spec-evaluator`, plus `translator` (the GATE L0 language gate for non-English intake).
|
|
42
|
-
The EVAL phase uses spec-evaluator's feature-level pass
|
|
43
|
-
(`--feature <slug>`) — see the dependency note in `references/delegation.md`.
|
|
44
|
-
|
|
45
|
-
## Invoke
|
|
46
|
-
```bash
|
|
47
|
-
/tech-lead --pitch shapeup/checkout/shaping/shaping.md --spec shapeup/checkout/spec/ --lens standard
|
|
48
|
-
/tech-lead --pitch ... --spec ... --auto # sub-skills unattended; pause at L1/L3/L4
|
|
49
|
-
/tech-lead --pitch ... --spec ... --unattended --max-rounds 3 # headless / CI (Agent SDK)
|
|
50
|
-
/tech-lead --spec shapeup/checkout/spec/ --from build # resume an existing run
|
|
51
|
-
/tech-lead --pitch ... --spec ... --no-eval # skip eval for a trivial feature
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Gate map
|
|
55
|
-
| Gate | When | Decision |
|
|
56
|
-
|------|------|----------|
|
|
57
|
-
| L0 | intake | language gate (`/translator --check`, translate if non-English) + run config: spec folder, lens, dims, max_rounds, auto level |
|
|
58
|
-
| L1a | after ORIENT | PO reviews the spiked area + 🗻 Hill unknowns before mapping scopes |
|
|
59
|
-
| L1b | after MAP SCOPES | PO accepts the task board (appetite guard) before any code |
|
|
60
|
-
| L2 | after BUILD round | board 100% done? → the single EVAL pass (hook warns if not; advisory) |
|
|
61
|
-
| L3 | after EVAL | PASS → /qa-edge-hunter pass → ship; FAIL → bug-only round r+1; max_rounds → escalate |
|
|
62
|
-
| L4 | after SHIP | PO sign-off, close the ledger, harvest metrics to metrics.jsonl |
|
|
63
|
-
|
|
64
|
-
## Auto levels
|
|
65
|
-
- **interactive** (default): pause at every L-gate; sub-skills keep their own gates.
|
|
66
|
-
- **--auto**: sub-skills run unattended; tech lead still pauses at L1a / L1b / L3 / L4.
|
|
67
|
-
- **--unattended**: auto-confirm all L-gates; stop only on PASS, max_rounds, or hard error.
|
|
68
|
-
This is the headless mode for an Agent SDK / CI driver.
|
|
69
|
-
|
|
70
|
-
## Version
|
|
71
|
-
0.10 — Two-root workspace split (`shapeup/` vs `.shapeup/`), automated discovered-task reconciliation (`/ba-pitch-analyzer --tasks-only --from-discovered`), regression rule (touched UCs re-run), QA edge-hunter wiring (exploratory findings, triage at SHIP S.0), metrics harvest, and split L1a/L1b gates.
|
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
# Delegation
|
|
2
|
-
|
|
3
|
-
The tech lead invokes the build-phase skills and reads their handoff files. It never
|
|
4
|
-
reimplements their logic. Each sub-skill keeps its own gates; pass `--auto` to a sub-skill
|
|
5
|
-
only when the run's auto level is `--auto` or `--unattended`.
|
|
6
|
-
|
|
7
|
-
## Invocation mechanism — Agent, not Skill
|
|
8
|
-
|
|
9
|
-
Every "Invoke:" line below means: call the **Agent** tool — a real subagent, on its own
|
|
10
|
-
context and (where a role is named) its own model — whose prompt tells it to run
|
|
11
|
-
`Skill(shapeup-sdlc-plugin:<name>)` with the given args and report back the artifacts. It does
|
|
12
|
-
**not** mean the tech lead calls the `Skill` tool itself. A direct `Skill` call executes
|
|
13
|
-
inline, in the tech lead's own turn, on the tech lead's own model — that silently drops GATE
|
|
14
|
-
L0.8's model matrix (there is no per-role model left to route once the call is inline) and
|
|
15
|
-
breaks the isolation the zero-memory-handoff design (`round-protocol.md`, the compiled
|
|
16
|
-
WorkOrder in `orders/r<N>-a<M>.json`) already assumes every worker below has.
|
|
17
|
-
|
|
18
|
-
Standard shape (pure-skill architecture v1.0 — the envelope port):
|
|
19
|
-
```
|
|
20
|
-
1. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/compile-order.mjs" <mode flags> # → orders/<id>.json
|
|
21
|
-
2. Agent({
|
|
22
|
-
description: "<short task description>",
|
|
23
|
-
subagent_type: "general-purpose",
|
|
24
|
-
model: "<role model resolved at GATE L0.8>",
|
|
25
|
-
prompt: "Call Skill(shapeup-sdlc-plugin:<skill>) --order <orders/<id>.json>.
|
|
26
|
-
Report back: the WorkResult path (.shapeup/<slug>/results/<id>.json)."
|
|
27
|
-
})
|
|
28
|
-
3. node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/ingest-result.mjs" .shapeup/<slug>/results/<id>.json
|
|
29
|
-
```
|
|
30
|
-
The WorkOrder carries everything the worker may rely on (payload, decisions, digested errors,
|
|
31
|
-
substrate write-contract); the WorkResult carries everything the worker used to write into
|
|
32
|
-
shared files. `validate-envelope.mjs` runs as a PreToolUse hook on Skill|Agent and DENIES a
|
|
33
|
-
dispatch whose `--order` file is missing or schema-invalid. Workers write only their own
|
|
34
|
-
domain artifacts inside their substrate — never boards, ledgers, or run-state (D6, closed).
|
|
35
|
-
|
|
36
|
-
Role → model, resolved once at GATE L0.8 from the `orch`/`exec`/`eval`/`qa` matrix
|
|
37
|
-
(`t0-verify.mjs` is mechanical tooling run directly via Bash, never an Agent — DD-7, zero LLM
|
|
38
|
-
tokens):
|
|
39
|
-
|
|
40
|
-
| Skill | L0.8 role | Why this tier |
|
|
41
|
-
|-------|-----------|---------------|
|
|
42
|
-
| translator | exec | one-shot text transform — builder tier |
|
|
43
|
-
| orient (Scout) | exec | reads/spikes code — builder tier, not judgment |
|
|
44
|
-
| ba-pitch-analyzer | exec | planner — builder tier, not judgment |
|
|
45
|
-
| scope-architect | exec | scope-contract author (sole writer of scopes/*.md) — builder tier |
|
|
46
|
-
| task-executor | exec | the builder itself |
|
|
47
|
-
| advisor-protocol | exec | adjudicates ESCALATE by precedent/default, budget-capped — not the single judge |
|
|
48
|
-
| spec-evaluator | eval | the single judge (judge ≠ doer) — keep its own matrix key even if a PO points it at the same model as `exec`, so it can be split later without a harness change |
|
|
49
|
-
| qa-edge-hunter | qa | cheapest tier by design — exploratory breadth over depth |
|
|
50
|
-
| scope-hammer | exec | census + baseline comparison, proposes only — not a verdict |
|
|
51
|
-
| coach | exec | categorization gate, not a verdict |
|
|
52
|
-
|
|
53
|
-
The tech lead itself is `orch` — this conversation, never delegated to.
|
|
54
|
-
|
|
55
|
-
The order is **Orient (7) → Map Scopes (8) → Build (9) → Eval**, faithful to Shape Up: the
|
|
56
|
-
team orients before any board exists, so the planner's board is reality-born. The tech lead
|
|
57
|
-
is the **sole writer of run-state** (`harness-run.md`) — it passes each worker the run
|
|
58
|
-
metadata it needs (`feature`, `spec`, `stack`, `discovered_rounds`, `--auto`) as **args**;
|
|
59
|
-
workers keep only their own product-idempotency key and emit domain artifacts.
|
|
60
|
-
|
|
61
|
-
## 0. LANGUAGE GATE → translator (GATE L0, only if non-English)
|
|
62
|
-
```
|
|
63
|
-
Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:translator) --check "<intake path>"
|
|
64
|
-
# detect-only, writes nothing
|
|
65
|
-
English → skip; ORIENT against the original.
|
|
66
|
-
non-English → Agent (model: exec): Skill(shapeup-sdlc-plugin:translator) "<intake path>" [--auto]
|
|
67
|
-
# full pass
|
|
68
|
-
Writes: <name>.en.md (English copy; original untouched) + glossary.md
|
|
69
|
-
+ translation-report.md.
|
|
70
|
-
ORIENT against the <name>.en.md copy.
|
|
71
|
-
Read back: the detect table (--check) / the .en.md path + residual scan result (full pass).
|
|
72
|
-
Authority: translator normalizes language only — it does not orient/plan/build/judge. The tech
|
|
73
|
-
lead never translates itself; it only detects and sequences this step before ORIENT.
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## 1. ORIENT → orient (the Scout, step 7) — runs BEFORE planning
|
|
77
|
-
```
|
|
78
|
-
Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:orient)
|
|
79
|
-
--pitch "<kicked-off pitch path>" --spec <path> --stack "<hint>" [--auto]
|
|
80
|
-
Owns: its own GATE O-A/O-B (or runs straight through under --auto)
|
|
81
|
-
Writes: .shapeup/<slug>/orient/ → code-surface.md, spike-<area>.md, discovered-seed.md, hill-signal.md (LOCAL run-trace)
|
|
82
|
-
Read back: hill-signal.md (render the area-level Hill at GATE L1a) + the spiked area/result.
|
|
83
|
-
Why first: at Orient time NO board exists; the Scout's map + discovered seed make the planner's
|
|
84
|
-
board reality-born instead of imagined. The four artifacts are the orient→ba contract.
|
|
85
|
-
Authority: pure worker — no code, no board, no run-state, no reporting.
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## 2. MAP SCOPES → ba-pitch-analyzer + scope-architect (step 8, orient-informed)
|
|
89
|
-
```
|
|
90
|
-
Order A (the spec tree + board):
|
|
91
|
-
compile-order --operation analyze --slug <slug> --worker ba-pitch-analyzer
|
|
92
|
-
--payload '{"pitch": "<path>", "lens": "<lens>", "orient_dir": ".shapeup/<slug>/orient/"}'
|
|
93
|
-
Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>
|
|
94
|
-
The order hands it code-surface.md (Phase-1 ingest, no re-scan), discovered-seed.md (task
|
|
95
|
-
gen from reality), spike-<area>.md (feasibility/contracts).
|
|
96
|
-
Writes (its substrate): spec_folder → _index.md, domain-model.md, ux-behavior.md, usecases/*,
|
|
97
|
-
contracts/*.contract.md, scope-summary.md (+ api-feasibility.md if third-party) and the
|
|
98
|
-
LOCAL board .shapeup/<slug>/tasks/ (v3.2; regenerable via a generate-board order).
|
|
99
|
-
Returns: WorkResult (artifacts list + discoveries) → ingest-result.
|
|
100
|
-
Order B (the scope contracts):
|
|
101
|
-
compile-order --operation map-scopes --slug <slug> --worker scope-architect
|
|
102
|
-
Agent (model: exec): Skill(shapeup-sdlc-plugin:scope-architect) --order <path>
|
|
103
|
-
Writes (its substrate): shapeup/<slug>/scopes/*.md + scope-board.md — sole
|
|
104
|
-
writer. Lint mechanically: node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/spec-lint.mjs" <slug> (PA1/PA2 +
|
|
105
|
-
substrate disjointness) before GATE L1b.
|
|
106
|
-
Read back: .shapeup/<slug>/tasks/_index.md (the board) + scope-summary.md (Done-when)
|
|
107
|
-
+ the spec-lint verdict.
|
|
108
|
-
Pass-through rule: do not coach the planner to over-specify implementation — keep tech high-level.
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## 2b. RECONCILE → ba-pitch-analyzer (discovered task reconciliation, operation: reconcile)
|
|
112
|
-
```
|
|
113
|
-
compile-order --operation reconcile --slug <slug> --worker ba-pitch-analyzer
|
|
114
|
-
--payload '{"discovered_ledger": ".shapeup/<slug>/discovery/ledger.md"}'
|
|
115
|
-
Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>
|
|
116
|
-
Effect: reconciles raw ledger discoveries into board tasks + appended UC invariants/TS rows,
|
|
117
|
-
inside the reconcile write-contract (frozen zone enforced by the sandbox hook, not
|
|
118
|
-
prose). Appetite Guard runs mechanically: node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/board-derive.mjs".
|
|
119
|
-
Returns: WorkResult → ingest-result (which updates the board and bumps discovered_rounds in
|
|
120
|
-
harness-run.md — the worker holds no counter).
|
|
121
|
-
Read back: updated tasks/_index.md + scope-summary.md before routing back to GATE L1b.
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## 2c. BOOTSTRAP LOCAL BOARD → ba-pitch-analyzer (operation: generate-board, v3.2)
|
|
125
|
-
```
|
|
126
|
-
Only when GATE L1b's bootstrap check fires (LOCAL .shapeup/<slug>/tasks/_index.md missing
|
|
127
|
-
AND SHARED shapeup/<slug>/spec/usecases/ present):
|
|
128
|
-
compile-order --operation generate-board --slug <slug> --worker ba-pitch-analyzer
|
|
129
|
-
Agent (model: exec): Skill(shapeup-sdlc-plugin:ba-pitch-analyzer) --order <path>
|
|
130
|
-
Effect: regenerates the LOCAL task board fresh from the committed usecases/domain-model/scopes
|
|
131
|
-
— no ledger, no reconciliation. Status bootstraps from committed T0/hill facts at
|
|
132
|
-
SCOPE granularity; unlocks recomputed by node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/board-derive.mjs" --write.
|
|
133
|
-
Read back: the freshly regenerated tasks/_index.md before entering BUILD.
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## 3. BUILD → task-executor (always through the envelope port)
|
|
137
|
-
```
|
|
138
|
-
r=1 loop:
|
|
139
|
-
compile-order --next --slug <slug> [--test-cmd "<cmd>"] # exit 2 = no ready task
|
|
140
|
-
Agent (model: exec), one fresh subagent per order:
|
|
141
|
-
Skill(shapeup-sdlc-plugin:task-executor) --order <path>
|
|
142
|
-
ingest-result <results/<id>.json> # ticks ACs, marks done, updates board, propagates unblocks
|
|
143
|
-
Repeat until compile-order --next reports no ready task (board all ✅).
|
|
144
|
-
|
|
145
|
-
r>1 (fix) per bug:
|
|
146
|
-
compile-order --task <id> --slug <slug> --operation fix --payload '{"bugs": [<entries>]}'
|
|
147
|
-
→ dispatch + ingest as above. Scope the change to the bug only.
|
|
148
|
-
|
|
149
|
-
Scope contracts present (isolated attempt loop, per scope, per attempt):
|
|
150
|
-
compile-order --scope shapeup/<slug>/scopes/<id>.md --round <N> --attempt <M>
|
|
151
|
-
→ orders/r<N>-a<M>.json inlines the scope contract, this scope's tasks, promoted ledger
|
|
152
|
-
decisions, and the previous attempt's AEGIS triples — the zero-memory handoff, compiled
|
|
153
|
-
from facts only. Dispatch a fresh Agent per attempt (this IS the isolation boundary):
|
|
154
|
-
Skill(shapeup-sdlc-plugin:task-executor) --order <path>
|
|
155
|
-
ingest-result — any escalates[] in the WorkResult are queued → dispatch 3b below.
|
|
156
|
-
|
|
157
|
-
Read back: ingest-result's summary line (tasks updated, unblocked, escalates) — not raw board
|
|
158
|
-
files. SPIKE tasks close before the tasks they block can build (compile-order enforces the
|
|
159
|
-
dependency order).
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
## 3b. ESCALATE adjudication → advisor-protocol (scope contracts present, mid-attempt)
|
|
163
|
-
```
|
|
164
|
-
Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:advisor-protocol)
|
|
165
|
-
--ledger shapeup/<slug>/round-ledger.md --escalate <block> [--unattended]
|
|
166
|
-
Effect: adjudicates via precedent / substrate-expansion (→ a scope-architect remap order) / PO ask / conservative
|
|
167
|
-
default; appends one row to round-ledger.md "Decisions" the instant it resolves.
|
|
168
|
-
Read back: the answer, to fold into the SAME attempt if still in progress, or the next
|
|
169
|
-
attempt's isolated brief otherwise.
|
|
170
|
-
Authority: advises; never designs, builds, or judges. Budget ≤3/scope/round — the 4th+
|
|
171
|
-
ESCALATE this scope/round auto-resolves conservatively and flags a GATE H proposal.
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
## 3c. T0 verify → scripts/t0-verify.mjs (skill-local; scope contracts present, every attempt)
|
|
175
|
-
```
|
|
176
|
-
Invoke via Bash directly — NOT an Agent, this is deterministic tooling, not a worker (DD-7):
|
|
177
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/tech-lead/scripts/t0-verify.mjs" shapeup/<slug>/scopes/<scope-id>.md
|
|
178
|
-
--round <N> --attempt <M> --seesaw-registry .shapeup/<slug>/seesaw/registry.json
|
|
179
|
-
Effect: runs the scope's e2e fixtures + DB probe, then (on green) the seesaw regression check
|
|
180
|
-
over every FINISHED scope's fixtures. Writes the verdict artifact spec-evaluator's
|
|
181
|
-
GATE V0.7 will require a citation to. Zero LLM tokens — deterministic tooling, not a
|
|
182
|
-
judge (this is what keeps "T1 once per round" true even though verification runs
|
|
183
|
-
every attempt, DD-7).
|
|
184
|
-
Read back: overall (green|red) + regression (bool) — drives the attempt-loop branch in
|
|
185
|
-
round-protocol.md "Isolated attempt loop". On red, its `discovered_tasks` field is
|
|
186
|
-
the AEGIS digest to fold into the next brief — no separate digester dispatch needed
|
|
187
|
-
(t0-verify.mjs calls its sibling aegis-digest.mjs internally on failure).
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
## 4. EVAL → spec-evaluator (once per round)
|
|
191
|
-
```
|
|
192
|
-
compile-order --operation evaluate --slug <slug> --worker spec-evaluator --round <r>
|
|
193
|
-
--payload '{"dimensions": ["spec-conformance"], "run_cmd": "<cmd>", "t0_artifacts": [...]}'
|
|
194
|
-
Invoke via Agent (model: eval), ONCE, after GATE L2:
|
|
195
|
-
Skill(shapeup-sdlc-plugin:spec-evaluator) --order <path>
|
|
196
|
-
Effect: one feature-level pass over the running app against all AC + Done-when; writes
|
|
197
|
-
evaluation/EVAL-FEATURE-<slug>.md (verdict + bug list) + its WorkResult (criteria
|
|
198
|
-
verdicts, refuted boxes, T0 citations). It touches NO task file and NO board.
|
|
199
|
-
ingest-result <results/evaluate-r<r>.json>: appends the .verdicts JSONL ledger, un-ticks the
|
|
200
|
-
refuted AC boxes, sets eval_verdict frontmatter — the judge returns data, ingest writes.
|
|
201
|
-
Read back: EVAL-FEATURE-<slug>.md → verdict (pass|fail) + the bug list (each bug has
|
|
202
|
-
task ref, severity, file:line, expected vs actual).
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
> Dependency note: this uses spec-evaluator's **feature-level** pass (`--feature <slug>`),
|
|
206
|
-
> which evaluates the whole board in one session rather than one task at a time. If your
|
|
207
|
-
> installed spec-evaluator is the per-task v0.1, add the `--feature` mode (a small v0.2
|
|
208
|
-
> patch: iterate the board's AC/Done-when in one probe+grade session, emit one
|
|
209
|
-
> EVAL-FEATURE report) before wiring the tech lead to it. The per-task invocation still
|
|
210
|
-
> works for ad-hoc checks, but the round loop expects one feature pass.
|
|
211
|
-
|
|
212
|
-
## 5. SHIP / GATE H → scope-hammer
|
|
213
|
-
```
|
|
214
|
-
Invoke via Agent (model: exec): Skill(shapeup-sdlc-plugin:scope-hammer)
|
|
215
|
-
--slug <slug> [--baseline <path>] [--breaker outer|inner --scope <id>]
|
|
216
|
-
Effect: GATE H0 census (scopes + QA findings + discovered ledger + advisor-overflow flags) →
|
|
217
|
-
H1 baseline comparison (never vs. a perfect ideal) → H2 cut list + verdict.
|
|
218
|
-
Read back: the proposed cut list + verdict (SHIP now | SHIP after fixing ship-blocking items |
|
|
219
|
-
CANNOT SHIP). The tech lead records the PO's decision in round-ledger.md and performs
|
|
220
|
-
the actual close (SHIP S.1 onward) — scope-hammer proposes, it never ships.
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
## Authority boundaries (do not cross)
|
|
224
|
-
- The Scout orients; it never plans, builds, or judges — it hands raw material to the planner.
|
|
225
|
-
- The planner decides scope; the tech lead confirms it with the PO at GATE L1b.
|
|
226
|
-
- The generator reports task outcomes in its WorkResult; `ingest-result.mjs` flips `status:
|
|
227
|
-
done` from that report. The tech lead confirms the feature-level close at GATE L4.
|
|
228
|
-
- The evaluator issues verdicts only; it never closes tasks. Judge ≠ doer.
|
|
229
|
-
- The tech lead decides *when* and *whether* each skill runs and how rounds proceed, owns
|
|
230
|
-
run-state + the Hill report — it does not decide *what* a task contains or *whether* a
|
|
231
|
-
single AC passes.
|
|
232
|
-
|
|
233
|
-
## Handoff files (the shared state)
|
|
234
|
-
| File | Written by | Read by |
|
|
235
|
-
|------|-----------|---------|
|
|
236
|
-
| `<name>.en.md` + `glossary.md` | translator (L0, if non-English) | tech lead (ORIENT input), Scout, planner |
|
|
237
|
-
| `orient/code-surface.md` | Scout (step 7) | planner Phase 1 (ingest, no re-scan) |
|
|
238
|
-
| `orient/spike-<area>.md` | Scout (step 7) | planner Phase 1b/contracts; tech lead (L1a) |
|
|
239
|
-
| `orient/discovered-seed.md` | Scout (step 7) | planner Phase 6 (task gen) |
|
|
240
|
-
| `orient/hill-signal.md` | Scout (step 7) | tech lead (renders L1a Hill) |
|
|
241
|
-
| `orders/<id>.json` (WorkOrder) | **compile-order.mjs (mechanical)** | every worker (its ONLY pipeline input), validate-envelope hook |
|
|
242
|
-
| `results/<id>.json` (WorkResult) | the dispatched worker (its ONLY pipeline output) | ingest-result.mjs (the single writer of everything below it) |
|
|
243
|
-
| `.shapeup/<slug>/tasks/*` (LOCAL board, v3.2) | **ingest-result.mjs** (status, AC ticks, unblocks) + planner orders (task bodies) | tech lead (board status), compile-order (next task, ACs) |
|
|
244
|
-
| `discovery/ledger.md` | **ingest-result.mjs** (from workers' `discoveries[]`) | reconcile orders (ba), scope-hammer (H0 census) |
|
|
245
|
-
| `scope-summary.md` | planner (analyze/reconcile orders) | tech lead (Done-when), evaluator (Done-when criteria) |
|
|
246
|
-
| `evaluation/EVAL-FEATURE-<slug>.md` + `.verdicts-*.jsonl` | evaluator (report) / **ingest-result.mjs** (verdict ledger, un-ticks) | tech lead (verdict), next fix order (bug list) |
|
|
247
|
-
| `harness-run.md` | **tech lead (sole writer)** | tech lead (round ledger + Hill + run-state), PO (audit) |
|
|
248
|
-
| `scopes/<scope-id>.md` | `scope-architect` (sole writer, incl. remap/split orders) | tech lead (substrate/sequence), sandbox hook (write-whitelist), compile-order (inlined into orders) |
|
|
249
|
-
| `t0/verdicts/r<N>-a<M>.json` | `scripts/t0-verify.mjs` (skill-local, mechanical — not a worker) | spec-evaluator (required citation), tech lead (hill derivation), compile-order (digested errors) |
|
|
250
|
-
| `round-ledger.md` | **tech lead (sole writer)** | compile-order (decisions into every order), advisor-protocol (appends), PO (audit) |
|
|
251
|
-
| `hill/<scope-id>.yml` + `hill-chart.md` | **tech lead (sole writer)** | PO ("status without asking"), scope-hammer (H0 census) |
|
|
252
|
-
|
|
253
|
-
> D6 is closed (v1.0): no worker writes `run-state.md`, the board, or the ledger. A worker
|
|
254
|
-
> performing a shared-state write is a defect — route it back through its WorkResult.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Tech-Lead Invocation
|
|
2
|
-
|
|
3
|
-
Invocation examples and the complete flag table, extracted from `SKILL.md` (progressive
|
|
4
|
-
disclosure). Read this when you need the exact CLI shape or a flag's effect.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Invocation
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
# Full build run from a kicked-off pitch, interactive (pause at every L-gate)
|
|
12
|
-
/tech-lead --pitch shapeup/checkout-vnpay/shaping/shaping.md --spec shapeup/checkout-vnpay/spec/ --lens standard
|
|
13
|
-
|
|
14
|
-
# Sub-skills unattended, tech lead pauses only at orient / plan / verdict / ship
|
|
15
|
-
/tech-lead --pitch ... --spec ... --auto
|
|
16
|
-
|
|
17
|
-
# Headless for CI (Agent SDK): auto-confirm all gates, stop on PASS / max_rounds / error
|
|
18
|
-
/tech-lead --pitch ... --spec ... --unattended --max-rounds 3
|
|
19
|
-
|
|
20
|
-
# Resume an existing run — start from a build-phase step
|
|
21
|
-
/tech-lead --spec shapeup/checkout-vnpay/spec/ --from build
|
|
22
|
-
|
|
23
|
-
# Skip evaluation for a trivial feature (tech-lead judgment / PO override)
|
|
24
|
-
/tech-lead --pitch ... --spec ... --no-eval
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Flags
|
|
28
|
-
| Flag | Effect |
|
|
29
|
-
|------|--------|
|
|
30
|
-
| `--pitch <path>` | Kicked-off pitch (shaped + bet by PO) — input to ORIENT then MAP SCOPES |
|
|
31
|
-
| `--spec <path>` | Spec folder (orient/ + planner output + ledger location) |
|
|
32
|
-
| `--lens lite\|standard\|cross-context` | Passed to ba-pitch-analyzer at step 8 |
|
|
33
|
-
| `--auto` | Sub-skills run unattended; tech lead pauses at L1a/L1b/L3/L4 |
|
|
34
|
-
| `--unattended` | Auto-confirm all L-gates (headless / CI) |
|
|
35
|
-
| `--max-rounds N` | BUILD→EVAL cycles before escalating (default 3) — the OUTER breaker |
|
|
36
|
-
| `--attempts N` | Per-scope T0 attempts before queuing a GATE H hammer proposal (default 5) — the INNER breaker; no-op on specs without scope contracts |
|
|
37
|
-
| `--orch-model / --exec-model / --eval-model / --qa-model <name>` | Override L0.8's resolved model matrix for this run only (highest precedence) |
|
|
38
|
-
| `--from orient\|plan\|build\|eval` | Resume an in-progress run at a build-phase step |
|
|
39
|
-
| `--no-eval` | Skip the evaluation pass this run (trivial feature) |
|
|
40
|
-
| `--no-qa` | Skip the post-PASS /qa-edge-hunter pass (ledger records `qa: skipped`) |
|
|
41
|
-
| `--tiny` | The small-change lane: orient (light) → single-task board → build → T0 → done. Implies `--no-eval --no-qa`, skips WIRE and scope contracts, collapses the gates to L0 + L4. See "The tiny lane" in SKILL.md — the L0 fit-check is mandatory and the ledger records `lane: tiny` |
|
|
42
|
-
| `--dimensions <list>` | Eval dimensions (default spec-conformance) |
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
# Ledger Schema — `harness-run.md`
|
|
2
|
-
|
|
3
|
-
The tech lead's run record. One per feature, lives in the LOCAL run-trace root
|
|
4
|
-
`.shapeup/<slug>/harness-run.md` (hidden, gitignorable — it is ephemeral run-state,
|
|
5
|
-
not a shared deliverable). It is the structured
|
|
6
|
-
artifact that carries state across rounds and across sessions (so `--from` can resume), and
|
|
7
|
-
the PO's audit of how the feature was built.
|
|
8
|
-
|
|
9
|
-
**The tech lead is the sole writer of this file** (redesign doc D6). It is the authoritative
|
|
10
|
-
run-state for the whole build phase — rounds, gate decisions, Hill positions, verdicts,
|
|
11
|
-
`discovered_rounds`, config, language record. Workers never write here; the tech lead passes
|
|
12
|
-
them what they need (`feature`, `spec`, `stack`, `discovered_rounds`) as args. The board
|
|
13
|
-
(`tasks/_index.md`) remains the planner/generator's execution truth that the tech lead reads.
|
|
14
|
-
|
|
15
|
-
## Frontmatter
|
|
16
|
-
```yaml
|
|
17
|
-
---
|
|
18
|
-
type: harness-run
|
|
19
|
-
feature: [slug]
|
|
20
|
-
spec_folder: [path to SHARED spec deliverable, e.g. shapeup/<slug>/spec/]
|
|
21
|
-
lens: lite | standard | cross-context
|
|
22
|
-
eval_dimensions: [spec-conformance]
|
|
23
|
-
max_rounds: 3
|
|
24
|
-
auto_level: interactive | auto | unattended
|
|
25
|
-
status: orienting | mapping | building | evaluating | shipped | escalated
|
|
26
|
-
final_verdict: ~ | pass | fail | not-evaluated
|
|
27
|
-
rounds_used: [N]
|
|
28
|
-
discovered_rounds: [N]
|
|
29
|
-
deploy: ~ | deployed | pending-po
|
|
30
|
-
started_at: [ISO]
|
|
31
|
-
closed_at: ~ | [ISO]
|
|
32
|
-
---
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Round table (the spine)
|
|
36
|
-
Mirrors the long-running harness cost table — one row per phase, so you can see where time
|
|
37
|
-
and tokens go and that EVAL is cheap relative to BUILD.
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
## Rounds
|
|
41
|
-
| Phase | Round | Result | Duration | Notes |
|
|
42
|
-
|------------------|-------|-------------------|----------|-------|
|
|
43
|
-
| Orient | — | spiked VNPay seam | 18 min | spike resolved; 9 discovered tasks seeded |
|
|
44
|
-
| Map Scopes | — | 14 tasks, 5 layers| 5 min | orient-informed; 1 SPIKE (VNPay) |
|
|
45
|
-
| Build | 1 | 14/14 ✅ | 2 h 10 m | all tasks closed |
|
|
46
|
-
| Eval | 1 | FAIL — 3 bugs | 9 min | EVAL-FEATURE-checkout-vnpay.md |
|
|
47
|
-
| Build | 2 | 3 bugs fixed | 22 min | bug-only re-build |
|
|
48
|
-
| Eval | 2 | PASS | 8 min | verdict pass |
|
|
49
|
-
| Ship | — | built & verified | — | dims: spec-conformance; deploy pending (PO) |
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Hill report (the progress narrative — NOT task counts)
|
|
53
|
-
The roadmap forbids reporting progress by counting tasks: a 90%-done slice can still be stuck
|
|
54
|
-
uphill on the one unknown that matters. So the tech lead reports each slice's **position on
|
|
55
|
-
the hill**, derived mechanically from open unknowns. Render it at every round boundary
|
|
56
|
-
(area-level at GATE L1a — before slices exist; slice-level from GATE L1b onward).
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
## Hill — round 1
|
|
60
|
-
| Slice | Position | Derived from |
|
|
61
|
-
|--------------|-------------|--------------|
|
|
62
|
-
| S1-spine | 🔽 downhill | spike closed + spine render-AC passed (crest crossed); 2 known tasks left |
|
|
63
|
-
| S2-filters | 🔼 uphill | SPIKE-003 open: pagination approach unproven |
|
|
64
|
-
| S3-export | 🔼 uphill | contract ⏳ TBD: file-format field |
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Position triggers:
|
|
68
|
-
- 🔼 **Uphill** — open SPIKE / `⏳ TBD` contract / unresolved discovered task / approach unproven.
|
|
69
|
-
- ⛰️ **Crest** — all unknowns resolved AND a concrete board fact (the spine slice's render-AC passes).
|
|
70
|
-
- 🔽 **Downhill** — only known work remains, no open unknowns.
|
|
71
|
-
- ✅ **Done** — slice clickable-done.
|
|
72
|
-
|
|
73
|
-
Source: `orient/hill-signal.md` (area-level, at L1a) then the board + open SPIKE/contract state
|
|
74
|
-
(slice-level, L1b onward). If slice IDs aren't on the board yet (D3 deferred), report at
|
|
75
|
-
task-group level and note the fallback here.
|
|
76
|
-
|
|
77
|
-
## Decisions log
|
|
78
|
-
Every L-gate decision, for traceability.
|
|
79
|
-
```
|
|
80
|
-
## Decisions
|
|
81
|
-
- GATE L1a: Orient accepted; spiked VNPay seam (resolved); S2-filters flagged uphill.
|
|
82
|
-
- GATE L1b: PO accepted board; cut "guest checkout" task to phase 2.
|
|
83
|
-
- GATE L2 (r1): board green; ran eval (feature not trivial).
|
|
84
|
-
- GATE L3 (r1): FAIL → approved bug-only round 2.
|
|
85
|
-
- GATE L3 (r2): PASS → ship.
|
|
86
|
-
- GATE L4: built & verified; deploy pending (PO); closed.
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Bug carry-over (when FAIL)
|
|
90
|
-
Links the current round's bug list so the next BUILD round has its worklist.
|
|
91
|
-
```
|
|
92
|
-
## Open bugs (round 1 → fix in round 2)
|
|
93
|
-
→ see evaluation/EVAL-FEATURE-checkout-vnpay.md
|
|
94
|
-
- BUG-1 critical SC-DONE-WHEN apps/web/checkout/Pay.tsx:84
|
|
95
|
-
- BUG-2 major SC-ERR apps/api/payments/handler.ts:51
|
|
96
|
-
- BUG-3 minor SC-NONGO apps/api/shared/auth.ts:12
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Escalation block (only if max_rounds hit without PASS)
|
|
100
|
-
```
|
|
101
|
-
## Escalation
|
|
102
|
-
Rounds used: 3/3 — still FAIL. Residual bugs: [N].
|
|
103
|
-
Recommendation: [cut scope of feature X | accept minor bugs | extend max_rounds with PO approval].
|
|
104
|
-
Decision owner: PO.
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Rules
|
|
108
|
-
- The ledger is append-mostly: each round adds rows, never rewrites history.
|
|
109
|
-
- `status` + `final_verdict` are the resume anchors for `--from`.
|
|
110
|
-
- A `not-evaluated` final verdict (from `--no-eval`) is recorded plainly — never silently
|
|
111
|
-
upgraded to `pass`.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## `round-ledger.md` (committed, Tier A — scope contracts only)
|
|
116
|
-
|
|
117
|
-
Lives at `shapeup/<slug>/round-ledger.md` (SHARED root, tracked). Not a replacement
|
|
118
|
-
for `harness-run.md` — a small, committed **subset** of it: the two things that must survive
|
|
119
|
-
a `.shapeup/` wipe or a crash (design spec addendum §F.3). Absent on specs with no scope
|
|
120
|
-
contracts; `harness-run.md`'s existing Decisions log stays the only ledger there.
|
|
121
|
-
|
|
122
|
-
```yaml
|
|
123
|
-
---
|
|
124
|
-
type: round-ledger
|
|
125
|
-
feature: [slug]
|
|
126
|
-
models: # L0.8 resolved matrix, recorded once, source noted
|
|
127
|
-
orch: [model] (source: flags|settings.local|settings.json|default)
|
|
128
|
-
exec: [model] (source: ...)
|
|
129
|
-
eval: [model] (source: ...)
|
|
130
|
-
qa: [model] (source: ...)
|
|
131
|
-
digester: script | sonnet
|
|
132
|
-
budgets:
|
|
133
|
-
round_budget: [N] # outer breaker
|
|
134
|
-
attempt_budget: [N] # inner breaker, per scope
|
|
135
|
-
---
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
## Decisions
|
|
140
|
-
| Round | Scope | Kind | Question | Answer | Resolved by |
|
|
141
|
-
|-------|-------|------|----------|--------|-------------|
|
|
142
|
-
| 2 | cart-creation | design-decision | cart-total rounding | round half-up | PO (interactive) |
|
|
143
|
-
| 2 | cart-creation | substrate-expansion | needs packages/shared/http.ts | approved → shared_substrate | PO (interactive) |
|
|
144
|
-
```
|
|
145
|
-
**Promotion timing:** a row is appended the INSTANT `advisor-protocol` resolves an ESCALATE —
|
|
146
|
-
never batched to round close. This is the file `task-executor`'s isolated briefs read back
|
|
147
|
-
(zero-memory handoff, DD-8): an answer given once in round 2 must still be known in round 5's
|
|
148
|
-
fresh-context attempt without replaying any chat history.
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Harvest row — `metrics/<machine-id>.jsonl` (written at SHIP)
|
|
153
|
-
|
|
154
|
-
`harness-run.md` is ephemeral run-state — needed live for `--from` resume, the
|
|
155
|
-
FAIL-loop, and QA reconcile; worthless after ship. At SHIP the tech-lead **harvests**
|
|
156
|
-
the durable-mineable *signals* out of it into one append-only row:
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
shapeup/metrics/<machine-id>.jsonl # one row = one e2e run; COMMITTED (tracked)
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
Path note: the per-slug local run dirs `.shapeup/[slug]/` are gitignored wholesale
|
|
163
|
-
(`.shapeup/`), but `metrics/` lives under the **shared** workspace
|
|
164
|
-
`shapeup/` and stays **tracked** — it is the committed report surface, the
|
|
165
|
-
durable signal feed that survives the gitignored run-trace. Sharded per machine (addendum
|
|
166
|
-
Δ3) so concurrent runs append without merge-conflicting on one file; an aggregate view is
|
|
167
|
-
`cat shapeup/metrics/*.jsonl`. `schema_version` makes a v2.1 row readable by later
|
|
168
|
-
skill versions.
|
|
169
|
-
|
|
170
|
-
### Two hard rules (same discipline as the Test Surface: *derived, never invented*)
|
|
171
|
-
1. **Harvest only fields that already exist as structured output at ship time.** If a
|
|
172
|
-
field forces the tech-lead to *evaluate something new* → reject (judgment in disguise).
|
|
173
|
-
2. **Harvest records facts, never computes a new verdict.** A self-computed
|
|
174
|
-
`run_quality_score` would be a second judge behind `spec-evaluator` → breaks the
|
|
175
|
-
single-judge rule and invites Goodhart. The eval suite *interprets* downstream;
|
|
176
|
-
harvest *records*.
|
|
177
|
-
|
|
178
|
-
Scope: the harvest feeds **only tier-3 (e2e pipeline benchmark)**. Tier-1
|
|
179
|
-
(trigger-evals) and tier-2 (per-skill functional, golden fixtures) run on isolated
|
|
180
|
-
fixtures and do not consume it.
|
|
181
|
-
|
|
182
|
-
### Row schema (one JSON object per line)
|
|
183
|
-
| Field | Existing source (copied, never re-graded) | Signal |
|
|
184
|
-
|---|---|---|
|
|
185
|
-
| `schema_version` | constant `1` | forward-compat |
|
|
186
|
-
| `feature_slug` | run-state frontmatter | identity |
|
|
187
|
-
| `terminal_state` | run-state final: `shipped` / `circuit_broken` / `abandoned` | circuit-breaker outcome |
|
|
188
|
-
| `round_count` | round table | effort-to-PASS |
|
|
189
|
-
| `final_audit_score` | final EVAL report (copied, not re-graded) | conformance |
|
|
190
|
-
| `surprise_count` | `.shapeup/<slug>/discovery/ledger.md` | shaping quality — scope drift |
|
|
191
|
-
| `spike_unresolved_count` | `SPIKE-UNRESOLVED` markers at bet | shaping quality — open risk into bet |
|
|
192
|
-
| `scope_cut_count` | `~` items cut at SHIP S.0 | appetite pressure / scope hammer |
|
|
193
|
-
| `qa_findings` | `.shapeup/<slug>/qa/hunt-report.md` + triage → `{total, promoted, held}` | edge quality |
|
|
194
|
-
| `slice_count` | breadboard B5 (≤9) | **normalizer / denominator** |
|
|
195
|
-
| `sources` | path to each **SHARED** source artifact — never a LOCAL `.shapeup/` path (this row is committed; the run-trace is gitignored/wiped, so a LOCAL path dangles on every clone — tier-direction rule) | auditability |
|
|
196
|
-
|
|
197
|
-
- `slice_count` is the **denominator**: `round_count=4` on a 2-slice feature is alarming,
|
|
198
|
-
on a 9-slice feature is normal. Without it, e2e comparisons are apples-to-oranges.
|
|
199
|
-
Enables `round-per-slice`, `surprise-per-slice`.
|
|
200
|
-
- `spike_unresolved_count` + `surprise_count` measure two of the three downhill
|
|
201
|
-
conditions (open-risk-remaining, scope-drift-from-breadboard). A good shaping run
|
|
202
|
-
drives both toward 0 — measured from the build trace, no manual grading.
|
|
203
|
-
- **Rejected fields:** `time_spent` / velocity (no clock; Shape Up forbids counting hours
|
|
204
|
-
— `round_count` is the legitimate effort proxy) and `run_quality_score` (second judge).
|
|
205
|
-
|
|
206
|
-
### Row template
|
|
207
|
-
```json
|
|
208
|
-
{"schema_version":1,"feature_slug":"checkout-vnpay","terminal_state":"shipped","round_count":2,"final_audit_score":"PASS","surprise_count":3,"spike_unresolved_count":0,"scope_cut_count":1,"qa_findings":{"total":5,"promoted":1,"held":4},"slice_count":4,"sources":["shapeup/checkout-vnpay/shaping/shaping.md","shapeup/checkout-vnpay/shaping/breadboard.md"]}
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
LOCAL artifacts (the EVAL report, discovery ledger, QA hunt report) are *harvest-time reads*:
|
|
212
|
-
their **values** are copied into the row's fields (`final_audit_score`, `surprise_count`,
|
|
213
|
-
`qa_findings`) but their paths are never recorded in `sources` — they are gitignored and
|
|
214
|
-
wiped, so a committed pointer to them is dead on arrival.
|