@thebassclef/lite 1.1.1 → 1.2.0-alpha.1

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/dist/cli.cjs +23 -6
  2. package/dist/cli.js +23 -6
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
  7. package/dist/lite/.claude/bassclef-orientation.md +120 -0
  8. package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
  9. package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
  10. package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
  11. package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
  12. package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
  13. package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
  14. package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
  15. package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
  16. package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
  17. package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
  18. package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
  19. package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
  20. package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
  21. package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
  22. package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
  23. package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
  24. package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
  25. package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
  26. package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
  27. package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
  28. package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
  29. package/dist/lite/.claude/hooks/save-state.sh +268 -0
  30. package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
  31. package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
  32. package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
  33. package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
  34. package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
  35. package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
  36. package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
  37. package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
  38. package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
  39. package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
  40. package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
  41. package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
  42. package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
  43. package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
  44. package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
  45. package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
  46. package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
  47. package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
  48. package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
  49. package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
  50. package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
  51. package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
  52. package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
  53. package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
  54. package/dist/lite/.claude/rules/cost-governance.md +154 -0
  55. package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
  56. package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
  57. package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
  58. package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
  59. package/dist/lite/.claude/rules/session-artifacts.md +30 -0
  60. package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
  61. package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
  62. package/dist/lite/.claude/rules/usability.md +22 -0
  63. package/dist/lite/.claude/settings.json +20 -0
  64. package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
  65. package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
  66. package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
  67. package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
  68. package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
  69. package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
  70. package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
  71. package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
  72. package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
  73. package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
  74. package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
  75. package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
  76. package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
  77. package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
  78. package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
  79. package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
  80. package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
  81. package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
  82. package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
  83. package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
  84. package/dist/lite/.claude/skills/release/SKILL.md +311 -0
  85. package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
  86. package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
  87. package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
  88. package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
  89. package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
  90. package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
  91. package/dist/lite/.claude/skills/state/SKILL.md +204 -0
  92. package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
  93. package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
  94. package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
  95. package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
  96. package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
  97. package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
  98. package/dist/lite/README.md +5 -1
  99. package/dist/lite/gitignore +6 -0
  100. package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
  101. package/dist/lite/lib/clone-failure-classifier.sh +59 -0
  102. package/dist/lite/lib/fixture-builder.sh +190 -0
  103. package/dist/lite/lib/fresh-install-check.sh +49 -0
  104. package/dist/lite/lib/hook-heartbeat.sh +0 -1
  105. package/dist/lite/lib/mechanism-fidelity.sh +569 -0
  106. package/dist/lite/lib/npm-version-check.sh +112 -0
  107. package/dist/lite/lib/preview-state.sh +229 -0
  108. package/dist/lite/lib/session-rescue.sh +0 -1
  109. package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
  110. package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
  111. package/dist/lite/standards/architect-review-discipline.md +222 -0
  112. package/dist/lite/standards/bassclef-platform.md +249 -0
  113. package/dist/lite/standards/bassclef-test-repos.md +97 -0
  114. package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
  115. package/dist/lite/standards/cold-adopter-harness.md +205 -0
  116. package/dist/lite/standards/data-management.md +135 -0
  117. package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
  118. package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
  119. package/dist/lite/standards/lite-manifest.json +1456 -14
  120. package/dist/lite/standards/mechanism-fidelity.md +205 -0
  121. package/dist/lite/standards/operator-private-discipline.md +200 -0
  122. package/dist/lite/standards/operator-to-public-flow.md +195 -0
  123. package/dist/lite/standards/prototype-gallery.md +251 -0
  124. package/dist/lite/standards/pseudonym-key-schema.md +109 -0
  125. package/dist/lite/standards/sibling-validation-checklist.md +181 -0
  126. package/dist/lite/standards/slack-notifications.md +161 -0
  127. package/dist/lite/standards/synthetic-user-testing.md +173 -0
  128. package/dist/lite/standards/vendor-bindings.md +165 -0
  129. package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
  130. package/dist/lite/standards/vpc-fit-validation.md +167 -0
  131. package/dist/lite/templates/gallery-yml.md +113 -0
  132. package/dist/lite/templates/product-canvas.md +169 -0
  133. package/dist/lite/templates/value-prop-canvas.md +180 -0
  134. package/package.json +3 -3
  135. /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
