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,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_readme": "Tier C template (design spec addendum
|
|
2
|
+
"_readme": "Tier C template (design spec addendum \u00a7F.2). Copy to .claude/settings.local.json and edit \u2014 that file is gitignored and merges over the committed .claude/settings.json team defaults. Every key under env is optional; omit what you don't want to override. GATE L0.5/L0.8 resolves: /ship flags > settings.local.json (this file) > settings.json (team) > skill-shipped defaults. Model keys degrade one tier down (never hard-fail) when unavailable on your plan (R2). Budget keys are the two-level circuit breaker (DD-9): round_budget is outer (build+eval cycles), attempt_budget is inner (per-scope T0 attempts).",
|
|
3
3
|
"env": {
|
|
4
4
|
"SHAPEUP_ORCH_MODEL": "opus",
|
|
5
5
|
"SHAPEUP_EXEC_MODEL": "sonnet",
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"SHAPEUP_ATTEMPT_BUDGET": "5",
|
|
10
10
|
"SHAPEUP_DIGESTER_MODEL": "script"
|
|
11
11
|
},
|
|
12
|
-
"_permissions_readme": "The harness
|
|
12
|
+
"_permissions_readme": "The harness kernel ships with the plugin and therefore lives OUTSIDE your project. Under any permission mode short of bypassPermissions, running a script from outside the working directory needs approval \u2014 once per session interactively, and never in a headless run, where nobody is there to grant it. `npx shapeup-sdlc init` writes this block for you; it is reproduced here so you can see exactly what is being pre-approved. TWO Bash rules, because the trailing ` *` form requires at least one argument and the bare form is what covers a no-flag invocation. The leading `*` spans the install root, which differs between a marketplace install (a version-stamped cache directory) and a `--plugin-dir` checkout \u2014 that wildcard is what keeps the grant working across a plugin upgrade instead of silently expiring. Scope is one dependency-free, network-free script and nothing else \u2014 not a general Bash(node:*). The third entry, \"Workflow\", is what lets the tech-lead launch its run script without approving each launch; it is UNSCOPED (it authorises every dynamic workflow script in the project, not only this plugin's), so `npx shapeup-sdlc init --no-native-workflow` declines it and the harness stays fully usable interactively. This list is GENERATED by bin/lib/grant.mjs and verified by execution rather than by string comparison: npm run test:grant.",
|
|
13
13
|
"permissions": {
|
|
14
14
|
"allow": [
|
|
15
|
-
"Bash(node
|
|
16
|
-
"Bash(node
|
|
17
|
-
"
|
|
15
|
+
"Bash(node \"*/kernel/harness.mjs\" *)",
|
|
16
|
+
"Bash(node \"*/kernel/harness.mjs\")",
|
|
17
|
+
"Workflow"
|
|
18
18
|
]
|
|
19
19
|
}
|
|
20
20
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shapeup-sdlc-plugin",
|
|
3
3
|
"displayName": "ShapeUp SDLC Plugin",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "3.0.0",
|
|
5
5
|
"description": "Shape Up SDLC harness for Claude Code: shaping, intake, orient, scope-mapping, building (T0-verified, sandboxed, scope-contracted), evaluation and QA skills orchestrated by a tech-lead.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Liberty Nguyen",
|
package/AGENTS.md
CHANGED
|
@@ -1,133 +1,80 @@
|
|
|
1
1
|
<!-- HARNESS_START -->
|
|
2
2
|
# Shape Up SDLC Local Harness
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
`hooks/sandbox-guard.mjs` denies every write outside the active scope's substrate, and
|
|
17
|
-
`hooks/gate-zerowork.mjs` blocks `Stop` on a run that left no receipt.
|
|
18
|
-
*Prevents: a worker acting on an order nobody compiled; a scope overwriting another's work.*
|
|
19
|
-
GATE L2 (`hooks/gate-l2.mjs`) is deliberately **advisory** — it reads the board from two
|
|
20
|
-
independent sources and warns when the once-per-round EVAL runs over unfinished tasks, but it
|
|
21
|
-
permits the call. The board is per-machine and the operator asked for the evaluation; see
|
|
22
|
-
`docs/design/adr/0001-consumer-file-organization.md` for why the denial was traded for a signal.
|
|
23
|
-
Sign-off itself is a file, not prose: `scripts/gate-answers.mjs` resolves each gate from a
|
|
24
|
-
schema-validated answer set (`ci` / `guarded` / `interactive`) and the orchestrator branches on
|
|
25
|
-
its exit code — 0 cross, 4 stop for the PO, 5 abort. Gates still emit their blocks and still
|
|
26
|
-
record a decision; what changes is that the decision's **source** is named in the ledger.
|
|
27
|
-
*Prevents: consent carried in a prompt paragraph, which gets paraphrased instead of acted on.*
|
|
28
|
-
2. **Progress is derived, never claimed.** Hill phase comes only from T0/T1/seesaw artifacts on
|
|
29
|
-
disk, and the evaluator must cite a T0 artifact it re-hashes itself. *Prevents: a worker
|
|
30
|
-
asserting "done" with nothing behind it.*
|
|
31
|
-
And **starting** is itself a fact on disk: `scripts/init-run.mjs` writes
|
|
32
|
-
`.shapeup/<slug>/receipt.json` as the run's first tool call, so a session that dispatched
|
|
33
|
-
the orchestrator and left no receipt is blocked at `Stop` by `hooks/gate-zerowork.mjs`.
|
|
34
|
-
*Prevents: the orchestrator describing its own pipeline in future tense and stopping — measured
|
|
35
|
-
at 29% acceptance with 10 escaped defects while reading like a clean run.*
|
|
36
|
-
3. **Parallel work cannot corrupt shared state.** Per-scope substrate write-whitelists are hook-
|
|
37
|
-
enforced, and exactly one script (`ingest-result.mjs`) performs every board/ledger/verdict
|
|
38
|
-
write. *Prevents: two executors rewriting the board, one's completions vanishing.*
|
|
39
|
-
|
|
40
|
-
Those three rest on one piece of plumbing — the **pure-skill architecture** (v1.0). The
|
|
41
|
-
orchestrator owns ALL pipeline management and talks to workers through two JSON envelopes: a
|
|
42
|
-
WorkOrder in (`compile-order.mjs`, schema-validated by a `validate-envelope.mjs` PreToolUse
|
|
43
|
-
hook) and a WorkResult out (applied by `ingest-result.mjs`). Worker skills contain craft only —
|
|
44
|
-
zero pipeline knowledge; everything they used to write into shared files they now return as data
|
|
45
|
-
(D6 closed: single-writer is mechanically true). Treat the envelope as an implementation detail:
|
|
46
|
-
it is what makes 1–3 mechanically true, and it should never be the first thing a user learns.
|
|
4
|
+
## Enforcement model
|
|
5
|
+
|
|
6
|
+
A three-phase Shape Up loop orchestrated by `/tech-lead`. Invariants live in the runtime, not this file — expect hook denials, not arguments.
|
|
7
|
+
|
|
8
|
+
Skills and commands are named short throughout this file; every one of them resolves only under the plugin's namespace — `Skill(shapeup-sdlc-plugin:orient)`, `/shapeup-sdlc-plugin:ship`. A bare name is not a typo you get a warning for: an unknown skill name is rejected upstream of the hook layer, so the dispatch fires no hook, leaves no decision row, and is answered by improvisation.
|
|
9
|
+
|
|
10
|
+
- Hook-denied: dispatching a worker without a schema-valid WorkOrder, writing outside the scope's substrate, stopping a run with no receipt (the run's first act writes one).
|
|
11
|
+
- Attested, not assumed: a dispatch leaves a receipt naming the skill that ran, and ingest refuses an orchestrated result that has none. A dispatch that fails is answered by the sub-agent improvising the craft, which every other check accepts — so "the artifact exists" is not evidence that the shipped skill produced it. `--no-receipt-check` is the way through when the receipt channel itself fails.
|
|
12
|
+
- GATE L2 is advisory — warns when EVAL runs over unfinished tasks, permits the call (per-machine board, operator asked; ADR-0001) — a signal, not a bug.
|
|
13
|
+
- Sign-off is a file: each gate resolves from the answer set (`ci`/`guarded`/`interactive`) — cross, stop for the PO, or abort; the decision's source is ledgered.
|
|
14
|
+
- **Your scope cut decides your concurrency, not the dial.** Two scopes that both declare a write to one path never build at the same time: `shared` substrate is the sanctioned escape from disjointness, and an edit is read-modify-write, so concurrent writers silently drop each other's work. An entry point listed as writable by five scopes therefore builds five scopes one at a time whatever `--parallel-scopes` says. The run states the ceiling its contracts actually permit before dispatching anything, as a BUILD-order line — a peak below that ceiling is a dispatch problem, a ceiling below the dial is a scope-cut problem, and only the second is fixable by re-cutting. The fix is a cut where exactly one scope owns each entry point. Note the ceiling is narrated, not gated: it does not travel in the ⏸ L1b block, so an unattended run carries it only in its log.
|
|
15
|
+
- The build+eval loop breaks only three ways ✦: EVAL PASS → QA → Ship; outer `round_budget` exhausted; opt-in `wall_clock_budget_s` tripped (the wall-clock axis event counters miss). Budget trips route to GATE H — ship what's green, never kill the run from outside. A scope exhausting its per-scope `attempt_budget` (T0 attempts) queues a GATE H proposal, never blocks the round.
|
|
47
16
|
|
|
48
17
|
### Phase 1 — Shaping (`/shapeup`)
|
|
49
18
|
1. Set Boundaries → `/shapeup shaping`
|
|
50
19
|
2. Find the Elements → `/shapeup breadboarding`
|
|
51
20
|
3. Risks & Rabbit Holes → `/shapeup spike`
|
|
52
|
-
|
|
21
|
+
(The completed pitch is formed by `shaping.md` + `breadboard.md`)
|
|
53
22
|
|
|
54
23
|
### Phase 2 — Betting (PO governance, no skill)
|
|
55
|
-
|
|
24
|
+
Betting Table: PO decides; rejected pitches loop back to raw idea.
|
|
56
25
|
|
|
57
|
-
### Phase 3 — Building
|
|
26
|
+
### Phase 3 — Building
|
|
58
27
|
| Step | Gate | Action |
|
|
59
28
|
|------|------|--------|
|
|
60
|
-
| Kick-off | ⏸ **L0** — Intake & Config (L0.8 model/budget matrix) | `/translator` if non-English |
|
|
61
|
-
| Orient (Scout) | ⏸ **L1a** — Orient Review |
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
(`shapeup/<slug>/scopes/*.md`);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Non-regression on older specs — every arm is skipped when its artifact is absent.
|
|
29
|
+
| Kick-off | ⏸ **L0** — Intake & Config (L0.8 model/budget matrix) + worker roster ✧ | `/translator` if non-English |
|
|
30
|
+
| Orient (Scout) | ⏸ **L1a** — Orient Review | `/orient` |
|
|
31
|
+
| Analyze | — (reviewed at L1b) | `/ba-pitch-analyzer` (`analyze`): spec tree + board (UC + Invariants + Test Surface ★); before Wire (needs its use cases) |
|
|
32
|
+
| Wire | ⏸ **L1a.5** — Wiring Review ✚ | `/solution-architect` (`wire`): sole writer of committed `wiring-map.md` — per-UC engine → seam → entry-point call site → affordance, per `project-profile.md` |
|
|
33
|
+
| Map Scopes | ⏸ **L1b** — Board Review (+ substrate disjointness lint) | `/scope-architect` (scope contracts ✦ — sole writer); traceability oracle advisory ✚ |
|
|
34
|
+
| Build Vertically | ⏸ **L2** — Board 100% ✅ + T0-green ✦ | per dispatch: compile order → `/task-executor` (--order) → ingest result; T0-verified per attempt (fixtures + DB probe + seesaw ✦), substrate-sandboxed ✦. Scopes build **concurrently** ✦ — `--parallel-scopes N` caps it (default 4), a scope is released the moment its own dependencies are green, and a scope green in this round is skipped rather than rebuilt |
|
|
35
|
+
| EVAL (once per round) | ⏸ **L3** — Verdict | `/spec-evaluator` (--order): spec- + test-surface-conformance ★, T0 citation ✦; refuted boxes/verdict applied by ingest |
|
|
36
|
+
| FAIL → round r+1 | — | regression rule ★: bugs + full Test Surface of touched UC |
|
|
37
|
+
|
|
38
|
+
✦ = requires scope contracts (`shapeup/<slug>/scopes/*.md`); ✚ = requires the spine artifacts (`requirements.md`, `wiring-map.md`, `project-profile.md`). Traceability stays advisory until `covers:` is populated. Absent artifact ⇒ arm skipped (non-regression).
|
|
39
|
+
|
|
40
|
+
✧ **Two refusals, and they answer different questions.** Opening a run refuses outright when the worker skills are not on disk — the roster comes from the schema that defines it, so it cannot drift from a hand-kept list. That alone passes green on the two states that actually happen (installed but disabled, or a different version loaded), so the run's first act is one live canary dispatch, and the evidence is the hook layer's rather than the sub-agent's account of it. A run that cannot reach its workers stops before it spends anything, instead of reporting phases complete while none of the shipped craft was applied.
|
|
41
|
+
|
|
74
42
|
|
|
75
43
|
### QA Edge Hunt (`/qa-edge-hunter`, post-PASS, pre-ship)
|
|
76
|
-
|
|
77
|
-
- Skip with `--no-qa`.
|
|
44
|
+
**Q0** Preflight → **Q1** Charter (6 lenses − EVAL-covered) → **Hunt** (repro required, findings `~` → ledger) → report (no verdict, no score). Skip with `--no-qa`.
|
|
78
45
|
|
|
79
46
|
### Ship & Triage
|
|
80
|
-
- **SHIP S.0 / GATE H** —
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
- **RLHF (Coach Retro)** — Post-sprint feedback from L4 Gate is processed by `/coach`, which runs a categorization gate (GATE COACH-1 — asks the PO which skill each rule belongs to, never assumes) and files each rule under the responsible skill in `shapeup/knowledge-base/<skill>.md`. These files are **committed** (not the gitignored `.shapeup/` run-trace), so the whole team inherits them on `git pull`. The `/tech-lead` automatically invokes `/coach` when it receives human feedback during the Ship Gate. Coachable skills — each reads its own file at the top of its next run — are `/task-executor` (Phase 1), `/ba-pitch-analyzer` (Phase 1), and `/qa-edge-hunter` (Phase Q1). `/spec-evaluator` is deliberately not coachable (single-judge rule: the KB is guidance, never an invariant). Feedback whose root cause is the mechanism itself (a gate, hook, or skill-contract defect) is categorized `harness-defect` at GATE COACH-1 and filed to the committed defect register (`knowledge-base/harness-defects.md`) as a drafted raw idea for the Betting Table — read by no worker, never worker steering.
|
|
85
|
-
- Post-fix: `eval --single-pass` → `qa --recheck` (only re-probes promoted items ✦).
|
|
86
|
-
- Remaining `~` findings + new feedback → new raw idea (debt-free).
|
|
47
|
+
- **SHIP S.0 / GATE H** — `/scope-hammer`: census (QA findings + discovered ledger + attempt-budget proposals ✦) → baseline comparison (never the ideal) → cut list; TL/PO promotes selected items only.
|
|
48
|
+
- ⏸ **L4** — Ship Sign-off (shows QA status ★).
|
|
49
|
+
- **Coach retro** — L4 feedback → `/coach`; GATE COACH-1 asks the PO which skill owns each rule (never assumes) → committed `shapeup/knowledge-base/<skill>.md` (team inherits on pull). Coachable: `/task-executor`, `/ba-pitch-analyzer`, `/qa-edge-hunter`; `/spec-evaluator` is not (single judge). Mechanism defects file to `knowledge-base/harness-defects.md` as Betting Table raw ideas, never worker steering.
|
|
50
|
+
- Post-fix: `eval --single-pass` → remaining `~` + new feedback → new raw idea.
|
|
87
51
|
|
|
88
52
|
### Discovered Tasks
|
|
89
|
-
|
|
53
|
+
Everything discovered funnels into `.shapeup/<slug>/discovery/ledger.md` (Orient, task-executor P3.7, QA); a new invariant triggers `ba --tasks-only --from-discovered` → `TS-INV-NN` Test Surface row ★.
|
|
90
54
|
|
|
91
55
|
### Architectural Invariants
|
|
92
|
-
- **Single judge** — verdict belongs to `spec-evaluator`; QA has no verdict
|
|
56
|
+
- **Single judge** — verdict belongs to `spec-evaluator`; QA has no verdict, no score.
|
|
93
57
|
- **EVAL exactly once per round** — QA sits after PASS, outside the loop.
|
|
94
|
-
- **Ledger = single source of truth** —
|
|
95
|
-
- **QA is a level-up, not a gate** — `--no-qa`
|
|
96
|
-
- **Role separation** — Evaluator grades, task-executor fixes, QA discovers
|
|
97
|
-
- **
|
|
98
|
-
|
|
99
|
-
never blocks the round. A third, opt-in `wall_clock_budget_s` breaker (`budget-check.mjs`,
|
|
100
|
-
enforced by `hooks/gate-deadline.mjs`) covers the axis the other two cannot see — both count
|
|
101
|
-
events, so neither notices a single round running for half an hour. Tripping it routes to
|
|
102
|
-
GATE H rather than killing the run: a run killed from outside ships nothing, a run that trips
|
|
103
|
-
its own breaker ships what is green.
|
|
104
|
-
- **Hill phase is mechanical, never self-reported ✦** — derived only from T0/T1/seesaw facts.
|
|
105
|
-
- **Envelope port (v1.0)** — every worker dispatch is WorkOrder in / WorkResult out; shared
|
|
106
|
-
state is written only by `ingest-result.mjs`; a malformed envelope is denied by hook before
|
|
107
|
-
it reaches a worker. Workers are stateless and pipeline-blind by construction.
|
|
108
|
-
|
|
109
|
-
## Installed Skills
|
|
110
|
-
|
|
111
|
-
- **shapeup**: Run Shape Up workflows before writing code (S1-S4, B1-B5).
|
|
112
|
-
- **ba-pitch-analyzer**: The spec-analyzer — pitch → DDD spec tree + board, one craft with five order-selected operations (analyze | generate-board | reconcile | retrofit-surface | coverage); graph math and audits delegated to `board-derive.mjs`/`spec-lint.mjs`; the `coverage` op writes the SHARED requirement registry (`requirements.md`) for covers-closure; stateless pure worker.
|
|
113
|
-
- **scope-architect**: Sole writer of committed scope contracts (`scopes/*.md`) — import-graph slicing by flow, write-whitelist substrates, affordance manifests, fixtures; map-scopes | remap | split-scope operations.
|
|
114
|
-
- **solution-architect**: Sole writer of the committed wiring map (`wiring-map.md`) at gate L1a.5 — per-UC engine → seam → entry-point call site → player-visible affordance, resolved against `project-profile.md`; the reachability input `trace-lint.mjs` checks so no engine ships orphaned; `wire` operation; stateless pure worker.
|
|
115
|
-
- **task-executor**: Implement a work order's acceptance criteria exactly — WorkOrder in, code + WorkResult out; zero-memory, substrate-sandboxed, Layer 1/2/3 UI rules; never writes boards/ledgers/run-state.
|
|
116
|
-
- **spec-evaluator**: The single judge — evaluates the running app against the committed spec; verdict + refuted boxes return as data; requires a T0 artifact citation and grades UI affordance-only on scoped specs.
|
|
117
|
-
- **qa-edge-hunter**: Exploratory QA hunt.
|
|
118
|
-
- **translator**: Bilingual Vietnamese/English gate at intake.
|
|
119
|
-
- **tech-lead**: Orchestrate runs — envelope port (compile-order → dispatch → ingest-result), two-level circuit breaker, T0/seesaw-verified build rounds, mechanical hill derivation.
|
|
120
|
-
- **coach**: Ingests L4 feedback, asks the PO to categorize each rule (GATE COACH-1), and files it under the responsible skill in committed `shapeup/knowledge-base/<skill>.md` for team-shared, read-back continuous learning (RLHF).
|
|
121
|
-
- **advisor-protocol**: Adjudicates a worker's structured `ESCALATE` (design decision / spec ambiguity / substrate expansion) within a per-scope-per-round budget; persists answers to the committed round ledger.
|
|
122
|
-
- **scope-hammer**: GATE H — must-have census, baseline comparison, cut list + ship verdict; handles the normal stop and both circuit-breaker triggers.
|
|
58
|
+
- **Ledger = single source of truth** — every discovery flow writes only its own section.
|
|
59
|
+
- **QA is a level-up, not a gate** — `--no-qa` skips it; circuit breaker outranks the Hunter.
|
|
60
|
+
- **Role separation** — Evaluator grades, task-executor fixes, QA discovers.
|
|
61
|
+
- **Hill phase is mechanical ✦** — derived only from T0/T1/seesaw artifacts, never self-reported; the evaluator cites a T0 artifact it re-hashes itself.
|
|
62
|
+
- **Envelope port (v1.0)** — every dispatch is WorkOrder in / WorkResult out; shared state has exactly one writer (the ingest step); malformed envelopes are hook-denied. Workers: stateless, craft-only, pipeline-blind.
|
|
123
63
|
|
|
124
64
|
## Setup & Execution
|
|
125
65
|
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
|
|
66
|
+
- Orders/results live in `.shapeup/<slug>/orders|results/`; the envelope schemas ship inside the tech-lead skill.
|
|
67
|
+
- The plugin's run entry points need a one-time permission grant — `npx shapeup-sdlc init` writes it into `.claude/settings.json` (`permissions.allow`); without it a headless run stalls at step one. That grant is necessary, not sufficient: it covers the run's own deterministic entry points, not the generic file edits every worker skill makes constantly, or any command a worker reaches for beyond the grant's own exact shape. A truly unattended run also needs a Claude Code permission mode that covers those (`acceptEdits` at minimum) — the plugin cannot grant that on your behalf.
|
|
68
|
+
- Two storage tiers (ADR-0001): COMMITTED `shapeup/<slug>/` (shaping, spec, scopes, wiring-map, project-profile, requirements, hill, `REPORT.md` frozen at L4) vs GITIGNORED `.shapeup/` (board, orders/results, T0/eval/QA artifacts, ledgers, metrics, gate answers).
|
|
69
|
+
- Every run has a `run_id` — the receipt mints it, and orders, T0 artifacts, trial rows, agent-call journal rows and hook decisions all carry it. It is the only key that separates two runs of the same feature: everything else (`order_id`, round/attempt) repeats. It is **not** a time boundary — a relaunch resumes the same run and reuses the key, so one `run_id` legitimately spans every launch after a paused gate or a kill, with hours of wall clock between them, and `orders/<id>.json` is rewritten by each. Anything measuring elapsed time reads the append-only records, never the span of a key. SHIP S.7 exports the run's records as fact tables under `.shapeup/exports/<run_id>/` before the run trace is superseded; a WorkResult carries no `run_id` and reaches it through `order_id`.
|
|
70
|
+
- Every run projects a **run graph** — `.shapeup/<slug>/graph.jsonl`, append-only, written only by
|
|
71
|
+
`reduce graph`. Two families kept separate: work lineage (Run, Order, Result, Verdict, Trial,
|
|
72
|
+
GateDecision) and domain (Scope, UseCase, Requirement, Seam). It is derived from the artifacts,
|
|
73
|
+
never authored, so it can be deleted and rebuilt — and a run recorded before it existed backfills
|
|
74
|
+
on first touch. `--subgraph run` is the fast-forward as one bounded query; `--trace <node>` walks
|
|
75
|
+
a verdict back to the objective, the plan, the source, the execution record and the gate that
|
|
76
|
+
crossed it.
|
|
77
|
+
- Contracts: markdown on disk, JSON on the wire; a single library reads/writes the file form.
|
|
78
|
+
- Never hard-code a storage root — generated paths resolve through the shared path resolver.
|
|
79
|
+
- The traceability oracle emits `.shapeup/<slug>/trace/report.json` from the spine artifacts.
|
|
133
80
|
<!-- HARNESS_END -->
|