@thebassclef/lite 0.0.1 → 0.1.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.
Files changed (182) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +85 -4
  3. package/dist/cli.cjs +1610 -0
  4. package/dist/cli.js +1587 -0
  5. package/dist/index.cjs +4 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +4 -0
  8. package/package.json +51 -3
  9. package/substrate/.bassclef/lite-manifest.json +1794 -0
  10. package/substrate/.claude/agents/architect.md +70 -0
  11. package/substrate/.claude/agents/builder.md +114 -0
  12. package/substrate/.claude/agents/designer.md +156 -0
  13. package/substrate/.claude/agents/reviewer.md +88 -0
  14. package/substrate/.claude/hooks/artifact-ingestion-gate.sh +357 -0
  15. package/substrate/.claude/hooks/assert-verify-steering.sh +77 -0
  16. package/substrate/.claude/hooks/bassclef-source-config-validate.sh +215 -0
  17. package/substrate/.claude/hooks/bassclef-sync.sh +634 -0
  18. package/substrate/.claude/hooks/compound-noun-scrub.sh +292 -0
  19. package/substrate/.claude/hooks/kiss-expansion-inject.sh +69 -0
  20. package/substrate/.claude/hooks/plain-english-steering.sh +156 -0
  21. package/substrate/.claude/hooks/post-skill-friction-check.sh +177 -0
  22. package/substrate/.claude/hooks/post-skill-telemetry.sh +62 -0
  23. package/substrate/.claude/hooks/pre-build-gate.sh +511 -0
  24. package/substrate/.claude/hooks/pre-commit-gate.sh +452 -0
  25. package/substrate/.claude/hooks/session-end.sh +433 -0
  26. package/substrate/.claude/hooks/session-reflection.sh +303 -0
  27. package/substrate/.claude/hooks/skill-body-grade-gate.sh +219 -0
  28. package/substrate/.claude/hooks/skill-body-intent-drift.sh +107 -0
  29. package/substrate/.claude/hooks/skill-step-list-check.sh +171 -0
  30. package/substrate/.claude/hooks/state-validate.sh +271 -0
  31. package/substrate/.claude/hooks/substrate-clarity-gate.sh +1110 -0
  32. package/substrate/.claude/hooks/temperance-gate.sh +147 -0
  33. package/substrate/.claude/hooks/testing-tier-enforce.sh +233 -0
  34. package/substrate/.claude/hooks/turn-prose-grade-measure.sh +219 -0
  35. package/substrate/.claude/hooks/turn-prose-kiss-check.sh +434 -0
  36. package/substrate/.claude/hooks/vocabulary-migration-check.sh +171 -0
  37. package/substrate/.claude/hooks/whereami-utc-gate.sh +142 -0
  38. package/substrate/.claude/luminaries/alan-cooper.md +170 -0
  39. package/substrate/.claude/luminaries/alistair-cockburn.md +140 -0
  40. package/substrate/.claude/luminaries/amazon-pr-faq.md +34 -0
  41. package/substrate/.claude/luminaries/ash-maurya.md +121 -0
  42. package/substrate/.claude/luminaries/bill-buxton.md +210 -0
  43. package/substrate/.claude/luminaries/charles-sanders-peirce.md +150 -0
  44. package/substrate/.claude/luminaries/david-ogilvy.md +192 -0
  45. package/substrate/.claude/luminaries/don-norman.md +173 -0
  46. package/substrate/.claude/luminaries/edward-tufte.md +179 -0
  47. package/substrate/.claude/luminaries/eric-evans.md +160 -0
  48. package/substrate/.claude/luminaries/frederick-brooks.md +50 -0
  49. package/substrate/.claude/luminaries/gang-of-four.md +157 -0
  50. package/substrate/.claude/luminaries/jason-fried-dhh.md +46 -0
  51. package/substrate/.claude/luminaries/jesse-james-garrett.md +154 -0
  52. package/substrate/.claude/luminaries/john-ousterhout.md +94 -0
  53. package/substrate/.claude/luminaries/karl-popper.md +132 -0
  54. package/substrate/.claude/luminaries/kent-beck.md +168 -0
  55. package/substrate/.claude/luminaries/linus-torvalds.md +218 -0
  56. package/substrate/.claude/luminaries/martin-fowler.md +164 -0
  57. package/substrate/.claude/luminaries/michael-feathers.md +125 -0
  58. package/substrate/.claude/luminaries/michael-nygard.md +118 -0
  59. package/substrate/.claude/luminaries/robert-c-martin.md +164 -0
  60. package/substrate/.claude/luminaries/saltzer-schroeder.md +194 -0
  61. package/substrate/.claude/luminaries/sophia-prater.md +193 -0
  62. package/substrate/.claude/luminaries/stephen-toulmin.md +131 -0
  63. package/substrate/.claude/rules/artifact-ingestion.md +179 -0
  64. package/substrate/.claude/rules/assert-only-after-verify.md +137 -0
  65. package/substrate/.claude/rules/blocked-items.md +146 -0
  66. package/substrate/.claude/rules/branching.md +28 -0
  67. package/substrate/.claude/rules/commit-conventions.md +22 -0
  68. package/substrate/.claude/rules/context-engineering.md +202 -0
  69. package/substrate/.claude/rules/context-management.md +85 -0
  70. package/substrate/.claude/rules/destructive-operations.md +69 -0
  71. package/substrate/.claude/rules/diagnosis.md +38 -0
  72. package/substrate/.claude/rules/guardrails.md +73 -0
  73. package/substrate/.claude/rules/identifier-leak-prevention.md +104 -0
  74. package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +98 -0
  75. package/substrate/.claude/rules/oo-ad-entry-point.md +117 -0
  76. package/substrate/.claude/rules/operator-facing-prose.md +196 -0
  77. package/substrate/.claude/rules/plain-english-discipline.md +154 -0
  78. package/substrate/.claude/rules/pr-body-shape.md +317 -0
  79. package/substrate/.claude/rules/pr-strategy.md +167 -0
  80. package/substrate/.claude/rules/sdlc-gates.md +149 -0
  81. package/substrate/.claude/rules/session-artifacts.md +236 -0
  82. package/substrate/.claude/rules/state-schema-validation.md +162 -0
  83. package/substrate/.claude/rules/whereami-load-bearing.md +202 -0
  84. package/substrate/.claude/rules/writing-craft-discipline.md +92 -0
  85. package/substrate/.claude/skills/build/SKILL.md +640 -0
  86. package/substrate/.claude/skills/decompose/SKILL.md +280 -0
  87. package/substrate/.claude/skills/diagnose/SKILL.md +297 -0
  88. package/substrate/.claude/skills/howdoi/SKILL.md +105 -0
  89. package/substrate/.claude/skills/ia-model/SKILL.md +108 -0
  90. package/substrate/.claude/skills/interaction-design/SKILL.md +112 -0
  91. package/substrate/.claude/skills/interpret-input/SKILL.md +180 -0
  92. package/substrate/.claude/skills/kiss/SKILL.md +449 -0
  93. package/substrate/.claude/skills/launch/SKILL.md +924 -0
  94. package/substrate/.claude/skills/lean-canvas/SKILL.md +332 -0
  95. package/substrate/.claude/skills/longrun/SKILL.md +426 -0
  96. package/substrate/.claude/skills/luminary/SKILL.md +481 -0
  97. package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
  98. package/substrate/.claude/skills/onboard-repo/SKILL.md +2190 -0
  99. package/substrate/.claude/skills/pattern-review/SKILL.md +99 -0
  100. package/substrate/.claude/skills/personas/SKILL.md +207 -0
  101. package/substrate/.claude/skills/promote/SKILL.md +283 -0
  102. package/substrate/.claude/skills/requirement/SKILL.md +98 -0
  103. package/substrate/.claude/skills/retro/SKILL.md +117 -0
  104. package/substrate/.claude/skills/riff/SKILL.md +114 -0
  105. package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
  106. package/substrate/.claude/skills/session-end/SKILL.md +309 -0
  107. package/substrate/.claude/skills/session-log/SKILL.md +299 -0
  108. package/substrate/.claude/skills/skills/SKILL.md +228 -0
  109. package/substrate/.claude/skills/spec/SKILL.md +105 -0
  110. package/substrate/.claude/skills/sprint/SKILL.md +392 -0
  111. package/substrate/.claude/skills/stage/SKILL.md +384 -0
  112. package/substrate/.claude/skills/state-a-problem/SKILL.md +185 -0
  113. package/substrate/.claude/skills/temperance/SKILL.md +108 -0
  114. package/substrate/.claude/skills/use-case/SKILL.md +417 -0
  115. package/substrate/.claude/skills/user-stories/SKILL.md +268 -0
  116. package/substrate/.claude/skills/value-prop/SKILL.md +251 -0
  117. package/substrate/.claude/skills/verify/SKILL.md +160 -0
  118. package/substrate/.claude/skills/whereami/SKILL.md +307 -0
  119. package/substrate/AGENTS.md +79 -0
  120. package/substrate/CLAUDE-lite.md +85 -0
  121. package/substrate/CODE_OF_CONDUCT.md +28 -0
  122. package/substrate/CONTRIBUTING.md +177 -0
  123. package/substrate/README.md +173 -0
  124. package/substrate/SECURITY.md +19 -0
  125. package/substrate/architecture/decisions/ADR-029-release-pipeline.md +79 -0
  126. package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
  127. package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
  128. package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
  129. package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
  130. package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
  131. package/substrate/lib/clean-artifacts-sweep.sh +112 -0
  132. package/substrate/lib/code-comment-discipline.sh +144 -0
  133. package/substrate/lib/composer-preflight.sh +459 -0
  134. package/substrate/lib/hook-inject.sh +255 -0
  135. package/substrate/lib/luminary-pick.sh +96 -0
  136. package/substrate/lib/output-discipline.sh +143 -0
  137. package/substrate/lib/rewrite-check.sh +214 -0
  138. package/substrate/lib/state.sh +1372 -0
  139. package/substrate/lib/telemetry.sh +205 -0
  140. package/substrate/lib/tier-check.sh +138 -0
  141. package/substrate/lib/tier-dependency-audit.sh +933 -0
  142. package/substrate/presence/install/bassclef-hook-connect.sh +178 -0
  143. package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
  144. package/substrate/presence/install/bassclef-sync.template.sh +2076 -0
  145. package/substrate/presence/install/schedule-auto-save.cron.sh +88 -0
  146. package/substrate/presence/install/schedule-auto-save.taskscheduler.md +122 -0
  147. package/substrate/scripts/aggregate-telemetry.sh +217 -0
  148. package/substrate/scripts/analyze-tier-dependencies.sh +239 -0
  149. package/substrate/scripts/generate-lite-manifest.sh +489 -0
  150. package/substrate/scripts/generate-tier-manifest.sh +28 -0
  151. package/substrate/scripts/intent-drift-check.sh +456 -0
  152. package/substrate/scripts/lite-manifest-drift-check.sh +146 -0
  153. package/substrate/scripts/render-lite-manifest-doc.sh +150 -0
  154. package/substrate/standards/bassclef-configs-schema.md +232 -0
  155. package/substrate/standards/bassclef-evolution.md +143 -0
  156. package/substrate/standards/bassclef-internal-jargon.md +244 -0
  157. package/substrate/standards/bassclef-managed-sentinel.md +96 -0
  158. package/substrate/standards/bassclef-source-config.md +228 -0
  159. package/substrate/standards/deferred-actions-schema.md +204 -0
  160. package/substrate/standards/docs-sync-allowlist.md +76 -0
  161. package/substrate/standards/graceful-exit.md +227 -0
  162. package/substrate/standards/hook-idempotency.md +102 -0
  163. package/substrate/standards/lite-manifest-schema-changes.md +75 -0
  164. package/substrate/standards/luminary-problem-patterns.md +481 -0
  165. package/substrate/standards/ogilvy-writing-rules.md +225 -0
  166. package/substrate/standards/opener-discipline.md +96 -0
  167. package/substrate/standards/operator-facing-prose-discipline.md +201 -0
  168. package/substrate/standards/project-directory-layout.md +276 -0
  169. package/substrate/standards/release-tagging.md +137 -0
  170. package/substrate/standards/sdlc-compliance.md +286 -0
  171. package/substrate/standards/secrets-lifecycle.md +210 -0
  172. package/substrate/standards/security-scanner-adapter.md +145 -0
  173. package/substrate/standards/skill-output-discipline.md +90 -0
  174. package/substrate/standards/state-spine.md +511 -0
  175. package/substrate/standards/tech-stack-config.md +109 -0
  176. package/substrate/standards/tier-dependency-analysis.md +167 -0
  177. package/substrate/standards/tier-runtime-deps/lite.md +57 -0
  178. package/substrate/standards/tier-tag-schema.md +155 -0
  179. package/substrate/standards/whereami-schema.md +301 -0
  180. package/substrate/standards/writing-guide.md +213 -0
  181. package/substrate/templates/deferred-action-template.md +45 -0
  182. package/substrate/templates/whereami-template.md +101 -0
