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.
Files changed (135) hide show
  1. package/.claude/settings.local.example.json +20 -0
  2. package/.claude-plugin/marketplace.json +16 -0
  3. package/.claude-plugin/plugin.json +18 -0
  4. package/.env.shapeup.example +14 -0
  5. package/AGENTS.md +133 -0
  6. package/LICENSE +21 -0
  7. package/README.md +362 -0
  8. package/SECURITY.md +72 -0
  9. package/bin/init.mjs +329 -0
  10. package/commands/build.md +14 -0
  11. package/commands/eval.md +15 -0
  12. package/commands/hammer.md +12 -0
  13. package/commands/orient.md +11 -0
  14. package/commands/qa.md +12 -0
  15. package/commands/retro.md +13 -0
  16. package/commands/scopes.md +14 -0
  17. package/commands/shape.md +12 -0
  18. package/commands/ship.md +53 -0
  19. package/commands/wire.md +11 -0
  20. package/hooks/anti-rationalization.mjs +244 -0
  21. package/hooks/compact-snapshot.mjs +47 -0
  22. package/hooks/gate-deadline.mjs +151 -0
  23. package/hooks/gate-intake.mjs +110 -0
  24. package/hooks/gate-l2.mjs +161 -0
  25. package/hooks/gate-zerowork.mjs +264 -0
  26. package/hooks/hooks.json +118 -0
  27. package/hooks/lib/decision.mjs +183 -0
  28. package/hooks/safety-spine.mjs +296 -0
  29. package/hooks/sandbox-guard.mjs +172 -0
  30. package/hooks/session-rehydrate.mjs +109 -0
  31. package/hooks/slop-cleaner.mjs +176 -0
  32. package/oracles/_shared.mjs +46 -0
  33. package/oracles/http-oracle.mjs +155 -0
  34. package/oracles/index.mjs +36 -0
  35. package/oracles/process-oracle.mjs +146 -0
  36. package/oracles/snapshot-oracle.mjs +119 -0
  37. package/oracles/test-oracle.mjs +138 -0
  38. package/package.json +49 -0
  39. package/skills/advisor-protocol/SKILL.md +171 -0
  40. package/skills/ba-pitch-analyzer/SKILL.md +175 -0
  41. package/skills/ba-pitch-analyzer/assets/templates/_index.tmpl.md +84 -0
  42. package/skills/ba-pitch-analyzer/assets/templates/api-feasibility.tmpl.md +65 -0
  43. package/skills/ba-pitch-analyzer/assets/templates/assess-report.tmpl.md +127 -0
  44. package/skills/ba-pitch-analyzer/assets/templates/contracts/be-service.contract.tmpl.md +62 -0
  45. package/skills/ba-pitch-analyzer/assets/templates/contracts/offline-storage.contract.tmpl.md +92 -0
  46. package/skills/ba-pitch-analyzer/assets/templates/contracts/third-party-api.contract.tmpl.md +66 -0
  47. package/skills/ba-pitch-analyzer/assets/templates/cross-context/context-map.tmpl.md +64 -0
  48. package/skills/ba-pitch-analyzer/assets/templates/cross-context/event-choreography.tmpl.md +77 -0
  49. package/skills/ba-pitch-analyzer/assets/templates/cross-context/migration-plan.tmpl.md +104 -0
  50. package/skills/ba-pitch-analyzer/assets/templates/cross-context/team-handoff.tmpl.md +79 -0
  51. package/skills/ba-pitch-analyzer/assets/templates/domain-model.tmpl.md +79 -0
  52. package/skills/ba-pitch-analyzer/assets/templates/feedback.tmpl.md +87 -0
  53. package/skills/ba-pitch-analyzer/assets/templates/integration.tmpl.md +64 -0
  54. package/skills/ba-pitch-analyzer/assets/templates/run-state.tmpl.md +77 -0
  55. package/skills/ba-pitch-analyzer/assets/templates/scope-summary.tmpl.md +105 -0
  56. package/skills/ba-pitch-analyzer/assets/templates/synthesis.tmpl.md +215 -0
  57. package/skills/ba-pitch-analyzer/assets/templates/task-board.tmpl.md +35 -0
  58. package/skills/ba-pitch-analyzer/assets/templates/task-spike.tmpl.md +86 -0
  59. package/skills/ba-pitch-analyzer/assets/templates/task.tmpl.md +84 -0
  60. package/skills/ba-pitch-analyzer/assets/templates/usecase.tmpl.md +105 -0
  61. package/skills/ba-pitch-analyzer/assets/templates/ux-behavior.tmpl.md +65 -0
  62. package/skills/ba-pitch-analyzer/references/contract-patterns.md +152 -0
  63. package/skills/ba-pitch-analyzer/references/ddd-patterns.md +173 -0
  64. package/skills/ba-pitch-analyzer/references/doc-schemas.md +275 -0
  65. package/skills/ba-pitch-analyzer/references/integration-analysis.md +152 -0
  66. package/skills/ba-pitch-analyzer/references/task-generation.md +623 -0
  67. package/skills/ba-pitch-analyzer/references/test-surface.md +102 -0
  68. package/skills/ba-pitch-analyzer/references/ux-behavior-patterns.md +269 -0
  69. package/skills/ba-pitch-analyzer/scripts/board-derive.mjs +241 -0
  70. package/skills/ba-pitch-analyzer/scripts/spec-lint.mjs +239 -0
  71. package/skills/coach/SKILL.md +202 -0
  72. package/skills/orient/SKILL.md +262 -0
  73. package/skills/qa-edge-hunter/SKILL.md +369 -0
  74. package/skills/scope-architect/SKILL.md +111 -0
  75. package/skills/scope-hammer/SKILL.md +186 -0
  76. package/skills/shapeup/SKILL.md +403 -0
  77. package/skills/shapeup/resources/breadboard-reflection.md +88 -0
  78. package/skills/shapeup/resources/breadboarding.md +334 -0
  79. package/skills/shapeup/resources/context-compaction.md +240 -0
  80. package/skills/shapeup/resources/framing-doc.md +92 -0
  81. package/skills/shapeup/resources/kickoff-doc.md +95 -0
  82. package/skills/shapeup/resources/shaping.md +194 -0
  83. package/skills/shapeup/resources/spike.md +86 -0
  84. package/skills/solution-architect/SKILL.md +129 -0
  85. package/skills/spec-evaluator/README.md +93 -0
  86. package/skills/spec-evaluator/SKILL.md +213 -0
  87. package/skills/spec-evaluator/references/anti-leniency.md +50 -0
  88. package/skills/spec-evaluator/references/dimension-contract.md +126 -0
  89. package/skills/spec-evaluator/references/dimensions/_registry.md +40 -0
  90. package/skills/spec-evaluator/references/dimensions/completeness.md +102 -0
  91. package/skills/spec-evaluator/references/dimensions/integration.md +129 -0
  92. package/skills/spec-evaluator/references/dimensions/performance.md +48 -0
  93. package/skills/spec-evaluator/references/dimensions/security.md +60 -0
  94. package/skills/spec-evaluator/references/dimensions/spec-conformance.md +134 -0
  95. package/skills/spec-evaluator/references/dimensions/tdd-surface.md +110 -0
  96. package/skills/spec-evaluator/references/dimensions/test-surface-conformance.md +100 -0
  97. package/skills/spec-evaluator/references/probing.md +177 -0
  98. package/skills/spec-evaluator/references/report-schema.md +101 -0
  99. package/skills/spec-evaluator/references/verdict-ledger.md +92 -0
  100. package/skills/spec-evaluator/scripts/verdict-ledger.mjs +166 -0
  101. package/skills/task-executor/SKILL.md +194 -0
  102. package/skills/tech-lead/README.md +71 -0
  103. package/skills/tech-lead/SKILL.md +459 -0
  104. package/skills/tech-lead/references/delegation.md +254 -0
  105. package/skills/tech-lead/references/gates.md +379 -0
  106. package/skills/tech-lead/references/invocation.md +45 -0
  107. package/skills/tech-lead/references/ledger-schema.md +214 -0
  108. package/skills/tech-lead/references/round-protocol.md +184 -0
  109. package/skills/tech-lead/references/state-model.md +66 -0
  110. package/skills/tech-lead/references/tiny-lane.md +52 -0
  111. package/skills/tech-lead/schemas/domain.schema.json +2294 -0
  112. package/skills/tech-lead/schemas/gate-answers.schema.json +92 -0
  113. package/skills/tech-lead/schemas/work-order.schema.json +21 -0
  114. package/skills/tech-lead/schemas/work-result.schema.json +40 -0
  115. package/skills/tech-lead/scripts/aegis-digest.mjs +124 -0
  116. package/skills/tech-lead/scripts/budget-check.mjs +156 -0
  117. package/skills/tech-lead/scripts/compile-order.mjs +518 -0
  118. package/skills/tech-lead/scripts/fit-check.mjs +196 -0
  119. package/skills/tech-lead/scripts/gate-answers.mjs +338 -0
  120. package/skills/tech-lead/scripts/ingest-result.mjs +270 -0
  121. package/skills/tech-lead/scripts/init-run.mjs +326 -0
  122. package/skills/tech-lead/scripts/lib/argv.mjs +224 -0
  123. package/skills/tech-lead/scripts/lib/contract-md.mjs +481 -0
  124. package/skills/tech-lead/scripts/lib/is-main.mjs +82 -0
  125. package/skills/tech-lead/scripts/lib/paths.mjs +278 -0
  126. package/skills/tech-lead/scripts/lib/ratchet-tree.mjs +112 -0
  127. package/skills/tech-lead/scripts/run-snapshot.mjs +269 -0
  128. package/skills/tech-lead/scripts/ship-report.mjs +275 -0
  129. package/skills/tech-lead/scripts/stats.mjs +423 -0
  130. package/skills/tech-lead/scripts/t0-verify.mjs +470 -0
  131. package/skills/tech-lead/scripts/trace-lint.mjs +367 -0
  132. package/skills/tech-lead/scripts/validate-envelope.mjs +283 -0
  133. package/skills/translator/README.md +66 -0
  134. package/skills/translator/SKILL.md +258 -0
  135. package/skills/translator/references/preservation-rules.md +102 -0
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: scope-architect
3
+ description: "Use this skill to map, remap, or split the vertical scopes of a feature — Shape Up's \"map the scopes\" (step 8) as committed, mechanically enforceable contracts. Triggers on: \"map the scopes\", \"write the scope contracts\", \"scope contract\", \"remap this scope\", \"split this stuck scope\", \"the discovered tasks don't fit any scope\", \"re-slice the substrate\", or a tech-lead --order dispatch (operations map-scopes | remap | split-scope). Writes the committed scopes/*.md contracts by import-graph slicing along business flow, with write-whitelist substrates and e2e fixtures. NOT for decomposing a pitch into tasks (ba-pitch-analyzer) or cutting scope at ship time (scope-hammer)."
4
+ ---
5
+
6
+ # Scope Architect (pure worker v1.0)
7
+
8
+ **Slice by flow, never by directory — and write it as a contract a hook can enforce.**
9
+
10
+ Groups a feature's tasks into independent, vertically-sliced **scopes** and writes each as a
11
+ committed contract (`shapeup/<slug>/scopes/<scope-id>.md`) the rest of the
12
+ harness enforces mechanically: the sandbox hook denies writes outside a substrate, t0-verify
13
+ runs the fixtures, the evaluator asserts only against the affordance manifest. This skill is
14
+ the **sole writer** of scope contracts — a distinct authority from the planner (task
15
+ decomposition) and a distinct failure mode (directory-thinking, PA1) deserving its own
16
+ anti-rationalization table.
17
+
18
+ ## Input contract — the WorkOrder
19
+
20
+ | Field | What it is |
21
+ |---|---|
22
+ | `operation` | `map-scopes` (first slicing after the board exists) · `remap` (fold discovered items into scope contracts) · `split-scope` (re-slice one stuck scope) |
23
+ | `payload.feature` / `payload.spec_folder` | Slug + committed spec (read ux-behavior.md for manifests; usecases for flows) |
24
+ | `payload.tasks[]` | The board's tasks with their touched files — the slicing input |
25
+ | `payload.discovered_ledger` | (remap) items that fit no existing substrate |
26
+ | `payload.scope_id` | (split-scope) the stuck scope (`rounds_at_position ≥ 3`, or an approved substrate-expansion) |
27
+ | `substrate.allowed` | `scopes/*.md` + `scope-board.md` — your ONLY write surface |
28
+
29
+ ## Core process
30
+
31
+ ```
32
+ 1 SLICE build an import/business-flow graph over the tasks' touched files (grep heuristic
33
+ is fine; AST is an optimization). One scope = one call chain: the UI screen + the
34
+ API route + the use case + the repository it drives. Scopes aligning 1:1 with a
35
+ top-level directory (all-frontend, all-backend) FAIL — that is layer-thinking.
36
+ 2 CLASSIFY topology_type: LAYER_CAKE (thin balanced UI+backend) | ICEBERG (complexity on one
37
+ side) | CHOWDER (true strays with no shared flow — the one deliberate exception)
38
+ 3 CONTRACT per scope, write scopes/<scope-id>.md — MARKDOWN (ADR-0001): frontmatter for
39
+ scalars and [a, b] lists, a `## Affordances` table for affordance_manifest, and a
40
+ short `## Why this slice` paragraph. A reviewer must be able to read the substrate
41
+ in a PR; regeneration preserves prose under headings you do not own.
42
+ scope_id, topology_type, tasks[] — the stable join key is the scope
43
+ allowed_file_substrate[] — exact globs; the sandbox hook's
44
+ write-whitelist; wrong here =
45
+ a legitimate ESCALATE later
46
+ shared_substrate[] — files ≥2 scopes both touch;
47
+ every write there forces a full
48
+ seesaw run at the next gate
49
+ affordance_manifest — from ux-behavior.md state
50
+ tables: every interactive
51
+ element as {test_id, role} +
52
+ required_states [idle, loading,
53
+ success, error, empty]
54
+ e2e_verification_fixtures[] — the command(s)/spec file(s)
55
+ that drive this scope
56
+ end-to-end (T0 layer); too
57
+ speculative to fixture → mark
58
+ TBD and flag it, never invent
59
+ a fixture for unbuilt behavior
60
+ hill_phase: "UPHILL_UNKNOWN" — ALWAYS; phase is derived from
61
+ T0/T1/seesaw facts later,
62
+ never authored (DD-10)
63
+ 4 LINT node "${CLAUDE_PLUGIN_ROOT}/skills/ba-pitch-analyzer/scripts/spec-lint.mjs" --slug <slug>
64
+ → PA1 (directory alignment), PA2 (>~15 files), DISJOINT (undeclared overlap).
65
+ Fix reds by re-slicing, not by silencing.
66
+ 5 BOARD regenerate scope-board.md (scope_id, topology, task count, substrate size, lint)
67
+ ```
68
+
69
+ **remap:** a discovered item joins the nearest scope only if the flow matches (extend that
70
+ substrate minimally); otherwise propose a NEW scope — never silently widen an existing one.
71
+ **split-scope:** re-run step 1 on just that scope's task+file set → N new contracts; mark the
72
+ old one `superseded_by: [ids]` — never delete (branch and T0 history stay attributable).
73
+
74
+ ## Anti-rationalization table
75
+
76
+ | Excuse | Reality |
77
+ |---|---|
78
+ | "The discovered item obviously fits scope A" | Run the flow match. 'Obviously' is how substrates silently widen. |
79
+ | "One scope per directory is cleaner" | That's PA1 — a layer, not a flow. A scope must ship something a user can do. |
80
+ | "I'll widen the substrate a little so the doer stops escalating" | A wide substrate is no substrate. Split or add a shared_substrate entry, deliberately. |
81
+ | "This scope looks downhill, I'll set the phase" | hill_phase is UPHILL_UNKNOWN at write, always. Facts move dots, not authors. |
82
+ | "The old contract is superseded, delete it" | supersede-never-delete. History must stay attributable. |
83
+ | "Fixtures can come later, leave the field empty" | Fixture at contract time or an explicit TBD flag — silence is how T0 goes blind. |
84
+
85
+ ## Output contract — the WorkResult
86
+
87
+ `scopes/*.md` + `scope-board.md` in your substrate, then
88
+ `.shapeup/<slug>/results/<order-suffix>.json`: `status`, `artifacts[]` (the contracts
89
+ written/superseded), `escalates[]` (e.g. a discovered item implying a new UC — the planner's
90
+ territory), `deviations[]` (any lint warn left standing and why). You never touch task files,
91
+ `tasks/_index.md`, spec docs, or run-state.
92
+
93
+ ## Verification checklist
94
+
95
+ - [ ] Every scope crosses layers or is declared CHOWDER; spec-lint PA1 = 0 red
96
+ - [ ] Substrates disjoint except declared shared_substrate (DISJOINT = 0 red)
97
+ - [ ] Every interactive element in scope screens appears in exactly one affordance_manifest
98
+ - [ ] Every scope has fixtures or an explicit TBD flag
99
+ - [ ] Every hill_phase written is UPHILL_UNKNOWN; superseded contracts kept
100
+ - [ ] The WorkResult validates against `work-result.schema.json`
101
+
102
+ ## Invocation
103
+
104
+ ```bash
105
+ # Orchestrated — compile-order --operation map-scopes|remap|split-scope --worker scope-architect …
106
+ /scope-architect --order .shapeup/checkout-vnpay/orders/map-scopes.json
107
+
108
+ # Standalone shims (compile the same envelope)
109
+ /scope-architect --map shapeup/checkout-vnpay/
110
+ /scope-architect --split cart-creation shapeup/checkout-vnpay/
111
+ ```
@@ -0,0 +1,186 @@
1
+ ---
2
+ name: scope-hammer
3
+ description: "Use this skill whenever a Shape Up build run reaches its stop condition — the circuit breaker (round budget or a scope's attempt budget) trips, or all scopes finish and it's time to decide when to stop (step 11) — and needs a must-have census, a baseline-anchored cut list, and a ship verdict. Trigger on: \"scope hammer\", \"hammer this down to must-haves\", \"decide when to stop\", \"cut list vs baseline\", \"circuit breaker tripped, what do we ship\", \"compare against the baseline not the ideal\", \"GATE H\", \"census the open items\". Also triggers on tech-lead's GATE H at SHIP. Compares the product to the pitch's baseline (what customers live with today, not a perfect ideal) and returns a cut list + ship verdict."
4
+ ---
5
+
6
+ # Scope Hammer (GATE H — Decide When to Stop)
7
+
8
+ The mechanism behind Shape Up step 11: as the appetite/round budget runs out, cut back on
9
+ perfectionist ambitions by comparing the *actual* product to the **baseline** — what customers
10
+ live with today — not to a hypothetical perfect version. "Better than the baseline" is good
11
+ enough to ship; "not as good as I imagined" is not a reason to keep building.
12
+
13
+ **Why this is its own skill, not tech-lead prose.** GATE H census pulls from several sources
14
+ that accumulate over a whole run (QA findings, discovered-task ledger, advisor-protocol budget
15
+ overflows, per-scope inner-breaker trips) — a genuinely separate synthesis step from
16
+ orchestration. Splitting it out keeps `tech-lead` thin (it dispatches, this skill decides what
17
+ survives the hammer) and gives the census/cut-list/verdict logic one owner instead of being
18
+ re-derived inline at every SHIP.
19
+
20
+ ---
21
+
22
+ ## When this fires
23
+
24
+ ```
25
+ 1. All scopes reach FINISHED on the hill (design spec B2) → normal stop, post-QA-hunt.
26
+ 2. Outer circuit breaker trips: round_budget reaches 0 with scopes still uphill/downhill.
27
+ 3. Inner circuit breaker trips: a scope's attempt_budget (default 5) is exhausted without a
28
+ T0-green result → queued as a hammer PROPOSAL (design spec Blueprint A `hammer_proposals`),
29
+ judged here rather than immediately blocking the round.
30
+ ```
31
+ Any of the three routes to this skill; the difference is only what's in the census (case 1 has
32
+ no unresolved scopes; cases 2/3 do, and those become explicit CUT or CARRY candidates below).
33
+
34
+ ---
35
+
36
+ ## Workflow
37
+
38
+ ```
39
+ INPUT: run's finished/unfinished scopes + baseline + census sources
40
+
41
+ ⏸ GATE H0 │ Census ──────────────► collect every open item, classify must-have / nice-to-have
42
+
43
+ ⏸ GATE H1 │ Baseline Comparison ──► for each unresolved must-have, is the product still
44
+ │ better than the baseline without it?
45
+
46
+ ⏸ GATE H2 │ Cut List & Verdict ───► propose cuts (PO confirms), ship / carry-to-next-cycle verdict
47
+
48
+ ✅ Done └─► cut list + verdict handed to tech-lead SHIP; PO owns the final call
49
+ ```
50
+
51
+ ---
52
+
53
+ ## GATE H0 — Census
54
+
55
+ **Purpose:** Gather every open item into one list before judging any of them. Never judge
56
+ piecemeal — a partial view produces a wrong cut.
57
+
58
+ ```
59
+ H0.1 Unresolved scopes (breaker cases only):
60
+ - uphill/downhill scopes when round_budget hit 0 → CARRY candidates (their own hill
61
+ phase + open unknowns, from hill/<scope-id>.yml)
62
+ - scopes with hammer_proposals (attempt_budget exhausted) → CARRY candidates, tagged
63
+ with the T0 failure that stalled them (from the last red t0/verdicts/*.json)
64
+ H0.2 QA findings (qa-edge-hunter's hunt-report.md, when present) — all `~` by default.
65
+ H0.3 Discovered-task ledger entries still open (discovery/ledger.md, `[+]`/`~` unresolved).
66
+ H0.4 advisor-protocol budget-overflow flags (auto-resolved ESCALATEs logged for GATE H review).
67
+ H0.5 Classify every item: MUST-HAVE (the pitch's core problem is unsolved without it) vs
68
+ NICE-TO-HAVE (`~`, improves but doesn't block the core promise). Default to NICE-TO-HAVE
69
+ unless the item traces directly to a pitch boundary or a scope's business_goal — a
70
+ generous must-have list defeats the point of hammering.
71
+ ```
72
+
73
+ **GATE H0 Output:**
74
+ ```
75
+ ⏸ GATE H0 — Census
76
+ Must-have (unresolved) : [N] — [list, each with source: scope | QA | discovered | advisor-overflow]
77
+ Nice-to-have (~) : [M]
78
+ Carry candidates : [scopes still uphill/downhill, or exhausted attempt budget]
79
+ ```
80
+
81
+ ---
82
+
83
+ ## GATE H1 — Baseline Comparison
84
+
85
+ **Purpose:** The trade-off algorithm from step 11 — compare to the baseline (status quo the
86
+ customer suffers through today), never to a perfect ideal.
87
+
88
+ ```
89
+ H1.1 Resolve the baseline: shapeup/<slug>/shaping/baseline.md if present (written at
90
+ shaping time, design spec Blueprint F — first-class, not a pitch footnote). Absent →
91
+ degrade honestly: read the pitch's problem statement as the implicit baseline and flag
92
+ "baseline not first-class — comparison is approximate" in the report. Do not invent one.
93
+ H1.2 For each MUST-HAVE item from H0: "with this item cut/carried, is the shipped product
94
+ still strictly better than the baseline for the pitch's core problem?"
95
+ YES → safe to cut/carry — demote to a cut-list candidate anyway (H2 still asks the PO).
96
+ NO → this one item blocks shipping as-is; it is not hammer-cuttable. Options are:
97
+ fix it now (one more focused attempt, not a full extra round) or the run
98
+ genuinely fails the appetite — escalate to PO honestly, do not ship anyway.
99
+ H1.3 NICE-TO-HAVE items never block H1 — they are cut-list candidates by construction.
100
+ ```
101
+
102
+ ---
103
+
104
+ ## GATE H2 — Cut List & Verdict
105
+
106
+ **Purpose:** Turn H0+H1 into a decision, owned by the PO — this skill proposes, it never cuts
107
+ unilaterally.
108
+
109
+ ```
110
+ ⏸ GATE H2 — Cut List & Verdict
111
+ Baseline : [shapeup/<slug>/shaping/baseline.md | approximate — pitch problem statement]
112
+ Ship-blocking : [none | list of MUST-HAVE items that fail H1.2 — these are NOT cuttable]
113
+ Proposed cuts : [N nice-to-have + N cuttable must-have, each: item — source — one-line why safe]
114
+ Carry-forward : [scopes/items proposed for the next cycle's raw-idea list, debt-free]
115
+ Verdict : [SHIP now | SHIP after fixing ship-blocking items | CANNOT SHIP — escalate to PO]
116
+ ```
117
+ Ask (max 1): "Confirm this cut list? (approve all / list ids to keep / none)". PO can keep any
118
+ proposed cut — this skill never overrides that. On confirm, everything NOT kept becomes:
119
+ - Nice-to-haves + safe must-have cuts → carried to the discovery ledger as raw ideas
120
+ (debt-free — never silently dropped, never silently promoted back into scope).
121
+ - Ship-blocking items (if any survived because PO overrode SHIP anyway) → logged explicitly
122
+ as a known gap in the ship report, never hidden.
123
+
124
+ Authority boundary: this skill produces the proposal; `tech-lead` records the PO's decision in
125
+ the round-ledger and performs the actual SHIP close. Scope-hammer does not write status: done,
126
+ does not deploy, and does not itself decide to ship — same judge/doer separation as the rest of
127
+ the harness (this is neither the generator nor the evaluator).
128
+
129
+ ---
130
+
131
+ ## Envelope contract — the domain layer
132
+
133
+ Orchestrated, this skill is dispatched like every worker: a **WorkOrder** in (`--order <path>`,
134
+ operation `hammer`), a **WorkResult** out. The standalone flags below map 1:1 onto the payload
135
+ fields registered for this worker in the central domain registry
136
+ (`skills/tech-lead/schemas/domain.schema.json`, `x-payload-by-worker`):
137
+
138
+ | Payload field | Standalone flag | Meaning |
139
+ |---|---|---|
140
+ | `payload.feature` | `--slug` | The feature slug (resolves scopes/, hill/, ledger paths) |
141
+ | `payload.baseline` | `--baseline` | `shaping/baseline.md` — comparison anchor (absent → the pitch's problem statement, flagged approximate) |
142
+ | `payload.breaker` | `--breaker` | `outer` \| `inner` — which circuit breaker fired (absent = normal stop) |
143
+ | `payload.scope_id` | `--scope` | With `--breaker inner`, the scope whose attempt budget was exhausted |
144
+
145
+ The WorkResult may carry only `files_touched`, `artifacts`, `assumptions`, `deviations`
146
+ (`x-result-by-worker`): the census, cut list, and ship verdict live in the report artifact as a
147
+ **proposal** — promotion and shipping stay a human call, never envelope data ingest acts on.
148
+
149
+ ---
150
+
151
+ ## Invocation
152
+
153
+ ```bash
154
+ # Normal stop — all scopes FINISHED, after QA hunt
155
+ /scope-hammer --slug checkout-vnpay --baseline shapeup/checkout-vnpay/shaping/baseline.md
156
+
157
+ # Circuit breaker tripped — some scopes still open
158
+ /scope-hammer --slug checkout-vnpay --breaker outer # round_budget exhausted
159
+ /scope-hammer --slug checkout-vnpay --breaker inner --scope cart-creation # attempt_budget exhausted
160
+
161
+ # Headless — no PO available; still refuses to auto-ship a ship-blocking item
162
+ /scope-hammer --slug checkout-vnpay --unattended
163
+ ```
164
+
165
+ ### Flags
166
+ | Flag | Effect |
167
+ |------|--------|
168
+ | `--slug <name>` | The run's feature slug (resolves scopes/, hill/, ledger paths) |
169
+ | `--baseline <path>` | Explicit baseline doc (default: `shaping/baseline.md`, else approximate) |
170
+ | `--breaker outer\|inner` | Which circuit breaker triggered this call (changes H0.1 census scope) |
171
+ | `--scope <id>` | With `--breaker inner`, the scope whose attempt budget was exhausted |
172
+ | `--unattended` | No PO available — still HARD STOPS rather than auto-shipping a ship-blocking item |
173
+
174
+ ---
175
+
176
+ ## Hard Rules (never override without explicit user instruction)
177
+
178
+ | Rule | Rationale |
179
+ |------|-----------|
180
+ | Compare to the baseline, never to a perfect ideal | Step 11's actual trade-off algorithm — "better than what customers live with today" is the bar |
181
+ | Default classification is NICE-TO-HAVE unless traced to a pitch boundary or business_goal | A generous must-have list defeats the point of hammering |
182
+ | A MUST-HAVE that fails H1.2 is never cut silently | The one case where scope-hammer refuses to make the run "look" shippable |
183
+ | Cuts are proposals; the PO confirms every one | This skill never overrides the human at the ship gate |
184
+ | Cut items are carried to the discovery ledger, never silently dropped | Cool-down must stay debt-free — an idea deferred is still recorded |
185
+ | Never sets status: done, never deploys, never ships unilaterally | Judge/doer/advisor separation holds even at the very last gate |
186
+ | An overridden ship-blocking item is logged explicitly in the ship report | "Shipped" must never quietly mean "shipped with a known must-have gap" |