@@ -0,0 +1,637 @@
1
+ ---
2
+ tier: lite
3
+ name: riff-prototypes
4
+ description: "DEPRECATED \u2014 use /stage instead. Visual variants with luminary champion-challenger; work absorbed by /stage light size per ADR-020. Retained during 3-month deprecation grace before retirement."
5
+ problem: "DEPRECATED \u2014 use /stage instead. Visual variants with luminary champion-challenger."
6
+ value: "Deprecated skill absorbed into /stage. Points to the new entry point."
7
+ inputs: [Redirects to /stage]
8
+ outputs: [Deprecation notice, Redirect to /stage]
9
+ deprecated: true
10
+ deprecated_in_favor_of: /stage
11
+ deprecated_decision: architecture/decisions/ADR-020-prototype-skill-family-consolidation.md
12
+ user_invocable: true
13
+ disable_model_invocation: false
14
+ composes_baseline: anthropic-frontend-design
15
+ ---
16
+
17
+ > **Baseline composition:** Bassclef's variant authoring composes on top of Anthropic's `frontend-design` skill defaults. Adopters firing plain Claude inherit those defaults; this skill (and `/stage`) extend with luminary champion-challenger commitment + bassclef's design-discipline.
18
+
19
+ # Prototype Variants — DEPRECATED
20
+
21
+ > **Deprecation notice (2026-05-12 per ADR-020):** This skill is deprecated in favor of `/stage` (light size). `/stage` already produces variants with luminary champion-challenger. New work should invoke `/stage light` instead. This skill remains invocable during the deprecation grace period (≥3 months) before retirement.
22
+
23
+ # Prototype Variants — Visual Options Before Construction
24
+
25
+ Produce 2-3 lightweight static prototypes, each driven by a different
26
+ primary luminary's perspective. The operator views them locally and
27
+ selects a direction before committing to a full build.
28
+
29
+ ## When to use
30
+
31
+ - At the start of Elaboration (step 0), after Inception passes
32
+ - When the iteration goal's phase is Elaboration or Construction
33
+ - When UI/UX direction is uncertain and the operator wants to see options
34
+ - When `/autonomous start` detects phase=Elaboration and asks about prototypes
35
+
36
+ Can also be invoked standalone at any time.
37
+
38
+ ## What a prototype IS
39
+
40
+ - Static HTML + CSS + Tailwind in `docs/prototypes/YYYY-MM-DD-variant-N/`
41
+ - Stubbed data (hardcoded JSON in a `<script>` tag or inline, no API calls)
42
+ - 1-3 pages showing the key interaction (list, detail, form — whatever the scope demands)
43
+ - Viewable via `npx serve docs/prototypes/variant-N/` or `open docs/prototypes/variant-N/index.html`
44
+ - Built in minutes, not hours
45
+ - Screenshotted by the agent using Playwright MCP. When Playwright MCP is not enabled, the skill BLOCKs with `INSTEAD: enable Playwright MCP before continuing`.
46
+
47
+ ## What a prototype IS NOT
48
+
49
+ - Not a full Next.js app — no routing framework, no app directory
50
+ - Not connected to any database — no Prisma, no API routes
51
+ - Not deployed anywhere — local only
52
+ - Not tested — this is throwaway. Construction builds the real thing.
53
+ - Not production code — it's a visual sketch in HTML
54
+
55
+ ## Procedure
56
+
57
+ ### 1. Read the Inception artifacts
58
+
59
+ - Product canvas (scope, what survived, what was killed)
60
+ - Risk register (what UX/tech risks exist)
61
+ - Iteration bet (what value/lovability we're proving)
62
+
63
+ ### 2. Choose sprint mode
64
+
65
+ Use AskUserQuestion to ask:
66
+
67
+ > **How do you want to run this prototype sprint?**
68
+ >
69
+ > 1. **Bake-off** — I pick the number of variants (2-3). The system
70
+ > selects luminaries matched to the scope, builds all variants,
71
+ > runs /visual-review on each, scores them, and recommends a winner
72
+ > based on the iteration goal's risk + value signals. I approve or
73
+ > override the recommendation.
74
+ >
75
+ > 2. **Curated** — I pick which luminaries to prototype against, view
76
+ > the results myself, and choose the winner. Visual review still
77
+ > runs for evidence, but I make the call.
78
+
79
+ #### Bake-off mode
80
+
81
+ The system selects luminaries based on the scope type:
82
+
83
+ | Scope type | Luminaries selected | Rationale |
84
+ |---|---|---|
85
+ | Data-heavy tools | Norman, Prater, Tufte | Affordance, entity-derived nav, data display |
86
+ | Storytelling/narrative | Lupton, Apple HIG, Cooper | Visual hierarchy, restraint, goal-directed |
87
+ | Dashboard/overview | Tufte, Morville, Material | Data-ink, findability, systematic tokens |
88
+ | Forms/input | Norman, Tidwell, Cooper | Affordance, proven patterns, goals |
89
+ | Emotional/consumer | Walter, Fogg, Lupton | Delight, behavior triggers, storytelling |
90
+
91
+ If the scope doesn't clearly match one type, ask the operator to pick
92
+ the scope type (not the luminaries — the system handles that).
93
+
94
+ After visual review scores all variants, the system recommends a winner:
95
+ - Highest usability score is the tiebreaker
96
+ - If scores are close (<2 points apart), recommend the variant that
97
+ best aligns with the iteration goal's risk signal
98
+ - Present the recommendation with evidence. Operator approves or overrides.
99
+
100
+ #### Input sources
101
+
102
+ The luminaries driving each variant come from one of these paths, in priority order:
103
+
104
+ 1. **Operator-private intent grounding (if loaded)** — when an operator-private `/extract-intent` skill is available via `additionalDirectories` (the optional two-repo pattern per `standards/operator-private-discipline.md`), this skill reads its `matched_luminaries` output from the InputArtifact passed in.
105
+
106
+ 2. **Bassclef-core `/pick-luminaries`** — single LLM call against the configured model provider (default Anthropic Haiku). The default bassclef-core path; works for any consumer with an `ANTHROPIC_API_KEY`.
107
+
108
+ 3. **Operator picks** (curated mode) — manual selection from menu.
109
+
110
+ 4. **`/luminary recommend`** — signal scoring (Garrett-plane + primary-domain coverage). Fallback when the picker refuses (no API key, network failure).
111
+
112
+ 5. **Scope-keyword bake-off table** (legacy lines 67-74) — last-resort path for degraded environments.
113
+
114
+ Ceiling: **5 variants maximum** (4 pure + 1 hybrid, or 5 pure). Beyond
115
+ 5, cognitive load and budget outweigh exploration benefit.
116
+
117
+ **Hybrid variant rule**: A hybrid (two luminaries stacked in one variant)
118
+ is allowed ONLY when the two luminaries operate on **different Garrett
119
+ planes** (strategy / scope / structure / skeleton / surface). Same-plane
120
+ hybrids produce contradictions (which structure wins? which surface
121
+ language?) and must be rejected.
122
+
123
+ **Hybrid / mashup MUST emit a Carry-Forward Ledger before building.**
124
+ When producing a hybrid from two existing variants (or iterating on
125
+ a selected variant post-sprint), the agent must FIRST read both source
126
+ variant files end-to-end and produce a ledger. No ledger = no build.
127
+
128
+ ```
129
+ ## Carry-Forward Ledger
130
+
131
+ ### Source variants read
132
+ - docs/prototypes/YYYY-MM-DD-variant-a-[luminary]/index.html (L1-L400)
133
+ - docs/prototypes/YYYY-MM-DD-variant-b-[luminary]/index.html (L1-L520)
134
+ - docs/prototypes/YYYY-MM-DD-variant-a-[luminary]/README.md
135
+
136
+ ### From Variant A (carrying forward — cite line ranges)
137
+ - [element]: [file:lines] — [why it carries]
138
+ - [element]: [file:lines] — [why it carries]
139
+
140
+ ### From Variant B (carrying forward — cite line ranges)
141
+ - [element]: [file:lines] — [why it carries]
142
+
143
+ ### Changing / replacing (explicit deltas)
144
+ - [element]: was [A's treatment at file:lines] OR [B's] → now [new treatment]
145
+ — [why the change is needed]
146
+
147
+ ### Dropping (with reason)
148
+ - [element]: was [source:lines] → removed — [reason]
149
+
150
+ ### Inventing (new, not from either source)
151
+ - [element]: — [reason this is new, not a pattern-match to generic UI]
152
+ ```
153
+
154
+ This ledger is the anti-pattern-match gate. Invention is allowed, but
155
+ must be explicit and justified — not the default because the agent
156
+ didn't read the sources.
157
+
158
+ **Applies equally to**:
159
+ - Hybrid variant in a new sprint (combining two luminary POVs)
160
+ - Post-sprint iteration on a selected variant (carrying it forward
161
+ with refinements)
162
+ - Extending a variant to new surfaces (e.g., Review Queue variant
163
+ extended to Outreach) — the new surface must cite what's carrying
164
+ from the original and what's new
165
+
166
+ See `.claude/rules/artifact-ingestion.md` — this is the skill-level
167
+ instantiation of that rule for prototype work.
168
+
169
+ #### Curated mode
170
+
171
+ Use AskUserQuestion to let the operator pick which luminary perspectives
172
+ to prototype against. Present the full menu organized by discipline:
173
+
174
+ > **Pick up to 3 luminaries for your prototype variants.**
175
+ > Each variant will be built through that thinker's dominant lens.
176
+ >
177
+ > **UX / Interaction:**
178
+ > - Don Norman — affordance-first, minimal chrome, obvious actions
179
+ > - Jakob Nielsen — 10 usability heuristics, discount usability
180
+ > - Alan Cooper — goal-directed, start from user goals, work backward
181
+ > - Steve Krug — "Don't Make Me Think", intuitive navigation
182
+ > - Sophia Prater — entity-derived, navigation mirrors the domain model
183
+ > - Jenifer Tidwell — proven interaction patterns for common UI problems
184
+ > - Luke Wroblewski — mobile-first, touch-first interaction
185
+ > - Golden Krishna — no-interface thinking, beyond screens
186
+ >
187
+ > **Visual / Typography / Color:**
188
+ > - Ellen Lupton — storytelling hierarchy, the page tells a narrative
189
+ > - Josef Albers — color as context, relative not absolute, test combinations
190
+ > - Eva Heller — color psychology, emotional associations across cultures
191
+ > - Johannes Itten — seven types of color contrast, color harmonics
192
+ > - Edward Tufte — data-ink ratio, maximum information, minimum decoration
193
+ > - Apple HIG — progressive disclosure, clarity, restraint
194
+ > - Google Material — systematic visual language, tokens over ad-hoc
195
+ >
196
+ > **Information Architecture:**
197
+ > - Peter Morville — how content is organized, labeled, navigated
198
+ > - Abby Covert — sense-making, structure from complexity
199
+ > - Richard Saul Wurman — LATCH (Location, Alphabet, Time, Category, Hierarchy)
200
+ > - Jesse James Garrett — multi-layered UX structure (strategy → surface)
201
+ >
202
+ > **Psychology / Persuasion / Emotion:**
203
+ > - BJ Fogg — behavior design, motivation × ability × trigger
204
+ > - Robert Cialdini — persuasion principles (social proof, scarcity, authority)
205
+ > - Aarron Walter — emotional design hierarchy (functional → reliable → usable → pleasurable)
206
+ > - Susan Weinschenk — "The Brain Lady", cognitive science behind user behavior
207
+
208
+ If the operator doesn't pick, propose 3 based on the scope:
209
+ - **Data-heavy tools** → Norman, Prater, Tufte
210
+ - **Storytelling/narrative** → Lupton, Apple HIG, Cooper
211
+ - **Dashboard/overview** → Tufte, Morville, Material
212
+ - **Forms/input** → Norman, Tidwell, Cooper
213
+ - **Emotional/consumer** → Walter, Fogg, Lupton
214
+
215
+ In curated mode, the operator also picks the winner after reviewing.
216
+ Visual review evidence is presented but the recommendation is advisory.
217
+
218
+ #### Winner selection by parent session mode
219
+
220
+ | Parent mode | Winner selection |
221
+ |-------------|------------------|
222
+ | operator-gated (any flags) | Operator picks after reviewing visual-review output |
223
+ | orchestrator-gated + gate-ux | Operator picks (gate-ux pulls UX back) |
224
+ | orchestrator-gated (no gate-ux) | Orchestrator auto-picks highest composite score |
225
+
226
+ **Auto-pick logic (orchestrator-gated without gate-ux):**
227
+
228
+ 1. Run `/visual-review` on each variant as normal
229
+ 2. Compute composite score per variant:
230
+ - Visual review score (weighted 60%)
231
+ - Signal match score from `/luminary recommend` (weighted 30%)
232
+ - Luminary adherence score (did the variant actually apply the POV?) (weighted 10%)
233
+ 3. Orchestrator picks highest composite score as winner
234
+ 4. Ties broken by signal match score (stronger match wins)
235
+ 5. Write decision to danger-mode summary:
236
+ ```
237
+ ## Prototype winner auto-pick
238
+ - Winner: variant-2 (Norman-dominant)
239
+ - Composite score: 87/100 (visual 52/60 + signal 27/30 + adherence 8/10)
240
+ - Runner-up: variant-1 (Prater-dominant) — 81/100
241
+ - Rationale: [visual review findings summary]
242
+ - Confidence: medium (two variants within 10 points)
243
+ ```
244
+ 6. Update iteration goal `primary_luminaries` field (LIST form per
245
+ the collapse-to-single anti-pattern documented in bassclef follow-up
246
+ promotions) with winner. If the winner variant embodied a pair/triple,
247
+ write ALL entries — do not collapse. Include role annotations.
248
+
249
+ **Pair embodiment validation** (extension mode):
250
+
251
+ When the iteration is extending a prior prototype that carried a
252
+ luminary pair (e.g., "Variant D = Tufte + Morville"), the extension
253
+ prototype MUST embody BOTH luminaries. Validation during visual
254
+ review:
255
+
256
+ - For each luminary in the carried pair, score adherence 0-10
257
+ (how strongly did this prototype apply this luminary's POV?)
258
+ - If any luminary's adherence < 5, the extension FAILED pair
259
+ embodiment. Report specifically which luminary was collapsed.
260
+ - Composite score (for auto-pick) weights pair embodiment: if any
261
+ luminary adherence < 5, cap composite at 50/100.
262
+
263
+ Evidence of collapse patterns (see (see bassclef follow-up promotions).:
264
+ - Iteration bet writes "Tufte (carried from Variant D)" — missing Morville
265
+ - Prototype shows dense data but no navigation facets — Tufte applied,
266
+ Morville ignored
267
+ - Responsibility matrix attribution all cites one luminary — the other
268
+ wasn't operationalized
269
+ 7. All variants (including rejected) remain in `docs/prototypes/` —
270
+ operator reviews rejected directions alongside winner
271
+
272
+ **Override**: operator reviewing PR can change `primary_luminary` in
273
+ the iteration goal and re-run `/decompose` if they disagree with the
274
+ auto-pick after seeing results.
275
+
276
+ #### When X dominates — what the variant actually looks like
277
+
278
+ Three "data-heavy" variants (Norman, Prater, Tufte) must produce
279
+ genuinely distinct prototypes. If they blur together, the luminary
280
+ signal is being ignored and the sprint has failed its purpose. These
281
+ sketches show what each dominant POV produces. Load the luminary's
282
+ full file (`.claude/luminaries/[slug].md`) before building the variant
283
+ — the signature, core methods, anti-patterns, and worked example drive
284
+ concrete design decisions.
285
+
286
+ **Prater-dominant** (data-heavy, relational):
287
+ - Primary nav is **object-based**: Deals, Brokers, Sellers, Buyers.
288
+ Not feature-based ("Search," "Reports").
289
+ - ORCA applied: entity inventory explicit, relationships drive
290
+ navigation, CTAs per object, attributes layered by priority.
291
+ - **Progressive disclosure** of data: core nouns above the fold;
292
+ enrichment data behind expansion; audit fields footer-level.
293
+ - Detail views are **componentized** from the object model, not
294
+ one-off designs.
295
+ - **Signal of success**: users can navigate the domain via object
296
+ relationships without using search.
297
+
298
+ **Norman-dominant** (data-heavy, affordance-forward):
299
+ - Every control's affordance is explicit: buttons look clickable,
300
+ disabled states explain why, hovers confirm interactivity.
301
+ - **Feedback loops** visible for every action: toast, optimistic UI,
302
+ error recovery with specific cause.
303
+ - **Mapping** explicit: actions visually grouped with their targets
304
+ (submit near last field, stage-advance near stage indicator).
305
+ - **Constraints** prevent wrong actions structurally (validated
306
+ fields, disabled transitions missing prerequisites).
307
+ - **Signal of success**: a first-time user can complete primary tasks
308
+ without documentation.
309
+
310
+ **Tufte-dominant** (data-heavy, information-density):
311
+ - **Data-ink maximized**: no decorative gridlines, borders, or
312
+ background cards. Every visual element encodes data.
313
+ - **Small multiples** where one big chart was the obvious choice.
314
+ - **Sparklines** embedded in tables showing trend without dominating
315
+ layout.
316
+ - **Dense tables** with many rows visible; typography does the
317
+ hierarchy, not chrome.
318
+ - **Signal of success**: high information-per-pixel ratio, user can
319
+ see dozens of data points simultaneously without visual noise.
320
+
321
+ **Rams-dominant** (minimalist, functional):
322
+ - Every element earns its place. Empty space is acceptable, even
323
+ preferred.
324
+ - No trend-chasing aesthetic flourishes (no neumorphism, no
325
+ glassmorphism, no gradients-for-gradient's-sake).
326
+ - **Functional honesty**: buttons look like buttons, disabled like
327
+ disabled, errors like errors.
328
+ - **Subtraction applied**: five features → three features done
329
+ excellently.
330
+ - **Signal of success**: the product looks as contemporary in 5 years
331
+ as it does today.
332
+
333
+ **Ive-dominant** (precision, premium):
334
+ - **Seam resolution**: every state transition designed (hover, focus,
335
+ active, disabled, loading, error). No default chrome.
336
+ - **Single considered material**: one shadow family, one radius value,
337
+ one typography family at three weights max.
338
+ - **Invisibility of craft**: users don't notice precision; they feel
339
+ that it's right.
340
+ - **Removal discipline**: components have minimal prop surface; if you
341
+ need a fourth variant, the design is wrong.
342
+ - **Signal of success**: the product feels inevitable — as if no other
343
+ version could exist.
344
+
345
+ **Lupton-dominant** (content-heavy, typographic):
346
+ - Type carries the hierarchy. Section headings in weight+size, not
347
+ colored boxes.
348
+ - **Modular scale** enforced (no arbitrary font sizes). **Vertical
349
+ rhythm** consistent across sections.
350
+ - **Two to three typefaces** max, paired for contrast in family +
351
+ harmony in proportion.
352
+ - Grid visible in structure but not in decoration.
353
+ - **Signal of success**: content is scannable without reading — eye
354
+ naturally follows typographic hierarchy.
355
+
356
+ **Cooper-dominant** (user-goal-forward):
357
+ - Primary persona's goals drive the main surface. Other personas get
358
+ goal-optimized secondary surfaces, not a feature-subset of the
359
+ primary.
360
+ - **Top-level nav** matches primary persona's end goals, not feature
361
+ taxonomy.
362
+ - **Scenarios as acceptance criteria**: each key scenario walks
363
+ end-to-end; the prototype demonstrates it.
364
+ - **Ruthless focus** on primary persona — secondary-persona needs
365
+ serve only when they don't compromise the primary.
366
+ - **Signal of success**: primary persona tasks feel natural and fast;
367
+ secondary tasks are possible but not optimized.
368
+
369
+ When producing three variants, pick luminaries whose **signal of success
370
+ is genuinely different**. Three data-heavy variants that all claim "clean
371
+ and usable" is a sign the luminaries aren't dominating — the POV should
372
+ be discernible in the sketch without needing the label.
373
+
374
+ ### 3. Build each variant
375
+
376
+ For each confirmed variant:
377
+
378
+ 1. **Compose the picked luminary's pattern shelves (bassclef#476 LR6).**
379
+ Read the picked luminary's frontmatter `solves_problems_brownfield:` +
380
+ `solves_problems_greenfield:` arrays from `.claude/luminaries/<slug>.md`
381
+ to confirm the imputed problems match the operator's intent.
382
+ Then compose pattern catalogs from each picked luminary's claimed
383
+ primary domain:
384
+ - **UX luminaries** → read `patterns/ux-ai/smarterpatterns/*.md` (LR4 #481) for AI-mediated UX patterns; read `patterns/ux-ix/*.md` if present for interaction patterns
385
+ - **Visual luminaries** → read `patterns/ux-ai/smarterpatterns/*.md` for AI surface patterns; read Frost atomic-design entries (LR5 #489) for component hierarchy patterns
386
+ - **Architecture luminaries** (rare in /riff-prototypes) → read `patterns/code/gof/*.md` (LR4 #485) + `patterns/code/fowler-poaa/*.md` (LR5 #490) if a pattern would shape the prototype's structure
387
+ - When the picked luminary references a pattern not in the catalog, dispatch `/agent-research-spawn` to fill the gap before continuing the variant build (transparent to operator; updates `docs/luminary-problem-pattern-backfill.md` if the luminary is itself unbackfilled)
388
+ - **Backfill graceful degradation:** Luminaries without `solves_problems_*` frontmatter (57 remaining as of LR6) skip the shelf-composition step; variant build falls back to legacy bake-off scope-keyword table. Operator gets a one-line warning + `/agent-research-spawn` opt-in to backfill on the spot.
389
+ 2. Create `docs/prototypes/YYYY-MM-DD-variant-N/index.html`
390
+ 3. Include Tailwind via CDN: `<script src="https://cdn.tailwindcss.com"></script>`
391
+ 4. Use the project's design tokens if they exist (read `design/design-tokens.css`)
392
+ 5. Hardcode 5-10 realistic data records inline (use names/patterns from the domain)
393
+ 6. Build the key pages: typically a list view + detail view + primary action
394
+ 7. Each variant should feel *distinctly different* — not three shades of the same thing
395
+ 8. State at the top of each HTML file which luminary drives it AND which catalog patterns the variant instantiates — cite catalog paths in HTML comments using the same `@pattern <catalog-path>` format defined by `.claude/rules/pattern-annotation.md`. When the variant graduates to production code, the annotations carry forward to the source files where they become hook-validated.
396
+ 9. **Mobile viewport is not optional.** Every prototype must specify behavior
397
+ at ≤768px. At minimum: does the sidebar collapse to a hamburger? Do tables
398
+ become cards? Do dense grids stack vertically? If you don't design the
399
+ mobile breakpoint, the Builder will guess — and guess wrong.
400
+ 10. **Depth-section: conditional rendering only (bassclef#971 V1).** If
401
+ the variant HTML includes a "What's underneath" / "If you want depth"
402
+ section listing the downstream formal artifacts (spec, use case, user
403
+ stories, IA model, interaction design, GRASP, persona, JTBD), each
404
+ item MUST follow one of two shapes — never a bare link to an
405
+ unverified path:
406
+
407
+ | Artifact state at variant-write time | Render as |
408
+ |---|---|
409
+ | File exists on disk (chain produced it pre-Phase 4) | Real `<a href="…">…</a>` link with `✓ ready` badge |
410
+ | File does NOT exist yet (chain produces it post-pick) | No link — plain text + `⏳ coming after you pick` badge |
411
+
412
+ Check existence using the same write-time check `local-serve.sh`
413
+ would resolve the link against. Standard layout assumes the gallery
414
+ is served at the parent of the variant directory, so depth-links
415
+ use `../<artifact-dir>/<slug>.md` paths.
416
+
417
+ At the bottom of the depth-section include one explanatory
418
+ sentence — exact text adopters see during smoke:
419
+
420
+ > The "coming after you pick" items get written for the variant you
421
+ > select. Pick a variant → that variant's directions get the full
422
+ > formal write-up.
423
+
424
+ Rationale: cold-adopter smoke 2026-06-13 hit 404s on every
425
+ depth-link because /riff-prototypes was rendering the section
426
+ BEFORE the chain produced the artifacts. V1 conditional rendering
427
+ closes the 404 surface without restructuring the chain.
428
+ V2 (post-chain link rewrite via /prototype-gallery) is bassclef#971
429
+ follow-up; V3 (pre-Phase 4 chain reorder) is bassclef#968.
430
+
431
+ Example structure:
432
+ ```
433
+ docs/prototypes/2026-04-04-variant-a-norman/
434
+ index.html ← list view (affordance-first)
435
+ detail.html ← detail view with primary action
436
+ README.md ← which luminary, what principle, what to look for
437
+
438
+ docs/prototypes/2026-04-04-variant-b-lupton/
439
+ index.html
440
+ detail.html
441
+ README.md
442
+
443
+ docs/prototypes/2026-04-04-variant-c-prater/
444
+ index.html
445
+ detail.html
446
+ README.md
447
+ ```
448
+
449
+ ### 3.5. Always emit Anthropic /frontend-design baseline (MUST — champion-challenger)
450
+
451
+ After building all N luminary-driven variants, ALWAYS dispatch
452
+ Anthropic's `/frontend-design` skill once to produce a baseline variant.
453
+ This is the architectural insurance that lets us measure whether the
454
+ luminary system is adding value over Anthropic's intrinsic frontend
455
+ design skill.
456
+
457
+ **Why mandatory:** without a measured baseline, the luminary system
458
+ can't prove it's doing real work. If operator picks the baseline
459
+ variant >50% of the time across runs, the luminary approach needs
460
+ review. If the luminary-driven variants beat the baseline consistently,
461
+ the luminary system is paying its rent.
462
+
463
+ **Procedure**:
464
+
465
+ 1. Output directory: `docs/prototypes/<sprint-slug>/variant-baseline-anthropic/`
466
+ 2. Dispatch `/frontend-design` via Skill tool with input prompt that
467
+ includes ONLY: scope description + value-prop summary + key data
468
+ shape. **Do NOT pass**:
469
+ - Luminary guidance ("apply Tufte data-density")
470
+ - Bassclef's design tokens (`design/tokens/*.css`)
471
+ - Reference to other variants in the sprint
472
+ - Iteration bet's `primary_luminaries` field
473
+
474
+ The baseline must measure what `/frontend-design` produces *without*
475
+ bassclef's design system as a constraint. Otherwise the comparison
476
+ is contaminated.
477
+
478
+ 3. Output: same shape as luminary variants (`index.html` + optional
479
+ `detail.html` + `README.md`). The README must state:
480
+ - "**Baseline — Anthropic /frontend-design** (no luminary contamination)"
481
+ - Date of generation + the prompt used
482
+ - Explicit note that this variant did NOT inherit bassclef's tokens
483
+
484
+ 4. Gallery flag (consumed by `/prototype-gallery`): the variant
485
+ directory name `variant-baseline-anthropic` is the marker.
486
+ `/prototype-gallery` SHOULD render baseline cards distinctively
487
+ (different border, "Baseline" badge, or annotation in card body)
488
+ so operators can tell at-a-glance which is the champion vs.
489
+ challenger.
490
+
491
+ 5. Comparison signal: when operator selects a winner (or auto-pick
492
+ fires), record `selected_variant: <slug>` AND `is_baseline: <bool>`
493
+ in `preview-state.yml` so the champion/challenger ratio can be
494
+ audited over time.
495
+
496
+ **What stays luminary-driven, what goes baseline**:
497
+
498
+ | Concern | Luminary variants (N) | Baseline (1) |
499
+ |---|---|---|
500
+ | Driver | Specific luminary's POV (Tufte, Norman, etc.) | Anthropic's frontend-design skill |
501
+ | Design tokens | `design/tokens/<product>.css` if exists | None (clean comparison) |
502
+ | Iteration bet primary_luminaries | Reads + applies | Ignores |
503
+ | Sprint-scope context | Full | Same scope; no luminary context |
504
+ | Output dir | `variant-<letter>-<luminary>/` | `variant-baseline-anthropic/` |
505
+ | Gallery treatment | Standard card | Baseline-flagged card |
506
+
507
+ **Operator override**: a future flag `--no-baseline` may suppress this
508
+ behavior for runs where the operator explicitly doesn't want the
509
+ comparison (e.g., already-validated direction, just doing variants of
510
+ the chosen luminary). Default is always-on per step-11b's contract.
511
+
512
+ ### 4. Visual review each variant (MUST gate)
513
+
514
+ After building each variant, run `/visual-review` on it. This is not
515
+ optional — structured evaluation replaces subjective preference.
516
+
517
+ For each variant:
518
+ 1. Serve it: `npx serve docs/prototypes/variant-N/ -l 3333`
519
+ 2. Run `/visual-review` — this screenshots, evaluates against the usability
520
+ standard, and scores through the variant's dominant luminary AND its
521
+ complement evaluators (see visual-review skill's complement pairs table)
522
+ 3. The report goes to `docs/visual-reviews/YYYY-MM-DD-prototype-variant-N.md`
523
+ 4. Kill the server after evaluation
524
+
525
+ After all variants are evaluated, produce the **prototype comparison table**
526
+ (see visual-review skill's "Prototype Variant Evaluation" section):
527
+ - Usability scores per variant
528
+ - Strongest/weakest principles per variant
529
+ - Evidence-based recommendation aligned to iteration goal risk + value
530
+
531
+ If Playwright MCP is not available, perform manual evaluation and note
532
+ "manual — no screenshot" in each report.
533
+
534
+ ### 5. Commit the prototypes + reviews
535
+
536
+ ```bash
537
+ git add docs/prototypes/ docs/visual-reviews/
538
+ git commit -m "docs: prototype sprint — N variants for [scope] with visual reviews"
539
+ ```
540
+
541
+ ### 6. Present results (mode-dependent)
542
+
543
+ **Bake-off mode:**
544
+
545
+ > **Prototype Bake-off complete.**
546
+ >
547
+ > **Visual review comparison:**
548
+ > [insert comparison table from Step 4]
549
+ >
550
+ > **Winner: Variant [X] ([luminary])** — [evidence: highest usability
551
+ > score + best alignment with iteration goal's risk/value signals]
552
+ >
553
+ > Elements worth carrying from other variants: [specific things]
554
+ >
555
+ > **Approve this winner, or override?**
556
+ > 1. Approve — proceed with [luminary] as primary
557
+ > 2. Override — I want [different variant]
558
+ > 3. Reject all — need different directions
559
+
560
+ In bake-off mode, the system auto-selects based on scores. The operator
561
+ confirms or overrides. If scores are within 2 points, present it as a
562
+ close call and explain the tiebreaker rationale.
563
+
564
+ **Curated mode:**
565
+
566
+ > **Prototype Sprint complete. View locally:**
567
+ >
568
+ > ```bash
569
+ > npx serve docs/prototypes/2026-04-04-variant-a-norman/ -l 3001
570
+ > npx serve docs/prototypes/2026-04-04-variant-b-lupton/ -l 3002
571
+ > npx serve docs/prototypes/2026-04-04-variant-c-prater/ -l 3003
572
+ > ```
573
+ >
574
+ > **Visual review comparison:**
575
+ > [insert comparison table from Step 4]
576
+ >
577
+ > **Recommendation** (advisory): [variant] — [evidence-based rationale]
578
+ >
579
+ > Each variant has a README + visual review report. Which direction?
580
+ > You can pick one, combine elements, or reject all.
581
+
582
+ In curated mode, the operator makes the final call. The visual review
583
+ comparison is evidence, not a decision.
584
+
585
+ ### 7. Selection → pipeline to Construction
586
+
587
+ Whether auto-selected (bake-off) or operator-chosen (curated), the
588
+ winner triggers a defined pipeline:
589
+
590
+ 1. **Set primary luminary**: Selected variant's luminary becomes
591
+ `primary_luminary:` in the iteration goal
592
+ 2. **Set complement evaluators**: Look up the complement pair in the
593
+ visual-review skill — these luminaries will evaluate ALL subsequent
594
+ UI work in this iteration
595
+ 3. **Run /ux-migration** (MUST gate — cannot skip):
596
+ - Component-level visual diff (every element, current vs. target)
597
+ - Design token extraction (concrete values from prototype HTML)
598
+ - Prototype HTML → React component mapping table
599
+ - Work packages with size/risk and dependency-aware build order
600
+ - Foundation work package first (shadcn init, tokens, shared layout)
601
+ - Output: migration spec at `docs/specs/ux-migration-*.md`
602
+ - This spec becomes the Builder's checklist for Construction
603
+ 4. **Designer runs Elaboration**: JTBD → HTA → IA → interaction design,
604
+ all guided by the selected luminary's principles
605
+ 5. **Foundation checkpoint**: shadcn init + design tokens + shared layout
606
+ committed and verified BEFORE any page work starts
607
+ 6. **Construction**: Builder implements work packages against the
608
+ migration spec checklist (not memory, not intuition)
609
+ 7. **Every UI commit**: triggers `/visual-review` with complement evaluators
610
+ 8. **Visual pass complete gate**: after ALL work packages, screenshot
611
+ every page side-by-side against prototype. Pass/fail matrix.
612
+
613
+ The prototype defines the visual direction for Construction. IA structure
614
+ and visual treatment are ONE thing, not two separate passes. When the
615
+ Builder constructs pages that the prototype covered, they must look like
616
+ the prototype — same layout, same typography, same component patterns.
617
+ Separating "structure now, visuals later" produces pages nobody can
618
+ validate because they don't look like what was designed.
619
+
620
+ The prototype is not a pixel-perfect spec — exact spacing and colors
621
+ may evolve. But the fundamental choices (tables vs. cards, sidebar vs.
622
+ top nav, dense vs. spacious) carry through to Construction unchanged.
623
+
624
+ ## Rules
625
+
626
+ - Prototypes are throwaway — never reference them as the implementation spec
627
+ - Each variant must be *distinctly different* in approach, not just color swaps
628
+ - Hardcoded data must be realistic (domain-appropriate names, values, patterns)
629
+ - Keep it simple: vanilla HTML + Tailwind CDN. No frameworks. No build steps.
630
+ - If the operator rejects all variants, that's data — ask what's missing and iterate
631
+ - Maximum 3 luminary-driven variants per sprint (PLUS the always-on Anthropic baseline = 4 total max). More than 3 luminary variants creates decision fatigue.
632
+ - **Anthropic /frontend-design baseline is always emitted** (per step-11b champion-challenger). Skip only via explicit `--no-baseline` operator override (rare). Baseline must NOT inherit bassclef's design tokens or luminary context — clean comparison or no comparison.
633
+ - **Capture champion-challenger signal**: when operator selects a winner, write `selected_variant` + `is_baseline` to `preview-state.yml`. Champion-challenger ratio audits across runs.
634
+
635
+ ## Output discipline
636
+
637
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.