@@ -0,0 +1,924 @@
1
+ ---
2
+ tier: lite
3
+ name: launch
4
+ description: "Turn an idea into a buildable plan. Produces a clickable mock gallery PLUS the spec, user stories, decomposition, and migration plan. Two sizes (medium, full). Two deploy modes — extended deploys mocks to a configured subdomain; --local writes everything to disk and serves the gallery on localhost (Anthropic API key only; no vendor accounts). For variants-only, use /stage."
5
+ problem: "An idea is a doc. A working feature is code. The gap in between is where projects stall."
6
+ value: "Turns an idea into a buildable plan \u2014 mock gallery and spec and INVEST stories. Ready for /build."
7
+ inputs: [A rough idea or ticket or canvas]
8
+ outputs: [Clickable mock gallery, Buildable spec, INVEST user stories, GRASP responsibility matrix]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ sizes: [medium, full]
12
+ composes_baseline: anthropic-frontend-design
13
+ ---
14
+
15
+ > **Baseline composition:** Bassclef's gallery + spec authoring composes on top of Anthropic's `frontend-design` skill defaults. Adopters firing plain Claude inherit those defaults; this skill extends with luminary-driven variant generation + buildable-spec pipeline + bassclef's design-discipline + operator-facing prose discipline.
16
+
17
+ # /launch (formerly /preview-build) — Build-Tier Composer (Construction Transition)
18
+
19
+ End-to-end composer for **build tiers** (medium + full). Takes
20
+ operator input (paragraph OR a chosen variant from `/stage`'s
21
+ output via `base=<slug>`) and produces a PR containing:
22
+
23
+ 1. **Deployed clickable gallery** of N+1 variants (luminary-driven +
24
+ Anthropic baseline), each variant page with back-nav to master
25
+ gallery — same UX continuity as `/stage`
26
+ 2. **Buildable spec** (Cockburn use-cases + IA model + interaction
27
+ design + GRASP responsibility matrix per Larman)
28
+ 3. **ux-migration plan** linking the chosen variant to the
29
+ production codebase
30
+ 4. **Scaffolded Construction iteration-goal draft** ready for operator
31
+ review + `/build-iteration` dispatch (bassclef#335 — follow-up goal)
32
+
33
+ This is the skill that takes operator intent from "I picked a
34
+ direction" to "Construction can scaffold against this spec." The
35
+ output is the input contract for `/build-iteration` (the next-stage
36
+ composer that runs autonomous Construction).
37
+
38
+ ## ADR-consult — fire before scope confirmation (per bassclef-upstream#424)
39
+
40
+ Read every relevant ADR in `architecture/decisions/` before confirming scope. If your scope deviates from any ADR's decision or constraints, surface the deviation as the first agenda item — operator decides amend-ADR vs. revise-scope.
41
+
42
+ Per `.claude/rules/adr-discipline.md`. Mechanism: `adr-discipline-check.sh` fires on substantive architectural edits (wired in `.claude/settings.json` since bet 28a WU-1). The Tier 0 test for this step greps for the literal header `## ADR-consult — fire before scope confirmation` in each of `/build /launch /spec /decompose /shape /longrun`.
43
+
44
+ ## When to invoke
45
+
46
+ - Operator picked a variant via `/stage <quick|light>` and is ready
47
+ to ship: `/launch medium "<paragraph>" base=<chosen-variant-slug>`
48
+ - Operator dispatching directly without prototype tier (skip-the-bake-off
49
+ for known scope): `/launch medium "<paragraph>"`
50
+ - Audit-grade for high-stakes surfaces: `/launch full "..."`
51
+ - **Brownfield mode (bassclef#459 sub-goal 2)** — point at an existing
52
+ repo instead of writing a paragraph: `/launch medium --brownfield ~/src/your-org/your-app`
53
+ or `/launch medium --brownfield https://github.com/your-org/your-app`.
54
+ Phase 1 dispatches `/interpret-input --type=repo` (Phase C extractor)
55
+ which walks the codebase to populate entities, actors, routes, and
56
+ README excerpt. Downstream phases unchanged.
57
+
58
+ ## Phase boundary
59
+
60
+ | Axis | `/stage` (sibling) | `/launch` (this skill) |
61
+ |------|---------------------|------------------------------|
62
+ | Phase | Inception / Elaboration | Construction transition |
63
+ | Operator intent | "Pick a direction" | "Ship the chosen direction" |
64
+ | Data substrate | Stubbed | Stubbed (variants) → real (post-build) |
65
+ | Output type | Variants for visual selection | Variants + buildable spec + GRASP + ux-migration + iteration-goal draft |
66
+ | Cameo review | /visual-review complement evaluators | Same + spec/decomp luminary review |
67
+ | Commitment level | None — variants throwaway | Operator decides next: `/build-iteration` or pivot |
68
+ | Compose-with | None upstream | Optional: `/stage` output via `base=<slug>` |
69
+
70
+ ## What this skill is NOT
71
+
72
+ - **Not a Construction-execution skill.** This produces the spec; it
73
+ does NOT write production code. `/build-iteration` (bassclef#335)
74
+ consumes this skill's output to execute Construction.
75
+ - **Not deploy-to-prod.** The deployed gallery uses the consumer's
76
+ prototype-friendly Amplify branch (per `bind-subdomain` adapter);
77
+ the production deploy happens via `/deploy-prod` after Construction
78
+ ships.
79
+ - **Not the prototype-tier composer.** Use `/stage` for quick + light.
80
+
81
+ ## Hard constraints (per goal rules)
82
+
83
+ - **MUST produce a PR**, never push directly to main (per
84
+ `.claude/rules/branching.md` + `.claude/rules/pr-strategy.md`)
85
+ - **MUST run on a feature branch** — refuses to run from main
86
+ - **MUST capture champion-challenger signal** in `preview-state.yml`
87
+ (`selected_variant` + `is_baseline` per step-11b)
88
+ - **MUST tolerate stub-mode InputArtifacts** (Phase B is text-strict;
89
+ other types produce `extracted_text="deferred to Phase C"`)
90
+ - **MUST surface spec + decomposition + ux-migration** in the deployed
91
+ gallery so cameos (luminary-as-perspective via /visual-review;
92
+ future luminary-as-agent per roadmap Stage 3) can review by default
93
+ - **MUST scaffold Construction iteration-goal draft** as final phase
94
+ (operator reviews; `/build-iteration` consumes)
95
+ - **MUST validate spec output** against `decomposition.schema.json` +
96
+ `iteration-goal.schema.json` — state-validate.sh enforces
97
+
98
+ ## Procedure
99
+
100
+ ### Phase -1 — Composer pre-flight (per bassclef#408 + bassclef#449/#450)
101
+
102
+ Source the shared pre-flight helper and surface all 6 prerequisites
103
+ upfront. Pass `--no-launch` if the dispatch is variants-only (no
104
+ `/launch-preview` chain expected); the deploy-host check (Check 6)
105
+ short-circuits to pass.
106
+
107
+ ```bash
108
+ source "${BASSCLEF_DIR:-$REPO_ROOT}/lib/composer-preflight.sh"
109
+
110
+ # Detect variants-only dispatch (--no-launch flag from operator OR
111
+ # variant-tier modes). Default is full chain (deploy-host required).
112
+ NO_LAUNCH_FLAG=""
113
+ case " $* " in
114
+ *" --no-launch "*) NO_LAUNCH_FLAG="--no-launch" ;;
115
+ esac
116
+
117
+ PREFLIGHT_OUTPUT=$(composer_preflight_check "launch" "${ESTIMATED_TURNS:-60}" "$NO_LAUNCH_FLAG")
118
+ PREFLIGHT_RC=$?
119
+ echo "$PREFLIGHT_OUTPUT" | composer_preflight_render "launch"
120
+
121
+ case $PREFLIGHT_RC in
122
+ 0) ;; # all checks pass — proceed to Phase 0
123
+ 1) # warnings — operator decides proceed/abort
124
+ echo ""
125
+ echo "Pre-flight surfaced warnings. Proceed with caution OR abort and remediate."
126
+ echo "Override (logged): SKIP_COMPOSER_PREFLIGHT=1"
127
+ ;;
128
+ 2) # failures — refuse dispatch
129
+ echo ""
130
+ echo "Pre-flight refused dispatch. Resolve fail-tier checks before re-running."
131
+ echo "Common fix: 'hosting_platform: amplify' missing from substrate.config.md? See bassclef#449."
132
+ echo "Variants-only run? Re-run with --no-launch to skip deploy-host check."
133
+ exit 1
134
+ ;;
135
+ esac
136
+ ```
137
+
138
+ Override: `SKIP_COMPOSER_PREFLIGHT=1` (logged via trace-helper). Use
139
+ sparingly — defeats the purpose. See
140
+ `standards/composer-prerequisites.md` for full discipline.
141
+
142
+ The 6 checks: feature-branch, state-spine (auto-prep), personas,
143
+ budget, skill-registry (bassclef#271 race detection), deploy-host
144
+ (bassclef#449/#450 — refuses dispatch when `hosting_platform=none`
145
+ and `/launch-preview` would have nowhere to land).
146
+
147
+ The `--no-launch` mode is the variants-only escape hatch: produces
148
+ the prototype gallery without committing to launch a deploy host.
149
+ Use when `/stage` (light) or `/launch` is dispatched purely
150
+ for design exploration. Default is full chain (deploy-host required).
151
+
152
+ ### Phase 0 — Pre-flight
153
+
154
+ Same as `/stage` — verify feature branch + lib/state.sh + parse args via `scripts/launch/parse-input-args.sh`. The parser distinguishes legacy text mode from brownfield mode (bassclef#459 sub-goal 2 — LR3 WU-2):
155
+
156
+ ```bash
157
+ PARSE_OUT=$(bash "${BASSCLEF_DIR:-$REPO_ROOT}/scripts/launch/parse-input-args.sh" "$@") || exit $?
158
+
159
+ TIER=$(echo "$PARSE_OUT" | jq -r .tier)
160
+ INPUT_TYPE=$(echo "$PARSE_OUT" | jq -r .input_type)
161
+ INPUT_SOURCE=$(echo "$PARSE_OUT" | jq -r .input_source)
162
+ BROWNFIELD_FLAG=$(echo "$PARSE_OUT" | jq -r .brownfield_flag)
163
+ LOCAL_MODE=$(echo "$PARSE_OUT" | jq -r '.local_mode // false')
164
+ REUSE_ARTIFACT_PATH=$(echo "$PARSE_OUT" | jq -r '.reuse_artifact_path // ""')
165
+
166
+ # Local mode announcement (bassclef#923 A2)
167
+ if [ "$LOCAL_MODE" = "true" ]; then
168
+ echo "launch: local mode — artifacts to disk + localhost gallery preview; Phase 12 skips bind-subdomain" >&2
169
+ fi
170
+
171
+ # Reuse mode announcement (bassclef-upstream#716)
172
+ if [ -n "$REUSE_ARTIFACT_PATH" ]; then
173
+ echo "launch: reuse mode — using pre-shaped InputArtifact at $REUSE_ARTIFACT_PATH; Phase 1 skips interpret-input dispatch" >&2
174
+ fi
175
+
176
+ # Tier-specific notes (parser already validated tier enum)
177
+ case "$TIER" in
178
+ full) echo "launch: full tier ships per-persona analysis + /synthetic-user; ensure /personas defined for consumer repo" >&2 ;;
179
+ esac
180
+
181
+ # Brownfield announcement
182
+ if [ "$BROWNFIELD_FLAG" = "true" ]; then
183
+ echo "launch: brownfield mode — input source is a repo (URL or local path); Phase 1 will dispatch /interpret-input --type=repo" >&2
184
+ fi
185
+ ```
186
+
187
+ **Usage forms:**
188
+
189
+ ```bash
190
+ # Legacy text mode (paragraph input)
191
+ /launch medium "Dramatically simplify deal display..."
192
+
193
+ # Local mode (bassclef#923 A2) — writes all artifacts to disk + serves
194
+ # the prototype gallery on localhost. No vendor accounts needed. Phase
195
+ # 12 (bind-subdomain) is replaced with scripts/launch/local-serve.sh.
196
+ /launch medium --local "build me a wiki app for sharing recipes with family"
197
+
198
+ # Reuse mode (bassclef-upstream#716) — reuse a pre-shaped InputArtifact
199
+ # from a prior chain instead of minting a fresh one. Phase 1 validates
200
+ # the file against input-artifact.schema.json + copies to the sprint slot
201
+ # + skips interpret-input.sh dispatch. Downstream phases run unchanged.
202
+ /launch medium --local --reuse-artifact docs/input-artifacts/2026-07-11-697-onboarding-ux.json
203
+
204
+ # Reuse mode with equals form
205
+ /launch medium --reuse-artifact=docs/input-artifacts/2026-07-11-697-onboarding-ux.json
206
+
207
+ # Brownfield mode — local repo path
208
+ /launch medium --brownfield ~/src/your-org/your-app
209
+
210
+ # Brownfield mode — GitHub URL (cloned to temp dir by /interpret-input)
211
+ /launch medium --brownfield https://github.com/your-org/your-app
212
+
213
+ # Equivalent --brownfield= form
214
+ /launch medium --brownfield=https://github.com/your-org/your-app
215
+
216
+ # Voice-input mode (Phase V Hey-Alexa MVD) — input text originated from
217
+ # voice dictation (macOS Fn-Fn or equivalent); intent extraction uses
218
+ # tolerant settings for spoken-text shape (looser grammar, lower
219
+ # confidence threshold). See standards/voice-input-pattern.md.
220
+ /launch medium --voice-input "build me a wiki app for sharing recipes with family"
221
+
222
+ # Combining flags — local + voice (e.g. friendly dictates intent on a
223
+ # laptop without vendor accounts)
224
+ /launch medium --local --voice-input "build me a wiki app for ..."
225
+ ```
226
+
227
+ **Local mode (`--local`) — bassclef#923 A2:**
228
+
229
+ `/launch --local` prints a banner first. The banner shows which picker is active:
230
+
231
+ ```
232
+ /launch --local — picker uses the LLM your Claude Code session provides.
233
+
234
+ ✓ full-catalog picking — /pick-luminaries runs against the harness LLM.
235
+ This is the default.
236
+ ✓ signal fallback — if the picker call fails, Phase 4 falls back to
237
+ /luminary recommend signal scoring.
238
+ ```
239
+
240
+ No separate API key needed. The skill uses whichever LLM the harness provides. Tier is about catalog size, not keys. See bassclef-web#190 and #193 for the reframe.
241
+
242
+ The banner ensures every adopter sees the same three-tier story
243
+ whether they hit it at the wiki, the README, the /onboard-repo Path B
244
+ prereqs, the prereqs-missing menu, the `lib/luminary-pick.sh` refusal
245
+ output, or here.
246
+
247
+ When the flag is set, the chain runs identically through Phases 1-11
248
+ (all artifacts land on disk). Phase 12 swaps deploy for a local HTTP
249
+ server:
250
+
251
+ - Phase 12-alt dispatches `bash scripts/launch/local-serve.sh
252
+ docs/prototypes/<sprint-slug>/` — wraps `python -m http.server` bound
253
+ to `127.0.0.1`, finds an open port starting at 8000
254
+ - Phase 13 (preview-state.yml) records `local_url` instead of
255
+ `bind_subdomain_url` per variant; the gallery URL is the one
256
+ surfaced to the operator
257
+ - Phase 0 pre-flight skips Amplify + Cloudflare adapter checks when
258
+ `--local` is set
259
+ - Operator stops the server later with
260
+ `bash scripts/launch/local-serve-stop.sh <sprint-slug>`
261
+
262
+ Local mode is the demo path for adopters without vendor accounts —
263
+ paragraph in, full artifact chain on disk, localhost preview.
264
+
265
+ **Voice-input mode (--voice-input):**
266
+
267
+ Per `standards/voice-input-pattern.md` + Phase V Hey-Alexa MVD goal (`docs/iteration-bets/2026-05-12-phase-v-hey-alexa-mvd.md`):
268
+
269
+ - Input text originated from voice (macOS dictation or equivalent)
270
+ - The text is treated as the operator's intent paragraph and flows through `/interpret-input` (Phase 1) like any other text input. Conversational-shape (fragments, restarts, filler) is preserved verbatim; downstream phases consume it the same as keyboard-typed text.
271
+ - Existing text-mode + brownfield-mode behavior unchanged when flag absent
272
+ - Composes with `--brownfield` (rare; voice-driven brownfield refactor is plausible but not the MVD path)
273
+
274
+ ### Phase 1 — `/interpret-input`
275
+
276
+ Dispatches `/interpret-input` with the type detected by Phase 0. Text mode preserves the existing text-mode behavior; brownfield mode invokes the Phase C extractor (LR2 WU-1, bassclef#459 sub-goal 1) which walks the repo and populates structural hints (entities, actors, routes, README excerpt).
277
+
278
+ ```bash
279
+ # Generate sprint slug + InputArtifact path
280
+ SPRINT_SLUG="$(date -u +%Y-%m-%d)-$(printf '%s' "$INPUT_SOURCE" | md5 -q 2>/dev/null | cut -c1-6 || md5sum <<<"$INPUT_SOURCE" | cut -c1-6)"
281
+ ARTIFACT_PATH="docs/input-artifacts/${SPRINT_SLUG}-input.json"
282
+
283
+ if [ -n "$REUSE_ARTIFACT_PATH" ]; then
284
+ # Reuse pre-shaped InputArtifact (bassclef-upstream#716)
285
+ # Validate against schema first; fail fast on invalid input
286
+ SCHEMA_PATH="${BASSCLEF_DIR:-$REPO_ROOT}/standards/state-spine/schemas/input-artifact.schema.json"
287
+ if command -v ajv >/dev/null 2>&1; then
288
+ if ! ajv validate -s "$SCHEMA_PATH" -d "$REUSE_ARTIFACT_PATH" --spec=draft2020 --strict 2>&1; then
289
+ echo "launch: --reuse-artifact file failed schema validation: $REUSE_ARTIFACT_PATH" >&2
290
+ echo "launch: run 'ajv validate -s $SCHEMA_PATH -d <path>' for details" >&2
291
+ exit 1
292
+ fi
293
+ else
294
+ echo "launch: WARN — ajv not found; skipping InputArtifact schema validation" >&2
295
+ fi
296
+
297
+ # Copy the pre-shaped artifact to the sprint slot
298
+ mkdir -p docs/input-artifacts
299
+ cp "$REUSE_ARTIFACT_PATH" "$ARTIFACT_PATH"
300
+ echo "launch: copied pre-shaped artifact from $REUSE_ARTIFACT_PATH to $ARTIFACT_PATH" >&2
301
+ else
302
+ # Dispatch /interpret-input with the right type
303
+ bash "${BASSCLEF_DIR:-$REPO_ROOT}/scripts/interpret-input.sh" \
304
+ "$INPUT_SOURCE" \
305
+ --type="$INPUT_TYPE" \
306
+ --persist \
307
+ --slug="${SPRINT_SLUG}-input"
308
+ fi
309
+ ```
310
+
311
+ Produces `InputArtifact` at `docs/input-artifacts/<sprint-slug>-input.json`. Downstream phases (`/objectory-decompose`, `/value-prop`, `/riff-prototypes`, etc.) consume the InputArtifact unchanged — the type and structural_hints are already populated by the right extractor.
312
+
313
+ **Brownfield self-test:** dispatching against bassclef itself (`/launch medium --brownfield .` from bassclef's root) returns an InputArtifact whose `structural_hints.entities_seen` contains `skill`, `rule`, `agent`, `standard` — proves the chain is wired to the Phase C extractor.
314
+
315
+ ### Phase 2 — `/objectory-decompose` (full BCE matrix)
316
+
317
+ Same as `/stage` Phase 2 — Jacobson method via `/objectory-decompose`.
318
+ Output: `docs/decompositions/<slug>-domain.md` with entity inventory
319
+ + actor list + verb-goal pairs + BCE matrix.
320
+
321
+ **Distinction from /stage (formerly /preview)**: medium + full consume the FULL BCE
322
+ matrix downstream (in /ia-model + /interaction-design + /decompose
323
+ steps). Quick + light only consume the verb-goal pairs (for
324
+ /value-prop input).
325
+
326
+ ### Phase 3 — `/value-prop` (brief mode for medium; verbose for full)
327
+
328
+ ```bash
329
+ case "$TIER" in
330
+ medium) /value-prop --brief "<extracted_text>" ;; # claim + 3 RTBs
331
+ full) /value-prop --verbose "<extracted_text>" ;; # full Dunford/Moore positioning
332
+ esac
333
+ ```
334
+
335
+ ### Phase 3b — Deeper persona work (medium + full only)
336
+
337
+ Per roadmap §"Medium tier":
338
+
339
+ ```bash
340
+ /personas # primary persona (medium); all personas (full)
341
+ /jtbd-tasks # top jobs (medium); all jobs (full)
342
+ case "$TIER" in
343
+ full) /value-prop-canvas <persona> ;; # per primary; per all (full)
344
+ esac
345
+ ```
346
+
347
+ These outputs feed Phase 5's spec generation.
348
+
349
+ ### Phase 3.5 — `/pick-luminaries` (in-turn picker for variant grounding)
350
+
351
+ Runs inside the current turn. Picks N luminaries whose lens fits the operator's intent. No separate LLM call. No provider key required. Per web#193 Option A rewrite.
352
+
353
+ ```bash
354
+ source "${BASSCLEF_DIR:-$HOME/src/sunj-labs/bassclef}/lib/luminary-pick.sh"
355
+ CATALOG=$(luminary_pick_catalog)
356
+ ```
357
+
358
+ Now Claude (in-turn) reads `$intent_text`, enumerates `$CATALOG`, picks `$N_VARIANTS` slugs whose lens fits. Writes JSON to `/tmp/luminary-pick.json`:
359
+
360
+ ```json
361
+ {
362
+ "matched_luminaries": ["slug1", "slug2", "slug3"],
363
+ "rationale": "One short sentence per pick",
364
+ "picker_version": "bassclef-harness-pick-2.0",
365
+ "provider": "claude-code-harness"
366
+ }
367
+ ```
368
+
369
+ If the catalog helper fails (missing catalog dir), Phase 4 falls back to `/luminary recommend` signal scoring. Bassclef-private adopters who load their own `/extract-intent` skill via `additionalDirectories` override this path with richer grounding.
370
+
371
+ ### Phase 4 — `/riff-prototypes` (with WU-11b Anthropic baseline)
372
+
373
+ Same as `/stage` Phase 4 — N+1 variants (N luminary-driven + 1
374
+ Anthropic baseline). Variant count by tier:
375
+
376
+ | Tier | N (luminary) | Total (with baseline) |
377
+ |---|---|---|
378
+ | medium | 3 | 4 |
379
+ | full | 3-5 | 4-6 |
380
+
381
+ **Variant assignment from Phase 3.5.** Phase 4 reads `matched_luminaries` from Phase 3.5's output and assigns the N luminary-driven variants to those slugs. The Anthropic baseline always lands regardless. Operator can override per `/riff-prototypes --luminaries=...`.
382
+
383
+ ### Phase 5 — `/use-case` (Cockburn formalization, medium + full)
384
+
385
+ Per roadmap §"Medium tier":
386
+
387
+ ```bash
388
+ /use-case "<primary-actor>" "<primary-goal>" # consumes /objectory-decompose verb-goal pairs
389
+ ```
390
+
391
+ Produces formal use-case document at `docs/use-cases/<slug>-<goal>.md`.
392
+ Full tier: one /use-case per primary goal (not just primary).
393
+
394
+ ### Phase 5b — `/user-stories` (INVEST backlog tokens, medium + full)
395
+
396
+ Per bassclef#358 — closes the chain drift between /use-case and
397
+ /launch. Slices /use-case main scenario + extensions into
398
+ INVEST-validated user stories. Each story traces back to Persona →
399
+ JTBD → VPC → Use-case line.
400
+
401
+ ```bash
402
+ /user-stories from-use-case "<uc-slug>" # slices the use-case from Phase 5
403
+ ```
404
+
405
+ Produces user-story files at `docs/user-stories/US-NNN-<slug>.md` +
406
+ traceability matrix at `docs/user-stories/_matrix.md`. Full tier:
407
+ walk every primary use-case + every extension through INVEST.
408
+
409
+ **Why this phase exists:** /launch's downstream consumer
410
+ (`/build`, bassclef#335) ships in stacked atomic per-step PRs.
411
+ INVEST's "Independent" + "Small" properties are exactly what makes
412
+ each step safely mergeable in isolation. Without this phase, Phase 14's
413
+ step enumeration is derived ad-hoc from /spec's acceptance criteria;
414
+ not INVEST-validated. With this phase, step enumeration ARE the
415
+ INVEST stories, with full traceability back to persona-level value.
416
+
417
+ **Distinction from /use-case (Phase 5):** /use-case = system behavior
418
+ spec ("what must the system do for this goal, including every
419
+ extension?"). /user-stories = backlog tokens ("what to ship in what
420
+ order, each independently shippable?"). Both feed downstream phases:
421
+ /use-case → /interaction-design (renders flow); /user-stories → /spec
422
+ (step enumeration) and /build (per-story Builder dispatch).
423
+
424
+ ### Phase 6 — `/ia-model` (entity inventory → nav structure)
425
+
426
+ ```bash
427
+ /ia-model # consumes /objectory-decompose entities
428
+ ```
429
+
430
+ Output: `docs/ia-models/<slug>.md` — nav structure + labeling + screen
431
+ map derived from BCE entities.
432
+
433
+ ### Phase 7 — `/interaction-design` (state + sequence diagrams)
434
+
435
+ ```bash
436
+ /interaction-design # consumes /ia-model + /use-case
437
+ ```
438
+
439
+ Output: state diagrams + sequence diagrams in `docs/interaction-design/<slug>/`.
440
+
441
+ ### Phase 8 — `/decompose` (GRASP responsibility assignment)
442
+
443
+ ```bash
444
+ /decompose # consumes BCE matrix from /objectory-decompose + sequence diagrams from /interaction-design
445
+ ```
446
+
447
+ Output: `docs/decompositions/<slug>-grasp.md` — GRASP responsibility
448
+ matrix + interface identification + pattern selection (GoF/Fowler).
449
+
450
+ ### Phase 9 — `/spec` (build-ready specification)
451
+
452
+ ```bash
453
+ /spec # composes /value-prop + /personas + /use-case + /user-stories + /ia-model + /interaction-design + /decompose
454
+ ```
455
+
456
+ Output: `docs/specs/<slug>.md` — buildable specification ready for
457
+ Construction. Includes:
458
+ - Acceptance criteria (testable; one per /user-stories acceptance line)
459
+ - Scope boundary (what's in / out)
460
+ - Open questions (operator must resolve before Construction)
461
+ - **`## Steps enumerated` section (REQUIRED, exact heading) per
462
+ bassclef#367** — derived from /user-stories output (bassclef#358).
463
+ Each story (US-NNN) maps to one `### WU-N` entry; the step's acceptance
464
+ criteria inherit from the story's. INVEST-validated by construction.
465
+ /build's Phase 1 parser greps for this exact heading.
466
+
467
+ ### Phase 10 — `/prototype-gallery` (with back-nav injection)
468
+
469
+ Per `/prototype-gallery` SKILL.md §"Back-nav injection (bassclef#X)":
470
+ each variant copy in `public/prototypes/<slug>/` gets a back-nav header
471
+ injected at copy time. Master gallery includes:
472
+
473
+ - All N+1 variants with luminary attribution
474
+ - **Spec link** (`docs/specs/<slug>.md`) — visible to operator AND
475
+ cameos
476
+ - **Decomposition link** (GRASP matrix) — same
477
+ - **ux-migration link** — same
478
+ - Champion-challenger flag on baseline variant
479
+
480
+ The gallery is THE cameo-review surface. Luminary perspectives
481
+ (today: /visual-review complement-evaluator pairs; future: luminary-as-
482
+ agent runtime per roadmap Stage 3) consume the gallery + spec + decomp
483
+ to produce reviews per perspective. Reviews surface in PR body.
484
+
485
+ ### Phase 11 — `/ux-migration` (chosen variant → production migration plan)
486
+
487
+ ```bash
488
+ /ux-migration <chosen-variant-slug> # if base= provided, use that; else operator chooses post-gallery
489
+ ```
490
+
491
+ Output: `docs/specs/ux-migration-<slug>.md` — token extraction +
492
+ prototype-HTML→React mapping table + work packages with dependency-aware
493
+ build order.
494
+
495
+ This is the `/ux-migration` MUST gate per existing prototype-variants
496
+ SKILL.md §"Step 7 — Selection → pipeline to Construction".
497
+
498
+ ### Phase 12 — Deploy or local-serve (mode-gated)
499
+
500
+ **When `LOCAL_MODE != true` (extended / default):** `/bind-subdomain`
501
+ per variant + master gallery. Same as `/stage` Phase 6, but ALSO bind
502
+ the master gallery itself to a subdomain (e.g.,
503
+ `gallery-<sprint-slug>.<consumer-domain>`). Each variant URL includes
504
+ back-nav to master gallery URL. Best-effort per existing convention —
505
+ failures don't fail the chain.
506
+
507
+ **When `LOCAL_MODE == true` (bassclef#923 A2):** skip bind-subdomain
508
+ entirely. Dispatch `scripts/launch/local-serve.sh` against the gallery
509
+ directory. Capture the localhost URL:
510
+
511
+ ```bash
512
+ LOCAL_URL=$(bash "${BASSCLEF_DIR:-$REPO_ROOT}/scripts/launch/local-serve.sh" \
513
+ "docs/prototypes/${SPRINT_SLUG}/")
514
+
515
+ if [ -z "$LOCAL_URL" ]; then
516
+ echo "launch: local-serve failed to start; gallery artifacts still on disk at docs/prototypes/${SPRINT_SLUG}/" >&2
517
+ # Don't fail the chain — disk artifacts are the load-bearing output
518
+ else
519
+ echo "launch: local gallery at ${LOCAL_URL}" >&2
520
+ fi
521
+ ```
522
+
523
+ Per-variant URLs in local mode all point at the same localhost root
524
+ (path-based per ADR-016 prototype-gallery-url-pattern). No DNS, no
525
+ TLS, no Amplify, no Cloudflare. Stop the server later with
526
+ `scripts/launch/local-serve-stop.sh <sprint-slug>`.
527
+
528
+ ### Phase 13 — Persist preview-state.yml (build-tier shape)
529
+
530
+ ```yaml
531
+ # docs/preview-state/<sprint-slug>.yml
532
+ slug: <sprint-slug>
533
+ input_artifact: <sprint-slug>-input
534
+ decomposition: <sprint-slug>-domain
535
+ spec: <sprint-slug> # NEW vs /stage
536
+ grasp: <sprint-slug>-grasp # NEW vs /stage
537
+ ux_migration: ux-migration-<sprint-slug> # NEW vs /stage
538
+ status: build-ready # NEW vs /stage's "variants-ready"
539
+ current_tier: medium # or full
540
+ luminaries_used: [...]
541
+ current_variants:
542
+ - name: variant-a-<luminary>
543
+ is_baseline: false
544
+ bind_subdomain_url: ...
545
+ - name: variant-baseline-anthropic
546
+ is_baseline: true
547
+ bind_subdomain_url: ...
548
+ selected_variant: <if base= provided, that; else null pending operator pick>
549
+ created_at: <ISO timestamp>
550
+ created_by_session: <session-id>
551
+ ```
552
+
553
+ `status: build-ready` is the operator-readable signal that Construction
554
+ can begin. `/build-iteration` (bassclef#335) refuses to run if
555
+ status != build-ready.
556
+
557
+ ### Phase 14 — Scaffold Construction iteration-goal draft
558
+
559
+ ```yaml
560
+ # docs/iteration-bets/<YYYY-MM-DD>-<sprint-slug>-construction.md (DRAFT)
561
+ ---
562
+ slug: <YYYY-MM-DD>-<sprint-slug>-construction
563
+ phase: Construction
564
+ status: draft # operator must change to "active" before /build-iteration runs
565
+ parent_roadmap: docs/roadmaps/<roadmap-slug>.md # if known
566
+ parent_canvas: <if known>
567
+ parent_bet: <launch's own goal, if part of one>
568
+ preview_state: docs/preview-state/<sprint-slug>.yml
569
+ spec: docs/specs/<sprint-slug>.md
570
+ ux_migration: docs/specs/ux-migration-<sprint-slug>.md
571
+ decomposition: docs/decompositions/<sprint-slug>-grasp.md
572
+ references:
573
+ - {type: spec, id: <sprint-slug>}
574
+ - {type: decomposition, id: <sprint-slug>-grasp}
575
+ - {type: input-artifact, id: <sprint-slug>-input}
576
+ appetite:
577
+ mode: scope-bounded
578
+ estimated_turns: <derived from /spec step enumeration>
579
+ stopping_criteria:
580
+ - All step PRs filed (count from spec)
581
+ - Operator merges + CI green
582
+ - /deploy-prod dispatches successfully
583
+ ---
584
+
585
+ ## Sources read
586
+
587
+ - spec: docs/specs/<sprint-slug>.md
588
+ - decomposition: docs/decompositions/<sprint-slug>-grasp.md
589
+ - ux-migration: docs/specs/ux-migration-<sprint-slug>.md
590
+ - preview-state: docs/preview-state/<sprint-slug>.yml
591
+ - input-artifact: docs/input-artifacts/<sprint-slug>-input.json
592
+
593
+ ## What I'm NOT reading (with reason)
594
+
595
+ - (operator fills in if specific exclusions apply)
596
+
597
+ ## Iteration Goal — Construction of <slug>
598
+
599
+ **Phase**: Construction
600
+
601
+ **Scope**:
602
+ (operator reviews + tightens; spec is the source of truth)
603
+
604
+ **Risk being retired**:
605
+ (derived from spec acceptance criteria)
606
+
607
+ **Business value being proven**:
608
+ (derived from /value-prop output)
609
+
610
+ **Lovability signal**:
611
+ (derived from chosen variant's luminary signature + /value-prop)
612
+
613
+ **Viability signal**:
614
+ (derived from /spec acceptance criteria; operator confirms)
615
+
616
+ **Appetite**:
617
+ (derived from spec step enumeration; operator finalizes)
618
+ ```
619
+
620
+ This is a DRAFT — operator reviews, edits, commits status:active. Then
621
+ `/build-iteration <slug>-construction` dispatches Builder agent.
622
+
623
+ ### Phase 14b — Completion handoff (bassclef#941)
624
+
625
+ Two templates — adopter-mode and operator-mode. Default is adopter when `--local` is set; operator-mode for non-local dispatches (which assume operator workflow with consumer repo + iteration goal ceremony).
626
+
627
+ #### Adopter-mode completion (default for `--local`)
628
+
629
+ After Phase 12-alt (`local-serve.sh` running) + Phase 13 (preview-state.yml on disk), emit this template directly to the adopter — no YAML edits, no frontmatter flip, no command-soup:
630
+
631
+ ```
632
+ I made you N directions for your family recipe wiki. Walk through them on
633
+ your phone or laptop at <LOCAL_URL> and tell me which one feels right.
634
+
635
+ When you've picked, just tell me — "I like variant 2" or "#3 looks
636
+ great".
637
+
638
+ Here's what happens next:
639
+
640
+ 1. I'll write the formal artifacts for your chosen direction only:
641
+ - The use case — what the app does step-by-step (Cockburn style)
642
+ - The user stories — the small, shippable slices ("I want to add a
643
+ recipe", "I want to tag recipes for weeknight dinners", etc.)
644
+ - The information architecture — the screens, the nav, where each
645
+ screen lives
646
+ - The interaction design — what happens when you click each thing
647
+ - The responsibility map — which code module owns what
648
+ - The build spec — the checklist your app code is measured against
649
+ - The migration plan — how to ship it step by step
650
+ 2. Then I'll write the actual app code — add, edit, search, tag, the
651
+ whole thing — using those artifacts as the checklist.
652
+ 3. You'll get a working local version to play with in about 15 minutes.
653
+
654
+ You're seeing N directions BEFORE I write any of those formal artifacts
655
+ because the cheap-vs-expensive trade-off is real:
656
+
657
+ - The variants you're looking at are CHEAP — same data shape, four
658
+ visual treatments, about 4 minutes total. Showing you four lets you
659
+ pick the right direction before I invest.
660
+ - The formal write-up (use cases, user stories, IA, interaction design,
661
+ GRASP, spec, migration plan) is EXPENSIVE — 10-15 minutes per
662
+ direction. Running that seven times would burn an hour.
663
+ - So: cheap first → you commit → expensive run, once, for the direction
664
+ you picked.
665
+
666
+ If any depth-link inside a variant says "coming after you pick" — that's
667
+ the contract. The link materializes once you've picked.
668
+
669
+ None of them feel right? Tell me what's off and I'll generate new
670
+ directions for you. (See /launch --refine, bassclef#942.)
671
+ ```
672
+
673
+ Substitute `<LOCAL_URL>` with the URL returned by Phase 12-alt. Substitute the actual variant count (`I made you N directions...`). Substitute the actual app description (`your family recipe wiki` etc.) from the InputArtifact's `intent` field.
674
+
675
+ The adopter-mode template **surfaces** (per bassclef#969):
676
+ - The formal artifacts the chain will produce post-pick, in plain English (use case, user stories, IA, interaction design, responsibility map, build spec, migration plan)
677
+ - The chain-ordering rationale (variants are cheap shared data; formal artifacts are expensive per-direction; cheap first → commit → expensive once)
678
+ - The depth-link "coming after you pick" contract (per bassclef#971)
679
+
680
+ The adopter-mode template **skips entirely**:
681
+ - The DRAFT iteration-goal review framing (Sam doesn't review goals).
682
+ - The `selected_variant:` YAML edit instruction.
683
+ - The `status: draft → status: active` frontmatter flip instruction.
684
+ - The bare `/build <slug>-construction` command name.
685
+
686
+ #### Natural-language variant selection (talk-to-pick)
687
+
688
+ Agent listens for the adopter's variant selection in natural language and auto-handles the YAML + frontmatter mechanics. Recognized phrases (case-insensitive, fuzzy):
689
+
690
+ - "I like variant N" / "variant N" / "#N" / "the Nth one" / "number N"
691
+ - "the cozy one" / "the minimal one" / "the bold one" — fuzzy-matches against variant names or luminary signatures in the gallery
692
+ - "let's go with the first" / "the second" / "the last"
693
+
694
+ When matched, the agent automatically:
695
+
696
+ 1. Updates `selected_variant: <N or slug>` in `docs/preview-state/<sprint-slug>.yml`
697
+ 2. Flips iteration-goal frontmatter `status: draft → active` in `docs/iteration-bets/<sprint-slug>-construction.md`
698
+ 3. Surfaces the /build dispatch with plain-English framing (per bassclef#943 — `/build` adopter-mode framing)
699
+
700
+ The adopter never sees the YAML or frontmatter mechanics. The agent confirms in plain English:
701
+
702
+ ```
703
+ Got it — going with the cozy notebook direction (variant 2). I'll start
704
+ writing your app code now. About 15 minutes.
705
+ ```
706
+
707
+ #### Operator-mode completion (non-`--local` or operator override)
708
+
709
+ Today's YAML-edit + frontmatter-flip + bare command path stays available verbatim for operator workflows where the YAML surface is the convenient pick mechanism (scripts, batch processing, multi-variant comparisons):
710
+
711
+ ```
712
+ Your next actions, in order
713
+
714
+ 1. Walk the gallery → pick a variant on your phone or laptop.
715
+ 2. Edit selected_variant: in docs/preview-state/<slug>.yml.
716
+ 3. Flip the iteration-goal frontmatter status: draft → status: active.
717
+ 4. Run /build <slug>-construction — Builder dispatches per step.
718
+
719
+ Skipped vs full /launch chain (available if you want depth):
720
+ - /use-case (Cockburn formalization)
721
+ - /user-stories (INVEST backlog tokens)
722
+ - /decompose (GRASP responsibility audit)
723
+ ```
724
+
725
+ Operator-mode also surfaces the natural-language listener path as a convenience — operators can talk-to-pick too if they prefer.
726
+
727
+ #### Mode selection
728
+
729
+ ```
730
+ if "--local" flag is set:
731
+ mode = "adopter"
732
+ else:
733
+ mode = "operator"
734
+
735
+ # Operator can force adopter-mode for demos via --adopter-mode flag (V2).
736
+ # Operator can force operator-mode in a --local context via --operator-mode flag.
737
+ ```
738
+
739
+ #### Refine path (bassclef#942 — "none of these feel right")
740
+
741
+ When the adopter walks the 4 variants and none feel right, the agent listens for refinement cues and re-runs Phase 4+ with refined intent. Two entry paths.
742
+
743
+ **Natural-language listener (default in adopter mode).** Recognized phrases (case-insensitive, fuzzy):
744
+
745
+ - "none of these feel right"
746
+ - "none feel right"
747
+ - "they all feel too X" (cold / busy / corporate / glossy / minimal)
748
+ - "I want something more X"
749
+ - "can you try again"
750
+ - "let me see other options"
751
+ - "I don't love any of these"
752
+
753
+ When matched, the agent asks one short follow-up if the cues don't include a specific direction:
754
+
755
+ ```
756
+ What's off? Too busy? Too cold? Missing something specific?
757
+ ```
758
+
759
+ The adopter's answer becomes the refinement intent. Agent captures it into the InputArtifact's new `refinement_passes` array (schema field added at `standards/state-spine/schemas/input-artifact.schema.json`).
760
+
761
+ **Explicit flag form (operator convenience):**
762
+
763
+ ```bash
764
+ /launch --refine "make them feel more like a worn cookbook, less like an app"
765
+ ```
766
+
767
+ The `--refine` flag carries the refinement intent directly without the conversational round-trip. Operators in scripted workflows prefer this.
768
+
769
+ **Refinement execution.** Once refinement intent is captured:
770
+
771
+ 1. Agent appends the refinement intent to the original intent paragraph (preserves lineage; doesn't replace the original)
772
+ 2. Re-dispatches `/pick-luminaries` (Phase 3.5) — fresh LLM pick reads the combined intent + refinement context, picks different luminaries than the prior pass
773
+ 3. Re-dispatches Phase 4 (`/riff-prototypes`) — generates a new gallery with the refined picks
774
+ 4. Emits the gallery at the same `LOCAL_URL` (overwriting prior `current_variants` in `preview-state.yml`, OR writing to a new sub-path like `/refine-1/` per implementation choice)
775
+
776
+ **InputArtifact lineage.** Each refinement pass records:
777
+
778
+ ```json
779
+ {
780
+ "refinement_passes": [
781
+ {
782
+ "intent": "make them feel more like a worn cookbook, less like an app",
783
+ "timestamp": "2026-06-13T13:15:00Z",
784
+ "generated_variants": ["variant-paula-scher", "variant-ellen-lupton", "variant-jenifer-tidwell"],
785
+ "selected_after_refine": null
786
+ },
787
+ {
788
+ "intent": "still too crisp; try warmer, more handwritten",
789
+ "timestamp": "2026-06-13T13:24:00Z",
790
+ "generated_variants": ["variant-edward-tufte", "variant-eric-meyer", "variant-don-norman"],
791
+ "selected_after_refine": 2
792
+ }
793
+ ]
794
+ }
795
+ ```
796
+
797
+ The lineage preserves what was tried + which variant finally won.
798
+
799
+ **3-pass cap.** After 3 refinement passes, the agent surfaces a step-back prompt:
800
+
801
+ ```
802
+ We've tried 3 directions. Want to step back and rethink the intent
803
+ paragraph itself? Or pick the closest variant we've generated so far
804
+ and refine the details in /build?
805
+ ```
806
+
807
+ This prevents infinite-loop refinement. The cap is configurable via `--refine-cap N` flag (default 3) for operators who want longer runs.
808
+
809
+ **Composes with completion handoff.** Refined gallery uses the same adopter-mode completion template (`I made you 4 directions for your family recipe wiki...`); the natural-language pick listener still applies after refinement.
810
+
811
+ ### Phase 15 — Open PR
812
+
813
+ PR body includes:
814
+ - All variant URLs (with back-nav to gallery)
815
+ - Master gallery URL
816
+ - Spec / GRASP / ux-migration links (visible for cameo review)
817
+ - Champion-challenger ratio summary
818
+ - Construction iteration-goal draft path (operator's next action)
819
+ - Bind-subdomain status per variant
820
+
821
+ PR body MUST surface: "Operator's next action: review the Construction
822
+ iteration-goal draft at <path>; if approved, run `/build-iteration
823
+ <slug>-construction` (bassclef#335)."
824
+
825
+ ## Tier behavior (BUILD-only — see /stage (formerly /preview) for prototype tiers)
826
+
827
+ | Tier | Phase B MVP | Status |
828
+ |---|---|---|
829
+ | `quick` | ❌ Refused — use `/stage quick` | redirected |
830
+ | `light` | ❌ Refused — use `/stage light` | redirected |
831
+ | `medium` | ✅ Full chain (Phases 1-15). 3 variants + Anthropic baseline + buildable spec + GRASP + ux-migration + Construction iteration-goal draft. ~1 day wall time. | Phase B MVP scope |
832
+ | `full` | ✅ Same as medium + per-persona /value-prop-canvas + per-goal /use-case + /synthetic-user pair-embodiment validation. 3-5 variants + audit-grade spec. ~3 days wall time. | Phase B MVP scope (full tier ships in same skill; differs by Phase 3b + variant count + /synthetic-user) |
833
+
834
+ ## Failure modes (Phase B MVP scope)
835
+
836
+ Same baseline as `/stage` PLUS:
837
+
838
+ | Failure | Behavior |
839
+ |---|---|
840
+ | `/use-case` produces empty extension list | Proceed; warn that spec may be too thin for Construction |
841
+ | `/spec` validation fails (missing required acceptance criteria) | BLOCK; fix or operator override |
842
+ | `/ux-migration` fails (no design tokens, no variant chosen) | BLOCK; require operator pick variant via `base=<slug>` first |
843
+ | Construction iteration-goal draft frontmatter doesn't validate | BLOCK; state-validate.sh hook surfaces missing fields |
844
+
845
+ ## Rules
846
+
847
+ - **PR-first, always** — same as `/stage`
848
+ - **All state writes through accessor** — same as `/stage`
849
+ - **Stub-mode tolerance** — same as `/stage`
850
+ - **Champion-challenger captured** — `is_baseline` flag preserved
851
+ - **Best-effort bind-subdomain** — same as `/stage`
852
+ - **Spec + decomp + ux-migration always surfaced in gallery** —
853
+ cameo-review-by-default; non-negotiable
854
+ - **Construction iteration-goal draft is a DRAFT** — operator MUST
855
+ review + commit status:active before `/build-iteration` runs
856
+
857
+ ## Skipping / Aborting
858
+
859
+ - Same as `/stage`, plus:
860
+ - Spec validation failure: BLOCK; operator fixes via /spec re-run
861
+ - ux-migration step fails (no chosen variant): operator must run with
862
+ `base=<slug>` OR pick winner via gallery review
863
+
864
+ ## Reserved-names check
865
+
866
+ `launch` is NOT on `standards/reserved-skill-names.md` list.
867
+ Verified during this skill creation.
868
+
869
+ ## Relationship to other skills + standards
870
+
871
+ - `/stage` — sibling (prototype tiers; same input-handler interface)
872
+ - `/interpret-input` — Phase 1 producer (same as /stage (formerly /preview))
873
+ - `/objectory-decompose` — Phase 2 producer (same as /stage)
874
+ - `/value-prop` — Phase 3 producer (different mode by tier)
875
+ - `/personas`, `/jtbd-tasks`, `/value-prop-canvas` — Phase 3b
876
+ - `/riff-prototypes` (with WU-11b baseline) — Phase 4
877
+ - `/use-case` — Phase 5 (Cockburn formalization)
878
+ - `/user-stories` — Phase 5b (INVEST backlog tokens, bassclef#358) — slices /use-case into stories that drive Phase 14's step enumeration
879
+ - `/ia-model` — Phase 6 (entity → nav)
880
+ - `/interaction-design` — Phase 7 (state + sequence)
881
+ - `/decompose` — Phase 8 (GRASP)
882
+ - `/spec` — Phase 9 (build-ready specification)
883
+ - `/prototype-gallery` (with back-nav injection) — Phase 10
884
+ - `/ux-migration` — Phase 11 (chosen variant → production)
885
+ - `/bind-subdomain` — Phase 12 (deploy variants + gallery)
886
+ - `/synthetic-user` — Phase 4b (full tier only)
887
+ - `/build` (bassclef#335; renames from `/build-iteration` per bassclef#359) — DOWNSTREAM consumer; takes Construction iteration-goal draft (with INVEST step enumeration from /user-stories) + dispatches Builder agent per step
888
+ - `/deploy-prod` — DOWNSTREAM final stage (after Construction)
889
+
890
+ ## What this skill enables (post-merge)
891
+
892
+ ```bash
893
+ # Operator dispatches from phone:
894
+ cd ~/src/your-org/your-app
895
+ /launch medium "Dramatically simplify and delightfully surface deals..."
896
+
897
+ # OR escalate from /stage output:
898
+ /launch medium "..." base=<your-variant-slug>
899
+ ```
900
+
901
+ Chain runs (~1 day for medium; ~3 days for full), opens PR with:
902
+ - Deployed clickable gallery (variants + back-nav)
903
+ - Buildable spec
904
+ - GRASP responsibility matrix
905
+ - ux-migration plan
906
+ - Construction iteration-goal DRAFT
907
+
908
+ Operator reviews on phone. If approved, runs `/build-iteration
909
+ <draft-slug>` (bassclef#335) which dispatches Builder agent →
910
+ step PRs → CI → /deploy-prod. Ends at functioning app in prod.
911
+
912
+ This is the Construction-transition step in the
913
+ "talking-out-loud → functioning app in prod" chain.
914
+
915
+ ## Enforcement
916
+
917
+ Methodology-level. State-validate.sh hook enforces preview-state.yml
918
+ + iteration-goal.schema.json validation. PR-first discipline enforced
919
+ via branching.md rule + pre-build-gate hook. Reserved-names check
920
+ passes. No additional hook enforcement added.
921
+
922
+ ## Output discipline
923
+
924
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.