shapeup-sdlc 3.18.3 → 4.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 +2 -3
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +115 -56
- package/README.md +101 -143
- package/SECURITY.md +16 -25
- package/agents/orient.md +14 -0
- package/agents/qa-edge-hunter.md +13 -0
- package/agents/spec-evaluator.md +14 -0
- package/agents/task-executor.md +14 -0
- package/bin/init.mjs +13 -16
- package/bin/lib/grant.mjs +8 -19
- package/commands/build.md +9 -14
- package/commands/eval.md +3 -3
- package/commands/hammer.md +9 -5
- package/commands/retro.md +12 -11
- package/commands/scopes.md +1 -12
- package/commands/ship.md +45 -88
- package/commands/wire.md +1 -8
- package/hooks/dispatch-receipt.mjs +94 -8
- package/hooks/hooks.json +0 -41
- package/hooks/lib/decision.mjs +6 -9
- package/hooks/lib/tier.mjs +50 -0
- package/hooks/sandbox-guard.mjs +140 -64
- package/kernel/gate.mjs +203 -22
- package/kernel/harness.mjs +20 -67
- package/kernel/init/run.mjs +175 -523
- package/kernel/lib/contract.mjs +9 -93
- package/kernel/lib/floor.mjs +64 -0
- package/kernel/lib/paths.mjs +39 -112
- package/kernel/order.mjs +157 -0
- package/kernel/probe/digest.mjs +2 -38
- package/kernel/schemas/domain.schema.json +146 -1125
- package/kernel/schemas/work-order.schema.json +8 -4
- package/kernel/schemas/work-result.schema.json +1 -1
- package/kernel/verify/envelope.mjs +2 -2
- package/kernel/verify/skills.mjs +27 -8
- package/kernel/verify/t0.mjs +2 -2
- package/package.json +4 -2
- package/skills/building/SKILL.md +144 -0
- package/skills/building/resources/gates.md +76 -0
- package/skills/building/resources/guidance.md +23 -0
- package/skills/{translator/references/preservation-rules.md → building/resources/intake-preservation.md} +1 -1
- package/skills/building/resources/intake.md +157 -0
- package/skills/building/resources/orders.md +69 -0
- package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/doc-schemas.md +1 -1
- package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/task-generation.md +13 -13
- package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/test-surface.md +6 -7
- package/skills/building/resources/plan-scopes.md +95 -0
- package/skills/building/resources/plan-spec.md +102 -0
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/_index.tmpl.md +1 -1
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/assess-report.tmpl.md +10 -11
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/run-state.tmpl.md +4 -4
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/scope-summary.tmpl.md +2 -2
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/synthesis.tmpl.md +4 -4
- package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/usecase.tmpl.md +2 -2
- package/skills/building/resources/plan-wire.md +82 -0
- package/skills/building/resources/plan.md +98 -0
- package/skills/building/resources/retro-research.md +60 -0
- package/skills/building/resources/retro-scan.md +49 -0
- package/skills/building/resources/retro.md +225 -0
- package/skills/building/resources/rounds.md +78 -0
- package/skills/building/resources/stop.md +127 -0
- package/skills/orient/SKILL.md +37 -37
- package/skills/qa-edge-hunter/SKILL.md +14 -14
- package/skills/shapeup/SKILL.md +5 -5
- package/skills/shapeup/resources/breadboarding.md +1 -1
- package/skills/shapeup/resources/context-compaction.md +5 -5
- package/skills/shapeup/resources/shaping.md +1 -1
- package/skills/spec-evaluator/SKILL.md +17 -21
- package/skills/spec-evaluator/references/dimension-contract.md +1 -1
- package/skills/spec-evaluator/references/dimensions/completeness.md +3 -3
- package/skills/spec-evaluator/references/dimensions/spec-conformance.md +1 -1
- package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +5 -5
- package/skills/task-executor/SKILL.md +11 -15
- package/commands/hill.md +0 -10
- package/hooks/gate-intake.mjs +0 -109
- package/hooks/gate-zerowork.mjs +0 -349
- package/hooks/tier-guard.mjs +0 -162
- package/kernel/compile.mjs +0 -1419
- package/kernel/init/fit.mjs +0 -199
- package/kernel/init/run-args.mjs +0 -206
- package/kernel/lib/breadboard.mjs +0 -165
- package/kernel/probe/attempts.mjs +0 -161
- package/kernel/probe/concurrency.mjs +0 -535
- package/kernel/probe/eval.mjs +0 -405
- package/kernel/probe/hunt.mjs +0 -104
- package/kernel/probe/leg.mjs +0 -229
- package/kernel/probe/owner.mjs +0 -142
- package/kernel/probe/requirements.mjs +0 -328
- package/kernel/probe/resume.mjs +0 -1110
- package/kernel/probe/rounds.mjs +0 -115
- package/kernel/probe/staged.mjs +0 -83
- package/kernel/probe/stats.mjs +0 -477
- package/kernel/probe/t0.mjs +0 -115
- package/kernel/reduce/board.mjs +0 -350
- package/kernel/reduce/graph.mjs +0 -482
- package/kernel/reduce/hill.mjs +0 -322
- package/kernel/reduce/ingest.mjs +0 -767
- package/kernel/reduce/leftovers.mjs +0 -159
- package/kernel/reduce/ship.mjs +0 -529
- package/kernel/reduce/snapshot.mjs +0 -291
- package/kernel/reduce/verdict.mjs +0 -172
- package/kernel/report/export.mjs +0 -384
- package/kernel/report/facts.mjs +0 -234
- package/kernel/verify/budget.mjs +0 -153
- package/kernel/verify/build.mjs +0 -428
- package/kernel/verify/dispatch.mjs +0 -114
- package/kernel/verify/spec.mjs +0 -975
- package/kernel/verify/trace.mjs +0 -604
- package/skills/ba-pitch-analyzer/SKILL.md +0 -204
- package/skills/coach/SKILL.md +0 -397
- package/skills/hill-chart/SKILL.md +0 -154
- package/skills/hill-chart/assets/dashboard.template.html +0 -1432
- package/skills/scope-architect/SKILL.md +0 -174
- package/skills/scope-hammer/SKILL.md +0 -231
- package/skills/solution-architect/SKILL.md +0 -158
- package/skills/tech-lead/SKILL.md +0 -151
- package/skills/tech-lead/references/gates.md +0 -605
- package/skills/tech-lead/references/protocol.md +0 -889
- package/skills/tech-lead/references/tiny-lane.md +0 -53
- package/skills/tech-lead/workflows/shapeup-run.js +0 -2187
- package/skills/translator/SKILL.md +0 -258
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/contract-patterns.md +0 -0
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/ddd-patterns.md +0 -0
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/integration-analysis.md +0 -0
- /package/skills/{ba-pitch-analyzer/references → building/resources/plan-references}/ux-behavior-patterns.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/api-feasibility.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/be-service.contract.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/offline-storage.contract.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/contracts/third-party-api.contract.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/context-map.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/event-choreography.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/migration-plan.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/cross-context/team-handoff.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/domain-model.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/feedback.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/integration.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task-board.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task-spike.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/task.tmpl.md +0 -0
- /package/skills/{ba-pitch-analyzer/assets/templates → building/resources/plan-templates}/ux-behavior.tmpl.md +0 -0
|
@@ -9,12 +9,11 @@
|
|
|
9
9
|
"SHAPEUP_ATTEMPT_BUDGET": "5",
|
|
10
10
|
"SHAPEUP_DIGESTER_MODEL": "script"
|
|
11
11
|
},
|
|
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:*).
|
|
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:*). There is no third entry: the run is driven by the loop in the session, so the plugin no longer asks for the unscoped \"Workflow\" token and leaves one you already have alone. 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
15
|
"Bash(node \"*/kernel/harness.mjs\" *)",
|
|
16
|
-
"Bash(node \"*/kernel/harness.mjs\")"
|
|
17
|
-
"Workflow"
|
|
16
|
+
"Bash(node \"*/kernel/harness.mjs\")"
|
|
18
17
|
]
|
|
19
18
|
}
|
|
20
19
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shapeup-sdlc-plugin",
|
|
3
3
|
"displayName": "ShapeUp SDLC Plugin",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.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
|
@@ -3,68 +3,137 @@
|
|
|
3
3
|
|
|
4
4
|
## Enforcement model
|
|
5
5
|
|
|
6
|
-
A three-phase Shape Up loop
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
- **The
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
- **
|
|
18
|
-
-
|
|
6
|
+
A three-phase Shape Up loop driven by `/ship` — the `building` skill, in your own session. The loop is guidance you follow; the runtime holds five things and nothing more, so expect hook denials and gate answers, not arguments:
|
|
7
|
+
|
|
8
|
+
- **The receipt.** Opening a run writes a receipt (with the run's id, the intake's digest and the plugin copy that answered), the launch record, and the pointer every hook reads. A run that left no receipt did not happen.
|
|
9
|
+
- **The gate resolver.** Every gate resolves from an answer set or stops for the PO, and the decision's source is written to a ledger. An answer chooses among the answers a gate allows; it never supplies the evidence that makes one allowed.
|
|
10
|
+
- **The T0 witness.** A scope's fixtures are run, scored against the last kept attempt, and the artifact is hashed. The tree moves forward only when the score strictly improves.
|
|
11
|
+
- **The write fence.** While an order has no result, a write outside that order's substrate is refused. Writing a committed file whose text names a run-trace path or a board id is refused at the write.
|
|
12
|
+
- **The dispatch receipts.** Each dispatch leaves a row naming the agent the host says ran, with the tokens, duration and model the host measured beside the model the call asked for, so "the artifact exists" is never mistaken for "the shipped worker produced it", and "the record asked for this model" is never mistaken for "this model ran".
|
|
13
|
+
|
|
14
|
+
Everything else in the workflow below — sequencing the phases, applying a worker's result to the board, counting attempts against the budget, linting the spec, the census, the ship report — is the loop's own discipline, written down in the skill and checked by nothing but the PO and the evaluator. Where this file says "the loop does X", no script verifies it.
|
|
15
|
+
|
|
16
|
+
- Hook-denied: dispatching a worker without a schema-valid WorkOrder; writing outside the live order's substrate; writing a path a different dispatch's order owns; writing a committed file whose text names a run-trace path or a board id.
|
|
17
|
+
- **The tier-direction rule is refused at the write.** A committed file cannot carry a `.shapeup/` path or a `TASK-NNN` id — boards renumber per machine and the run trace is gitignored, so either one resolves only where it was written. The knowledge base is outside the rule: those files are instructions, not references anyone resolves.
|
|
18
|
+
- **Attested, not assumed.** A dispatch leaves a receipt naming the plugin's own agent as the host resolved it. A dispatch that fails is answered by the sub-agent improvising the craft, which every other check accepts — so the receipt, not the artifact, is the evidence the shipped skill produced it.
|
|
19
|
+
- 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. The Round Close gate is advisory over unfinished tasks and warns instead of blocking, but a board with no tasks at all can never cross it; the Ship Sign-off gate reads the census file, the run's QA record (was a hunt owed, and did it run a charter or get an explicit `skip`) and the models on the dispatch receipts (no `exec` or `eval` worker ran below the floor; a model other than the one the launch record asked for is written into the gate's row, not refused) and nothing else before any answer set may say `ship`.
|
|
20
|
+
- **Every run ends on a record.** Closing a run writes its status, its cause and its timestamp, and retires the fence's pointer, so an ended run stops fencing the checkout. A `shipped` ending is refused unless a Ship Sign-off row of the same run says `ship`, and the record names that sign-off; `escalated` and `aborted` need none. A gate waiting for the PO records no close by design — it is answered in the session that reached it.
|
|
21
|
+
- **Your scope cut decides your concurrency.** Two scopes that both declare a write to one path never build at the same time: an edit is read-modify-write and concurrent writers silently drop each other's work. The fence enforces each scope's substrate; reading the contracts for overlap before releasing scopes together is the loop's job.
|
|
22
|
+
- The build+eval loop breaks only two ways: the evaluation passes → QA → Ship; or the outer `round_budget` is exhausted. A scope exhausting its per-scope `attempt_budget` queues a Cut-List Review proposal and never blocks the round; budget trips route to the Cut-List Review, so what is green ships and the run is never killed from outside.
|
|
23
|
+
|
|
24
|
+
### Workflow at a Glance
|
|
25
|
+
|
|
26
|
+
```mermaid
|
|
27
|
+
flowchart TD
|
|
28
|
+
Shaping["Phase 1 — Shaping\n(Set Boundaries, Find the Elements, Risks & Rabbit Holes)"]
|
|
29
|
+
Betting{"Phase 2 — Betting\nPO decides"}
|
|
30
|
+
Intake["Intake & Config"]
|
|
31
|
+
Orient["Orient Review"]
|
|
32
|
+
Requirements["Requirements + Analyze\n(reviewed at Board Review)"]
|
|
33
|
+
Wiring["Wiring Review"]
|
|
34
|
+
Board["Board Review"]
|
|
35
|
+
Round["BUILD round\n(dispatch, T0-verify)"]
|
|
36
|
+
Close["Round Close"]
|
|
37
|
+
Verdict["Verdict"]
|
|
38
|
+
QA["QA Edge Hunt"]
|
|
39
|
+
Cut["Cut-List Review"]
|
|
40
|
+
Ship["Ship Sign-off"]
|
|
41
|
+
Retro["Retro Ownership"]
|
|
42
|
+
|
|
43
|
+
Shaping --> Betting
|
|
44
|
+
Betting -- bet --> Intake
|
|
45
|
+
Betting -- reject --> Shaping
|
|
46
|
+
Intake --> Orient --> Requirements --> Wiring --> Board --> Round
|
|
47
|
+
Round --> Close --> Verdict
|
|
48
|
+
Verdict -- FAIL --> Round
|
|
49
|
+
Verdict -- PASS --> QA --> Cut
|
|
50
|
+
Round -- "round_budget exhausted" --> Cut
|
|
51
|
+
Cut --> Ship --> Retro
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Gate names
|
|
55
|
+
|
|
56
|
+
Every gate below pauses the run for a PO decision unless a pre-recorded gate-answer preset
|
|
57
|
+
resolves it (`ci`/`guarded`/`interactive`). This document and the commands call a gate by its
|
|
58
|
+
plain name; the last column is the machine id the same gate carries in `decisions.jsonl`,
|
|
59
|
+
`gates.jsonl` and any gate-answers file, and is the only place an id appears here.
|
|
60
|
+
|
|
61
|
+
| Gate | What it checks | Who answers | Id in ledgers and answer files |
|
|
62
|
+
|------|-----------------|-------------|------|
|
|
63
|
+
| Intake & Config | Model/budget matrix set, worker roster confirmed on disk | PO | `L0` |
|
|
64
|
+
| Orient Review | The Scout's code-surface map and spike findings, before any board exists | PO | `L1a` |
|
|
65
|
+
| Wiring Review | `wiring-map.md` — every use case traced to its seam and entry point | PO | `L1a.5` |
|
|
66
|
+
| Board Review | The scope board and substrate disjointness — where scope is actually decided | PO | `L1b` |
|
|
67
|
+
| Round Close | Board 100% done and T0-green, before the round's work goes to evaluation (see note) | PO | `L2` |
|
|
68
|
+
| Verdict | The evaluator's PASS/FAIL judgment for the round | PO | `L3` |
|
|
69
|
+
| QA Edge Hunt | Exploratory findings outside what the evaluation already probed — never a verdict | PO | `QA` |
|
|
70
|
+
| Cut-List Review | The stop census and its baseline comparison — what ships, what's cut | TL/PO | `H` |
|
|
71
|
+
| Ship Sign-off | Final go/no-go, gated on the Cut-List Review's census | PO | `L4` |
|
|
72
|
+
| Retro Ownership | Which skill owns each retro rule, before it's written to the knowledge base | PO | `COACH-1` |
|
|
73
|
+
|
|
74
|
+
**Note on Round Close:** a board with literally zero tasks can never auto-proceed here — the resolver forces
|
|
75
|
+
a stop for the PO no matter what a preset says ("board 100%" of nothing proves nothing). A board
|
|
76
|
+
with real tasks still unfinished *can* proceed past Round Close if the operator explicitly allows it; that
|
|
77
|
+
choice is recorded as a flagged `warn`, not a silent pass — a signal that evaluation ran over
|
|
78
|
+
incomplete work, not a bug in the harness.
|
|
79
|
+
|
|
80
|
+
Four phrases recur below instead of symbols:
|
|
81
|
+
|
|
82
|
+
- **Needs scope contracts** — the step requires `shapeup/<slug>/scopes/*.md`; the write fence is skipped, not failed, when no order carries a substrate.
|
|
83
|
+
- **Test Surface** — the per-use-case rows the evaluation grades and QA and Ship status report against.
|
|
84
|
+
- **Preflight** — the refusals made before planning is paid for: the worker roster and the model floor.
|
|
85
|
+
- **QA finding** — logged with no verdict and no score; QA discovers, it never blocks.
|
|
19
86
|
|
|
20
87
|
### Phase 1 — Shaping (`/shapeup`)
|
|
21
88
|
1. Set Boundaries → `/shapeup shaping`
|
|
22
89
|
2. Find the Elements → `/shapeup breadboarding`
|
|
23
90
|
3. Risks & Rabbit Holes → `/shapeup spike`
|
|
24
|
-
(The completed pitch is formed by `shaping.md` + `breadboard.md`.
|
|
91
|
+
(The completed pitch is formed by `shaping.md` + `breadboard.md`. The loop finds the breadboard beside the pitch or in `shaping/`, takes one named with `--breadboard`, or reads it inline in a single pitch file, and hands it to every planning step. Each breadboard Place with UI affordances becomes its own screen in the spec, and a Place the shape will not build is deferred at Board Review with the PO's yes.)
|
|
25
92
|
|
|
26
93
|
### Phase 2 — Betting (PO governance, no skill)
|
|
27
94
|
Betting Table: PO decides; rejected pitches loop back to raw idea.
|
|
28
95
|
|
|
29
96
|
### Phase 3 — Building
|
|
97
|
+
Rows marked *pauses* stop for the PO at the named gate.
|
|
98
|
+
|
|
30
99
|
| Step | Gate | Action |
|
|
31
100
|
|------|------|--------|
|
|
32
|
-
| Kick-off |
|
|
33
|
-
| Orient (Scout) |
|
|
34
|
-
| Requirements | — (reviewed at
|
|
35
|
-
| Analyze | — (reviewed at
|
|
36
|
-
| Wire |
|
|
37
|
-
| Map Scopes |
|
|
38
|
-
| Build Vertically |
|
|
39
|
-
|
|
|
40
|
-
| FAIL → round r+1 | — | regression rule
|
|
101
|
+
| Kick-off | *pauses* at **Intake & Config** — the worker roster is checked first (preflight) | `/ship intake` — a non-English pitch is made English by the loop itself: `<name>.en.md` + a glossary, and the run opens on the copy |
|
|
102
|
+
| Orient (Scout) | *pauses* at **Orient Review** | `/orient` |
|
|
103
|
+
| Requirements | — (reviewed at Board Review) | **plan** (`requirements`), done by `/ship`'s loop in its own session, no sub-agent: the pitch's clauses → committed `requirements.md`, one atomic clause per `REQ-<n>` row naming the pitch clause it came from, ids assigned once and frozen |
|
|
104
|
+
| Analyze | — (reviewed at Board Review) | **plan** (`spec`): spec tree + board (use cases + invariants + Test Surface); before Wire (needs its use cases). An acceptance criterion that grades a requirement carries `(covers: REQ-…)` — that clause is the edge the verdict travels back along |
|
|
105
|
+
| Wire | *pauses* at **Wiring Review** | **plan** (`wire`): committed `wiring-map.md` — per-use-case engine → seam → entry-point call site → affordance |
|
|
106
|
+
| Map Scopes | *pauses* at **Board Review** | **plan** (`scopes`): scope contracts (needs scope contracts). The loop reads the plan back before the gate: substrates disjoint, every scope anchored to a use case, every requirement graded by a criterion or claimed by a scope or marked `CUT (PO-approved)` — and prints the requirement → criterion table |
|
|
107
|
+
| Build Vertically | *pauses* at **Round Close** | per dispatch: write the order → open it for the fence → `/task-executor` (--order) → check the result's envelope → apply it. T0-verified per attempt, substrate-fenced (needs scope contracts). Scopes build concurrently where their contracts do not overlap (`--parallel-scopes N` caps it, default 4); a scope green in this round is skipped rather than rebuilt. Before evaluation the loop builds and launches the feature with the project profile's commands: a red step ends the round with no verdict and becomes the next round's bug |
|
|
108
|
+
| Evaluation (once per round) | *pauses* at **Verdict** | `/spec-evaluator` (--order): spec- and Test Surface conformance, T0 citation — the order names the dimensions it grades (the set the PO named at Intake & Config, else the set the spec calls for) and Ship Sign-off lists the ones left out. A PASS names every Test Surface row as its own criterion. A scope that did not go green in the round has its rows graded FAIL |
|
|
109
|
+
| FAIL → round r+1 | — | regression rule (Test Surface): bugs + full Test Surface of the touched use case. Every criterion the verdict graded FAIL reaches the round, whether or not the judge filed a bug for it, addressed to the scope that owns its use case |
|
|
41
110
|
|
|
42
|
-
|
|
111
|
+
Traceability stays advisory until `covers:` is populated. Absent artifact ⇒ arm skipped (non-regression).
|
|
43
112
|
|
|
44
|
-
|
|
113
|
+
**Planning runs under its own write fence.** Each of the four **plan** substeps is opened by an order that stamps that substep's write contract — nothing is dispatched. While one is open, the staged pitch and breadboard, the project profile, the run's receipts and ledgers and the order and result files are frozen, and each substep may write only its own artifact.
|
|
45
114
|
|
|
115
|
+
**Two preflight refusals, before anything is spent.** 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 — and when the launch record's `exec` or `eval` model is below the floor (sonnet or above; `qa` is not checked, and `eval` is not under `--no-eval`). A worker agent is defined with `model: inherit`, so the loop passes the launch record's model for the role on every dispatch, and the receipt records both the model the call asked for and the one the host says ran. Ship Sign-off reads the second: a worker that ran below the floor refuses `ship`, and a model other than the record's is written into the gate's row and the ship report — the record states what was asked for; only the receipts say what ran.
|
|
46
116
|
|
|
47
117
|
### QA Edge Hunt (`/qa-edge-hunter`, post-PASS, pre-ship)
|
|
48
|
-
**Q0** Preflight → **Q1** Charter (6 lenses −
|
|
118
|
+
**Q0** Preflight → **Q1** Charter (6 lenses − the ones the evaluation covered) → **Hunt** (repro required, QA findings → ledger) → report (no verdict, no score). Skip with `--no-qa`. A hunt that reached the app and ran no charter is a failed hunt: the loop sends it back once, and the report says `not-hunted`, never that QA ran. A run whose round passed cannot cross Ship Sign-off with `ship` unless the hunt ran a charter or the QA Edge Hunt gate was answered `skip` — a ledgered decision, not a silent omission.
|
|
49
119
|
|
|
50
120
|
### Ship & Triage
|
|
51
|
-
- **
|
|
52
|
-
-
|
|
53
|
-
- **
|
|
54
|
-
- Post-fix: `eval --single-pass` → remaining
|
|
121
|
+
- **Cut-List Review** — `/hammer` (`/ship stop`), done by the loop in its own session, no sub-agent: census (QA findings + discovered ledger + attempt-budget proposals; every claim names the file it came from — ownership comes from the scope contracts, exhaustion from the dispatch receipts) → baseline comparison (never the ideal) → cut list; TL/PO promotes selected items only. The census is written as data and Ship Sign-off reads that file — and the run's QA record and the models on its dispatch receipts, nothing else — before any answer set may say `ship`. The loop then writes the ship report (`REPORT.md`, frozen at Ship Sign-off: a shipped FAIL says so in its first line) and closes the run with its verdict.
|
|
122
|
+
- **Ship Sign-off** (shows QA status).
|
|
123
|
+
- **Retro** — Ship Sign-off feedback → `/retro`, done by the loop itself; the Retro Ownership gate asks the PO which skill owns each rule (never assumes) → committed `shapeup/knowledge-base/<name>.md` (team inherits on pull). Categories: `/task-executor`, `/qa-edge-hunter`, `/orient`, **plan** (read at every planning step), and **building** (the loop's workflow guidance read at Intake & Config, plus suggested values it confirms before pinning); `/spec-evaluator` is not (single judge) and neither is the stop census. **Guidance never decides a gate**: a rule may add a question or a check to a gate block, never an answer, a skip or a wider substrate. `/retro --scan` seeds the same files from the project on disk before the first run, and `/retro --research <stack>` from the platform's official documentation when there is nothing on disk yet (a source, never a verification: nothing it reads runs until the PO pins it at Intake & Config), optional, every rule confirmed at Retro Ownership.
|
|
124
|
+
- Post-fix: `eval --single-pass` → remaining QA findings + new feedback → new raw idea.
|
|
55
125
|
|
|
56
126
|
### Discovered Tasks
|
|
57
|
-
Everything discovered funnels into `.shapeup/<slug>/discovery/ledger.md` (Orient, task-executor
|
|
127
|
+
Everything discovered funnels into `.shapeup/<slug>/discovery/ledger.md` (Orient, task-executor, QA); the loop appends each worker's discoveries from its result. A new invariant triggers a **plan** `spec` step in `reconcile` mode → `TS-INV-NN` Test Surface row.
|
|
58
128
|
|
|
59
129
|
### Architectural Invariants
|
|
60
130
|
- **Single judge** — verdict belongs to `spec-evaluator`; QA has no verdict, no score.
|
|
61
|
-
- **
|
|
62
|
-
- **Ledger = single source of truth** — every discovery flow writes only its own section.
|
|
63
|
-
- **QA is a level-up, not a gate** — `--no-qa` skips it;
|
|
131
|
+
- **Evaluation exactly once per round** — QA sits after PASS, outside the loop.
|
|
132
|
+
- **Ledger = single source of truth** — every discovery flow writes only its own section, and the loop is the only writer of it.
|
|
133
|
+
- **QA is a level-up, not a gate** — it never blocks on what it finds; `--no-qa` or a `skip` answer skips it on the record; the round budget outranks the Hunter. What it cannot do is go missing unrecorded: Ship Sign-off refuses `ship` over an owed hunt that never ran.
|
|
64
134
|
- **Role separation** — Evaluator grades, task-executor fixes, QA discovers.
|
|
65
|
-
- **
|
|
66
|
-
- **
|
|
67
|
-
- **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.
|
|
135
|
+
- **Envelope port** — every dispatch is WorkOrder in / WorkResult out; a malformed order is hook-denied; the loop checks a result against the schema before it applies it. Workers: stateless, craft-only, pipeline-blind.
|
|
136
|
+
- **The witness is mechanical** — a verdict that cites T0 cites an artifact whose hash the evaluator re-computes; a green T0 is evidence about the fixtures, not about whether the feature was built.
|
|
68
137
|
|
|
69
138
|
## Setup & Execution
|
|
70
139
|
|
|
@@ -76,24 +145,14 @@ Everything discovered funnels into `.shapeup/<slug>/discovery/ledger.md` (Orient
|
|
|
76
145
|
tells you, because trusting a directory to run code from is your decision to make, never a package's
|
|
77
146
|
to make for you. Above workspace trust sits Claude Code's own **auto-mode classifier**, which can
|
|
78
147
|
still block a call the grant already covers, invisibly to anything this plugin ships — no rule or
|
|
79
|
-
hook here can see it, let alone override it. When either layer stops an automated run, the
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
- **
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
- Every run projects a **run graph** — `.shapeup/<slug>/graph.jsonl`, append-only, written only by
|
|
88
|
-
`reduce graph`. Two families kept separate: work lineage (Run, Order, Result, Leg, Verdict,
|
|
89
|
-
Trial, GateDecision) and domain (Scope, UseCase, Requirement, Seam). It is derived from the artifacts,
|
|
90
|
-
never authored, so it can be deleted and rebuilt — and a run recorded before it existed backfills
|
|
91
|
-
on first touch. `--subgraph run` is the fast-forward as one bounded query; `--trace <node>` walks
|
|
92
|
-
a verdict back to the objective, the plan, the source, the execution record and the gate that
|
|
93
|
-
crossed it.
|
|
94
|
-
- `/hill-chart` (skill `hill-chart`, not a pipeline worker — invoked directly, like `shapeup`) renders both the committed hill shards (`shapeup/<slug>/hill/<scope-id>.yml`, the mechanical phase from the invariant above) and the local run graph as one dashboard: a portfolio card per pitch, and per-pitch a Hill Chart, an attention list, a scope board, round history, and the run graph one click deeper. A pitch whose local run trace was cleaned up after shipping still renders — marked Archived — from its committed hill shards alone.
|
|
95
|
-
- Contracts: markdown on disk, JSON on the wire; a single library reads/writes the file form.
|
|
148
|
+
hook here can see it, let alone override it. When either layer stops an automated run, drive the
|
|
149
|
+
Build step by hand — write the order, dispatch, check the result, run T0 — one call at a time, until
|
|
150
|
+
the run can resume unattended again.
|
|
151
|
+
- Two storage tiers: COMMITTED `shapeup/<slug>/` (shaping, spec, scopes, wiring-map, project-profile, requirements, `REPORT.md` frozen at Ship Sign-off) vs GITIGNORED `.shapeup/` (board, orders/results, T0/eval/QA artifacts, ledgers, metrics, gate answers, and the launch record).
|
|
152
|
+
- **Opening a run stages nothing.** The run is driven by the loop in your session, so there is no script to copy into your project and no launch to authorise beyond the two kernel Bash rules; opening writes the run's own trace and the **launch record** (`.shapeup/<slug>/run-args.json` — the models, budgets, dial and skip switches the run was launched with), and a run already open keeps the record it has.
|
|
153
|
+
- **A write the substrate does not cover is denied for as long as the dispatch is in flight, and no longer.** A dispatch is live from the moment its order is written until a result for *that* dispatch lands. The fence is armed by a pointer the loop sets when it opens an order, and it is enforced only while the pointer exists on disk: a missing pointer allows every write, which is why the loop sets and retires it through a command that reads it back instead of writing it by hand. **Every close retires the pointer**, so an escalated or aborted run stops fencing the checkout the moment it ends. An order the run left unanswered stays genuinely unresolved — un-fenced, but not done — until re-opening the run with `--force` writes a synthetic result for it, which is also what lets a count of attempts tell work nobody did apart from work that failed. What the fence gates is narrower than "the project": it is this assistant's own edit path (a direct file write or edit call) outside the live order's substrate; a shell command, `git`, or any other editor still writes straight through it. The committed tier is never a worker's to write: those files belong to the orchestrator, whose window is a phase boundary rather than the middle of somebody else's order.
|
|
154
|
+
- Every run has a `run_id` — the receipt mints it, and orders, T0 artifacts, trial 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 — `/ship` over an open run resumes the same run and reuses the key, so one `run_id` legitimately spans every session after a kill.
|
|
155
|
+
- Contracts: markdown on disk, JSON on the wire.
|
|
96
156
|
- Never hard-code a storage root — generated paths resolve through the shared path resolver.
|
|
97
|
-
- Hooks file under the project root they find above the shell's working directory (a run pointer, the committed tier, or a git boundary), never under the folder a worker happened to `cd` into — so a sub-folder shell neither splits the decision ledger nor slips the substrate fence.
|
|
98
|
-
- The traceability oracle emits `.shapeup/<slug>/trace/report.json` from the spine artifacts.
|
|
157
|
+
- Hooks file under the project root they find above the shell's working directory (a run pointer, the committed tier, or a git boundary), never under the folder a worker happened to `cd` into — so a sub-folder shell neither splits the decision ledger nor slips the substrate fence.
|
|
99
158
|
<!-- HARNESS_END -->
|