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,45 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,214 @@
|
|
|
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.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Round Protocol
|
|
2
|
+
|
|
3
|
+
The orchestration loop in detail. A "round" is one BUILD phase followed by exactly one
|
|
4
|
+
EVAL phase. The feature is done when an EVAL round returns PASS.
|
|
5
|
+
|
|
6
|
+
> `tasks/_index.md` referenced throughout this file lives in the LOCAL gitignored root
|
|
7
|
+
> (`.shapeup/<slug>/tasks/`, v3.2), not the
|
|
8
|
+
> SHARED spec dir. See tech-lead SKILL.md GATE L1b for the bootstrap step that regenerates it
|
|
9
|
+
> when missing.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
round r = 1
|
|
13
|
+
loop:
|
|
14
|
+
BUILD(r) # see r=1 vs r>1 below
|
|
15
|
+
assert board 100% done # GATE L2 — advisory: the hook warns, you decide
|
|
16
|
+
verdict, bugs = EVAL(r) # ONE spec-evaluator --feature pass
|
|
17
|
+
if verdict == PASS:
|
|
18
|
+
SHIP; break
|
|
19
|
+
if r >= max_rounds:
|
|
20
|
+
ESCALATE(bugs); break # honest stop — no infinite loop
|
|
21
|
+
r = r + 1 # next round builds bugs only
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## BUILD(r) semantics
|
|
25
|
+
|
|
26
|
+
| | r = 1 (initial build) | r > 1 (fix build) |
|
|
27
|
+
|--|----------------------|-------------------|
|
|
28
|
+
| Input | the whole task board | the bug list from EVAL(r-1) |
|
|
29
|
+
| Scope | every ready task, dependency/layer order, until board all ✅ | only the tasks/areas named by bugs |
|
|
30
|
+
| Command | compile-order `--next` → task-executor `--order` → ingest, looped | compile-order `--task <id> --operation fix` → dispatch → ingest, per bug |
|
|
31
|
+
| Passing areas | n/a | never touched |
|
|
32
|
+
| SPIKEs | resolved first (they block) | only if a bug is a SPIKE finding |
|
|
33
|
+
|
|
34
|
+
Re-opening tasks in r>1: the fix order's WorkResult reports the task `partial` while failing
|
|
35
|
+
and `done` when re-verified; ingest-result flips the board accordingly. The board reflects the
|
|
36
|
+
churn so the next EVAL sees a green board again.
|
|
37
|
+
|
|
38
|
+
Discovered Tasks:
|
|
39
|
+
If WorkResults carry `discoveries[]` during BUILD, ingest-result appends them to the discovery
|
|
40
|
+
ledger (`.shapeup/<slug>/discovery/ledger.md`) and the build loop pauses after the current
|
|
41
|
+
tasks are done. Compile + dispatch a reconcile order (ba-pitch-analyzer, operation: reconcile).
|
|
42
|
+
This reconciles them into new tasks and invariants and updates the board; the tech lead bumps
|
|
43
|
+
`discovered_rounds` in harness-run.md, then routes back to GATE L1b (Board Review) for PO
|
|
44
|
+
approval of the new tasks and estimates before resuming the BUILD loop.
|
|
45
|
+
|
|
46
|
+
## The EVAL timing rule (the core constraint)
|
|
47
|
+
|
|
48
|
+
EVAL fires **once** per round and **only** when GATE L2 has confirmed the board is 100% done.
|
|
49
|
+
It is never:
|
|
50
|
+
- called per task,
|
|
51
|
+
- called inside the BUILD loop,
|
|
52
|
+
- called on a partial board.
|
|
53
|
+
|
|
54
|
+
## Regression rule (r > 1) — QA-meeting Bước 1c
|
|
55
|
+
|
|
56
|
+
A fix round changes code; a fix can break what passed. Therefore EVAL(r>1) scope is **not**
|
|
57
|
+
just the fixed bugs:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
EVAL(r) for r > 1:
|
|
61
|
+
touched_UCs = every UC referenced (use_case_refs) by a task re-opened in BUILD(r)
|
|
62
|
+
scope = fixed bugs' criteria
|
|
63
|
+
+ FULL re-run of `## Test Surface` rows for every touched UC
|
|
64
|
+
(test-surface-conformance dimension, when active)
|
|
65
|
+
+ completeness re-check (cheap, static)
|
|
66
|
+
untouched UCs' surfaces: NOT re-run (their code didn't change; re-probing everything
|
|
67
|
+
every round would turn cheap end-of-round QA into a full-suite tax)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Pre-v2.9 specs (no Test Surface anywhere): the rule degrades to bug-criteria-only, as
|
|
71
|
+
before — and the verdict report notes `regression coverage: none (no test surface)`.
|
|
72
|
+
Honest reporting over silent coverage claims.
|
|
73
|
+
|
|
74
|
+
## QA edge hunt (post-PASS, pre-ship)
|
|
75
|
+
|
|
76
|
+
When EVAL(r) returns PASS for the **first** time in a run, the orchestrator delegates one
|
|
77
|
+
`/qa-edge-hunter` pass before SHIP (skippable via `--no-qa`, same spirit as `--no-eval`).
|
|
78
|
+
QA is a pure worker: no verdict, no score, no gate — it writes `~` findings to
|
|
79
|
+
`discovery/ledger.md` and a `qa/hunt-report.md`. Triage happens at SHIP/GATE L4:
|
|
80
|
+
- all findings stay `~` → SHIP; findings carry over as raw ideas (debt-free).
|
|
81
|
+
- PO/TL promote any to must-have → a fix round r+1 (those items only) → EVAL
|
|
82
|
+
`--single-pass` on them → `/qa-edge-hunter --recheck` (re-probe ONLY the promoted items;
|
|
83
|
+
never a second full hunt) → back to L4.
|
|
84
|
+
- Circuit breaker applies: out of rounds/appetite → ship with `~` findings recorded.
|
|
85
|
+
QA never runs on a FAIL round — a build that hasn't passed conformance isn't worth
|
|
86
|
+
edge-hunting yet.
|
|
87
|
+
|
|
88
|
+
Rationale (from the long-running harness work): a single end-of-round QA pass over the
|
|
89
|
+
running feature is cheap relative to the build (minutes vs hours) and catches the
|
|
90
|
+
last-mile defects, whereas grading every task multiplies evaluator cost for little gain
|
|
91
|
+
once the generator is competent. If the build round didn't finish, there is nothing
|
|
92
|
+
coherent to evaluate yet.
|
|
93
|
+
|
|
94
|
+
## Stop conditions
|
|
95
|
+
1. **PASS** — EVAL(r) verdict is PASS → SHIP.
|
|
96
|
+
2. **max_rounds (OUTER breaker)** — r would exceed `--max-rounds` (default 3) without PASS →
|
|
97
|
+
ESCALATE: print the residual bug list, the rounds used, and hand the decision to the PO
|
|
98
|
+
(scope contracts present: also `/scope-hammer --breaker outer`). Do not start another
|
|
99
|
+
build round automatically.
|
|
100
|
+
3. **attempt_budget (INNER breaker, scope contracts only)** — a single scope's T0 attempt
|
|
101
|
+
loop exhausts `--attempts` (default 5) without a green result → does NOT stop the round;
|
|
102
|
+
queues a hammer PROPOSAL for GATE H and moves to the next scope in sequence. See
|
|
103
|
+
"Three-level circuit breaker" below.
|
|
104
|
+
4. **wall_clock_budget (DEADLINE breaker, opt-in)** — elapsed seconds since the run receipt
|
|
105
|
+
exceed `--wall-clock-budget` → do NOT start another build round or another scope; go
|
|
106
|
+
straight to GATE H (`/scope-hammer --breaker deadline`). Checked with
|
|
107
|
+
`scripts/budget-check.mjs` at every round boundary and enforced by `hooks/gate-deadline.mjs`,
|
|
108
|
+
which denies a `task-executor` dispatch past the deadline while leaving `spec-evaluator`,
|
|
109
|
+
`scope-hammer`, `qa-edge-hunter` and `advisor-protocol` reachable — a run past its deadline
|
|
110
|
+
must still be able to judge, hammer, and close. Off unless configured.
|
|
111
|
+
5. **Hard error** — a sub-skill fails irrecoverably (e.g. spec folder gone, app won't
|
|
112
|
+
build at all) → stop and report; do not retry blindly.
|
|
113
|
+
6. **User halt** — at any L-gate the user can stop the run; the ledger preserves state for
|
|
114
|
+
`--from` resume.
|
|
115
|
+
|
|
116
|
+
## Three-level circuit breaker
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
OUTER round_budget (max_rounds) — the six-week-timebox analog. Decremented once per
|
|
120
|
+
round at GATE L2, regardless of how many scopes it
|
|
121
|
+
covered. Hitting 0 → GATE H immediately (§ above).
|
|
122
|
+
INNER attempt_budget (per scope) — decremented once per T0 attempt inside BUILD round r.
|
|
123
|
+
Hitting its cap WITHOUT a T0-green result trips the
|
|
124
|
+
inner breaker for that scope only: the scope is queued
|
|
125
|
+
as a hammer PROPOSAL (not a hard stop) and the round
|
|
126
|
+
moves on to the next scope in the L1b sequence.
|
|
127
|
+
DEADLINE wall_clock_budget_s — elapsed seconds since the run receipt. Opt-in; off
|
|
128
|
+
unless set at L0. Tripping routes to GATE H with
|
|
129
|
+
--breaker deadline. Enforced by hooks/gate-deadline.mjs.
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Why the third one exists — it was measured, and it corrected an earlier diagnosis.** On the
|
|
133
|
+
SDD harness benchmark (F3, Sonnet 5) this harness was killed at the declared 1800 s cap and
|
|
134
|
+
published as a DNF. The natural reading was that it had stalled at a gate. Re-reading the
|
|
135
|
+
retained transcript says otherwise: **327 turns, 262 tool calls, 37 file writes, 19 gate markers,
|
|
136
|
+
last gate L3, and zero stall signals** — the least talkative shapeup run in the whole matrix. It
|
|
137
|
+
was working when the clock ran out.
|
|
138
|
+
|
|
139
|
+
Both existing breakers count *events*, not time: `round_budget` moves once per round,
|
|
140
|
+
`attempt_budget` once per T0 attempt. Neither can observe that round 1 has been running for
|
|
141
|
+
twenty-nine minutes, so a run can burn its entire wall clock with both breakers untouched. The
|
|
142
|
+
cost is not the DNF row — it is that a run killed from *outside* ships nothing, not even the
|
|
143
|
+
scopes that were already green. A breaker that trips from the inside routes to GATE H, where
|
|
144
|
+
scope-hammer compares the shippable subset against the baseline and ships what works. Same clock,
|
|
145
|
+
different ending.
|
|
146
|
+
Nesting rationale (DD-9): a struggling scope should not freeze every other scope's progress
|
|
147
|
+
in the same round — only running out of *rounds* (the real six-week analog) stops the whole
|
|
148
|
+
run. A scope that trips its inner breaker still gets judged fairly at GATE H: scope-hammer
|
|
149
|
+
compares "ship without this scope" against the baseline, same as any other cut candidate — it
|
|
150
|
+
is never silently dropped, and it is never allowed to block scopes that ARE working.
|
|
151
|
+
|
|
152
|
+
## Isolated attempt loop — one T0 attempt, in detail (scope contracts only)
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
compile-order --scope … --round N --attempt M
|
|
156
|
+
→ zero-memory WorkOrder (scope contract + this scope's
|
|
157
|
+
tasks + digested errors + ledger decisions — compiled
|
|
158
|
+
facts, no chat history by construction)
|
|
159
|
+
dispatch task-executor --order … → code within substrate; WorkResult in results/
|
|
160
|
+
ingest-result <result> → board/ledger writes; escalates[] queued
|
|
161
|
+
handle_escalations(≤3/scope/round) → /advisor-protocol; answer promoted to round-ledger.md
|
|
162
|
+
immediately (must survive the NEXT attempt's fresh
|
|
163
|
+
context — this is what "zero-memory" is compatible with
|
|
164
|
+
escalation memory means, DD-8)
|
|
165
|
+
t0-verify.mjs → fixtures + DB probe + (on green) seesaw
|
|
166
|
+
green → attempt loop breaks; scope reaches DOWNHILL_EXECUTION
|
|
167
|
+
red, regression → git stash (never a hard discard) + retry; a FINISHED scope's fixture
|
|
168
|
+
broke (PA5) — the whole point of running seesaw before declaring green
|
|
169
|
+
red, own fixture → AEGIS-digest the failure into {file, line, core_message} triples,
|
|
170
|
+
feed them into the NEXT attempt's brief; loop
|
|
171
|
+
```
|
|
172
|
+
This replaces the old flat per-task loop for any scope that has a contract;
|
|
173
|
+
scopes/specs without one keep the v0.2.6 behavior verbatim (see BUILD(r) table above).
|
|
174
|
+
|
|
175
|
+
## --no-eval (skip evaluation)
|
|
176
|
+
A tech-lead judgment, surfaced at GATE L2: if the feature is clearly within what the model
|
|
177
|
+
builds reliably solo, the evaluator is optional overhead. With `--no-eval`, after GATE L2
|
|
178
|
+
the run goes straight to SHIP with verdict `not-evaluated` recorded in the ledger and a
|
|
179
|
+
clear note that nothing was verified beyond the build's own task-executor GATE D checks.
|
|
180
|
+
|
|
181
|
+
## Round-cost intuition
|
|
182
|
+
Build dominates; eval is cheap. Expect each EVAL round to cost a small fraction of a BUILD
|
|
183
|
+
round. This is why running eval once per round (not per task) is the right trade: you pay a
|
|
184
|
+
little QA at the end of each build and keep the expensive build coherent in between.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# State Model — who writes what
|
|
2
|
+
|
|
3
|
+
Reference for the orchestrator. Moved out of `SKILL.md` so the front door stays a runbook: the
|
|
4
|
+
first screen a model reads decides whether it acts or describes, and every line of architecture
|
|
5
|
+
prose ahead of the first tool call is a line it can summarise instead of execute.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## State ownership (D6, mechanically closed in v1.0)
|
|
10
|
+
|
|
11
|
+
Workers are stateless; the orchestrator layer is the **sole writer of ALL run-state**. Every
|
|
12
|
+
worker receives a structured **WorkOrder** envelope (`.shapeup/<slug>/orders/`, compiled by
|
|
13
|
+
`compile-order.mjs`) and returns a **WorkResult** envelope (`results/`); the deterministic
|
|
14
|
+
`ingest-result.mjs` performs every shared-state write — board status, AC ticks, unblock
|
|
15
|
+
propagation, discovery-ledger appends, verdict bookkeeping.
|
|
16
|
+
|
|
17
|
+
No worker writes `run-state.md`, `tasks/_index.md`, or the ledger. Everything a worker used to
|
|
18
|
+
write into shared files, it now returns as data.
|
|
19
|
+
|
|
20
|
+
The tech lead owns `harness-run.md` — rounds, gate decisions, Hill positions, verdicts,
|
|
21
|
+
`discovered_rounds`, config, language record. The board (`tasks/_index.md`, LOCAL root — v3.2) is
|
|
22
|
+
**execution truth**, maintained exclusively through ingest.
|
|
23
|
+
|
|
24
|
+
**The run receipt (v1.4).** `scripts/init-run.mjs` opens the run and writes
|
|
25
|
+
`.shapeup/<slug>/receipt.json` plus `.shapeup/active-scope` before any gate. The
|
|
26
|
+
receipt is the mechanical fact that a run *started* — distinct from every other artifact here,
|
|
27
|
+
which records what a run *did*. That distinction is load-bearing: the guards that check a run's
|
|
28
|
+
progress (`anti-rationalization.mjs`) are all scoped to an active run, so before the receipt
|
|
29
|
+
existed, a run that never started was invisible to every one of them. `hooks/gate-zerowork.mjs`
|
|
30
|
+
reads only the receipt's presence, which is why it can see a total failure that leaves no other
|
|
31
|
+
trace. See `references/gates.md` — GATE L0.1.
|
|
32
|
+
|
|
33
|
+
## Central domain registry
|
|
34
|
+
|
|
35
|
+
Every record type and payload field that crosses a skill boundary is defined exactly once in
|
|
36
|
+
`skills/tech-lead/schemas/domain.schema.json` — the envelope schemas (`work-order.schema.json`,
|
|
37
|
+
`work-result.schema.json`) only `$ref` it. The registry annotates each entity's tier
|
|
38
|
+
(SHARED/LOCAL), location, sole writer, and readers, carries the machine-readable ERD (`x-erd`),
|
|
39
|
+
and maps which payload fields each worker may rely on (`x-payload-by-worker`).
|
|
40
|
+
|
|
41
|
+
A new cross-boundary field is added THERE first (structural test #24 enforces the map's
|
|
42
|
+
consistency); a skill inventing its own undeclared field is a defect — the orchestrator, not the
|
|
43
|
+
worker, owns the vocabulary.
|
|
44
|
+
|
|
45
|
+
## Two ledgers, split by promotion timing
|
|
46
|
+
|
|
47
|
+
(Addendum §F.3 — only when scope contracts exist.)
|
|
48
|
+
|
|
49
|
+
`harness-run.md` stays the LOCAL (`.shapeup/<slug>/`, gitignored) full run trace: it can be
|
|
50
|
+
rebuilt or lost without consequence.
|
|
51
|
+
|
|
52
|
+
A second, committed `round-ledger.md` (`shapeup/<slug>/round-ledger.md`, SHARED,
|
|
53
|
+
Tier A) holds only what must survive a crash or a `.shapeup/` wipe:
|
|
54
|
+
|
|
55
|
+
- the resolved model/budget matrix (L0.8/L0.9),
|
|
56
|
+
- the **Decisions** table — every gate crossing and every advisor-protocol ESCALATE answer,
|
|
57
|
+
promoted the instant it is given, never batched to round close.
|
|
58
|
+
|
|
59
|
+
Gate crossings resolved from a **gate answer set** (`scripts/gate-answers.mjs`) are written here
|
|
60
|
+
with their source — `preset:ci`, `file:.shapeup/gate-answers.json` — and the set's
|
|
61
|
+
`authorized_by`. A headless run that ships must always be able to name the human behind its
|
|
62
|
+
sign-off; that name lives here and nowhere else.
|
|
63
|
+
|
|
64
|
+
The tech lead is the sole writer of both. `round-ledger.md` is simply the subset that must never
|
|
65
|
+
live only in a session or a gitignored file. No scope contracts → `round-ledger.md` is not
|
|
66
|
+
written, and `harness-run.md`'s "Decisions log" is the only ledger, exactly as in v0.2.6.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# The tiny lane (`--tiny`) — lane contract
|
|
2
|
+
|
|
3
|
+
An 8-gate pipeline for a one-file fix is indefensible, and pretending otherwise teaches users
|
|
4
|
+
to bypass the harness entirely. `--tiny` is the honest right-sizing: the full lane's ceremony
|
|
5
|
+
scales down, its *verification floor* does not.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
⏸ L0 (fit-check) → ▶ orient (light) → ▶ build (1–2 tasks) → T0 verify → ⏸ L4 (sign-off)
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What changes vs. the full lane
|
|
12
|
+
|
|
13
|
+
| | Full lane | Tiny lane |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| WIRE / wiring map | gate L1a.5 | **skipped** |
|
|
16
|
+
| Scope contracts | scope-architect | **skipped** |
|
|
17
|
+
| Spec tree | full DDD tree + board | **single-task board**, compiled directly |
|
|
18
|
+
| EVAL | once per round | **skipped** (`--no-eval` implied) |
|
|
19
|
+
| QA | post-PASS hunt | **skipped** (`--no-qa` implied) |
|
|
20
|
+
| Coach retro | post-L4 | **skipped** |
|
|
21
|
+
| Interactive gates | L0 L1a L1a.5 L1b L2 L3 L4 | **L0 + L4 only** |
|
|
22
|
+
|
|
23
|
+
## What is kept, non-negotiable
|
|
24
|
+
|
|
25
|
+
- **The envelope port.** The build is still a compile-order → task-executor(`--order`) →
|
|
26
|
+
ingest-result dispatch. Tiny never means "just edit the file inline".
|
|
27
|
+
- **T0 verification.** A tiny change still proves itself by running — never by claim. If there
|
|
28
|
+
is no runnable check at all, that is a fit-check failure, not a reason to skip T0.
|
|
29
|
+
- **The safety-spine and sandbox hooks.** Machine guards do not scale down.
|
|
30
|
+
- **The discovery ledger.** `lane: tiny` is recorded, so a later reader knows exactly what was
|
|
31
|
+
NOT checked (no EVAL verdict, no QA charter, no wiring assertion).
|
|
32
|
+
|
|
33
|
+
## The L0 fit-check (mandatory — this is the lane's own gate)
|
|
34
|
+
|
|
35
|
+
Tiny fits when **all** of these hold:
|
|
36
|
+
|
|
37
|
+
- the change touches ≤ ~2 files;
|
|
38
|
+
- no new domain concept;
|
|
39
|
+
- no new dependency;
|
|
40
|
+
- no new user-facing flow (changed copy/behavior inside an existing flow is fine).
|
|
41
|
+
|
|
42
|
+
If the pitch fails any of those, SAY SO and recommend the full lane. Proceed tiny anyway only
|
|
43
|
+
on the PO's explicit confirmation, and record the override in the ledger. The tiny lane must
|
|
44
|
+
never become the way around the gates — it is for changes where the gates would have nothing
|
|
45
|
+
to say.
|
|
46
|
+
|
|
47
|
+
## Mid-build escalation
|
|
48
|
+
|
|
49
|
+
If the change turns out not to be tiny while building — a discovery lands that needs a new
|
|
50
|
+
task, a substrate expansion is requested, T0 needs a fixture that doesn't exist — STOP and
|
|
51
|
+
escalate to the PO with a recommendation to restart in the full lane, carrying the orient
|
|
52
|
+
output and the ledger forward. Do not grow the tiny lane in place.
|