@thebassclef/lite 1.1.1 → 1.2.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 (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,203 @@
1
+ ---
2
+ tier: lite
3
+ name: jtbd-tasks
4
+ description: "Translate Jobs-to-be-Done into task analysis \u2014 HTA trees plus CTA decision points. First step in the UX translation chain."
5
+ problem: "Jobs-to-be-Done get named but not decomposed. Downstream UX work skips the task hierarchy."
6
+ value: "Translates JTBDs into HTA trees and CTA decision points. First step in the UX translation chain."
7
+ inputs: [A JTBD statement or persona ref]
8
+ outputs: [Hierarchical task analysis tree, Critical decision points, Task inventory]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ ---
12
+
13
+ # JTBD → Task Analysis
14
+
15
+ Translate job statements into concrete task flows. First layer in the
16
+ JTBD → HTA → IA → State Diagram translation chain.
17
+
18
+ ## When to Use
19
+
20
+ - During the **Design phase** of the SDLC, concurrent with design diagrams
21
+ - A new feature or initiative enters the Design phase
22
+ - The user describes what they want to accomplish (a "job")
23
+ - Requirements feel vague — decompose into actionable tasks
24
+ - Before writing user stories — stories trace to tasks, tasks trace to jobs
25
+ - UX fitness review flags stale task analysis
26
+
27
+ ## Step 0: Bootstrap Personas
28
+
29
+ Before decomposing jobs, establish WHO has them. If persona files already
30
+ exist at `docs/design/personas/`, read them and skip to Method 1.
31
+
32
+ If no personas exist, check for existing canvas definitions first:
33
+
34
+ ### Canvas-aware bootstrapping
35
+
36
+ Search the repo for product canvases that already define users or personas:
37
+
38
+ 1. Glob for canvas files: `strategy/canvases/**/*.md`, `docs/strategy/canvases/**/*.md`
39
+ 2. In each canvas, look for persona tables, user lists, early adopter
40
+ sections, or "Users / Personas" headings
41
+ 3. Extract: name, role, tech level, and any other fields present
42
+
43
+ If canvases exist with persona data, pre-populate the minimum viable
44
+ persona and confirm with the operator:
45
+
46
+ > "I found [Name] in [canvas file] — [Role], [tech level].
47
+ > I'll create their persona file with what's here. Confirm or adjust."
48
+
49
+ This avoids re-asking what the operator already defined during product
50
+ shaping. The canvas is the source of "who and why." The persona file
51
+ adds "how" (device, jargon, patience) for testing.
52
+
53
+ If no canvases exist or canvases don't define personas, ask the operator
54
+ to name the people who use (or will use) the product.
55
+
56
+ ### Minimum viable persona
57
+
58
+ For each person, capture the **minimum viable persona**:
59
+
60
+ ```markdown
61
+ # [Name]
62
+
63
+ - **Age**: [age]
64
+ - **Role**: [product role — Viewer, Operator, Admin, etc.]
65
+ - **Device**: [primary device — mobile Safari, desktop Chrome, etc.]
66
+ - **Goal**: [the one job they hire this product to do]
67
+ - **Jargon comfort**: [knows domain terms / needs plain language]
68
+ ```
69
+
70
+ Five fields. That's the floor — enough to set a Playwright viewport,
71
+ filter jargon, and frame a JTBD statement.
72
+
73
+ Write each persona to `docs/design/personas/[name].md`.
74
+
75
+ ### Deeper profiling (optional — run when persona-driven testing reveals gaps)
76
+
77
+ If Tier 3 synthetic user tests produce shallow results, or if personas
78
+ feel interchangeable, extend with these questions. Ask only what's needed
79
+ — not all at once.
80
+
81
+ **Psychographic (how they think):**
82
+
83
+ | Field | Question | Drives |
84
+ |-------|----------|--------|
85
+ | Alternative | What do they use if this product doesn't exist? | Bar for "good enough" |
86
+ | Trust signal | How do they know the data is right? | What "score: 73" means to them |
87
+ | Density preference | Everything at once, or guided step by step? | Tables vs. progressive disclosure |
88
+ | Patience | How many steps before they bail? | Friction threshold for journey tests |
89
+ | Decision style | Gut feel or compare-the-numbers? | Whether they need charts or recommendations |
90
+ | Comeback trigger | What would make them open this tomorrow? | Retention signal |
91
+ | Never-word | A word they'd never use? | Jargon violation detector |
92
+
93
+ **Relationship (who they interact with):**
94
+
95
+ | Field | Question | Drives |
96
+ |-------|----------|--------|
97
+ | Linked personas | Who else uses this that they depend on? | Multi-persona journey tests |
98
+ | Needs from others | What do they need from other users' actions? | Handoff point testing |
99
+ | Cadence | Async (check when convenient) or sync (scheduled)? | When/how often they visit |
100
+
101
+ Add extended fields to the existing persona file under a `## Profile`
102
+ section. The minimum viable fields stay at the top — extended fields
103
+ are additive, never replace the core five.
104
+
105
+ ```markdown
106
+ # [Name]
107
+
108
+ - **Age**: [age]
109
+ - **Role**: [role]
110
+ - **Device**: [device]
111
+ - **Goal**: [goal]
112
+ - **Jargon comfort**: [level]
113
+
114
+ ## Profile
115
+
116
+ - **Alternative**: spreadsheet + phone calls
117
+ - **Trust signal**: sees who entered the data and when
118
+ - **Density**: wants everything visible — hates clicking to reveal
119
+ - **Patience**: 10+ clicks if each is productive
120
+ - **Decision style**: compare numbers side by side
121
+ - **Comeback trigger**: new deals appeared since last visit
122
+ - **Never-word**: "thingy"
123
+
124
+ ## Relationships
125
+
126
+ - **Linked to**: Mom (curates deals for her), Family (shares shortlist)
127
+ - **Needs from others**: family votes before Sunday dinner
128
+ - **Cadence**: daily check, 5-10 minutes
129
+ ```
130
+
131
+ ## Method 1: Hierarchical Task Analysis (HTA)
132
+
133
+ For **sequential, procedural work** — steps that follow a predictable order.
134
+
135
+ Break each job into: **Goal → Plan → Subtasks → Operations**
136
+
137
+ ```
138
+ JOB: [job statement]
139
+
140
+ GOAL 1: [goal]
141
+ PLAN: [strategy for achieving goal]
142
+ 1.1 [subtask]
143
+ 1.2 [subtask]
144
+ 1.3 [subtask]
145
+
146
+ GOAL 2: [goal]
147
+ PLAN: [strategy]
148
+ 2.1 [subtask]
149
+ ...
150
+ ```
151
+
152
+ ## Method 2: Cognitive Task Analysis (CTA)
153
+
154
+ For **judgment-heavy work** — where expertise drives decisions, not just steps.
155
+
156
+ Add to the HTA: **decision points, mental models, and expertise cues**
157
+
158
+ ```
159
+ GOAL 2: [goal]
160
+ DECISION: [what judgment is needed?]
161
+ CUES: [what information triggers the decision?]
162
+ MENTAL MODEL: [what expertise is applied?]
163
+ EXPERTISE: [what do experienced users look at first?]
164
+ ```
165
+
166
+ ## Output Format
167
+
168
+ For each JTBD, produce:
169
+
170
+ ```markdown
171
+ ## Job: [job statement]
172
+
173
+ ### HTA Tree
174
+ - Goal 1: [goal]
175
+ - 1.1 [subtask]
176
+ - 1.2 [subtask] → DECISION: [what judgment?]
177
+ - Cues: [what triggers the decision?]
178
+ - Mental model: [what expertise?]
179
+ - 1.3 [subtask]
180
+ - Goal 2: ...
181
+
182
+ ### Task Flow Diagram (Mermaid)
183
+ [flowchart showing sequential + branching task flow]
184
+
185
+ ### Traceability
186
+ | Task | JTBD | UI Implication |
187
+ |------|------|----------------|
188
+ | 1.1 ... | [job] | [screen or component implied] |
189
+ ```
190
+
191
+ ## Next Step
192
+
193
+ Output feeds into `/task-scenarios` (user stories) or directly into `/ia-model` (entity-driven IA).
194
+
195
+ ## References
196
+
197
+ - Alan Cooper, *About Face* — Goal-Directed Design
198
+ - Don Norman, *The Design of Everyday Things* — task analysis foundations
199
+ - Annett & Duncan (1967) — original HTA methodology
200
+
201
+ ## Output discipline
202
+
203
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
@@ -0,0 +1,256 @@
1
+ ---
2
+ tier: lite
3
+ name: objectory-decompose
4
+ description: "Apply Jacobson's analysis method to an InputArtifact. Extracts entities (domain nouns), actors (verb subjects), verb-goal pairs (use case candidates). Classifies objects per BCE (Boundary / Control / Entity). Output at docs/decompositions/."
5
+ problem: "Analysis phase skips systematic domain decomposition. Downstream classes miss real responsibilities."
6
+ value: "Applies Jacobson's analysis method to an InputArtifact. Extracts entities and actors and use cases."
7
+ inputs: [An InputArtifact from /interpret-input]
8
+ outputs: [Entity list — domain nouns, Actor list — verb roles, Use case sketch]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ ---
12
+
13
+ # /objectory-decompose — Jacobson Domain Decomposition (MVP)
14
+
15
+ Second step of the cameo pipeline. Takes a normalized
16
+ `InputArtifact` (output of `/interpret-input`) and applies Jacobson's
17
+ analysis method to produce an entity inventory + actor list +
18
+ verb-goal pairs + BCE classification matrix.
19
+
20
+ This is the bassclef-side "extraction" step — `/value-prop` and
21
+ `/riff-prototypes` downstream consume the decomposition to drive
22
+ variant generation grounded in actual domain language, not generic UI.
23
+
24
+ Per parent cameo pipeline goal's amendment 2026-04-26c — input
25
+ shape lives in the `InputArtifact`, not in this skill's args. Adding
26
+ new input modes (Phase C: URL, image, repo, transcript, napkin)
27
+ becomes adapter work in `/interpret-input`, not core extraction
28
+ changes here.
29
+
30
+ ## When to invoke
31
+
32
+ - workflow: `/stage <tier>` calls this after `/interpret-input`
33
+ - Standalone analysis: operator has an InputArtifact and wants the
34
+ Jacobson decomposition without running the full pipeline
35
+ - Debugging: re-run decomposition against an existing InputArtifact
36
+ to compare extraction quality
37
+
38
+ ## What this skill is NOT
39
+
40
+ | Skill | Altitude | Output |
41
+ |-------|----------|--------|
42
+ | `/objectory-decompose` | **Jacobson analysis** | Entity inventory + BCE matrix + verb-goal pairs |
43
+ | `/use-case` | Cockburn formalization | Numbered scenarios + extensions (separate skill) |
44
+ | `/decompose` | GRASP responsibility-assignment | Class responsibilities + patterns (Larman, design-time) |
45
+ | `/personas` | WHO primitive | Persona definitions (separate primitive) |
46
+
47
+ The three OOA/D thinkers compose linearly: Jacobson (this skill) →
48
+ Cockburn (`/use-case`) → Larman (`/decompose`). MVP ships Jacobson;
49
+ Cockburn formalization is deferred to follow-up goals.
50
+
51
+ ## Procedure
52
+
53
+ ### 1. Read InputArtifact via accessor
54
+
55
+ ```bash
56
+ source lib/state.sh
57
+ INPUT=$(state_reference_get input-artifact "<slug>")
58
+ ```
59
+
60
+ Or via wrapper:
61
+
62
+ ```bash
63
+ INPUT=$(bash scripts/state.sh get reference input-artifact "<slug>")
64
+ ```
65
+
66
+ **Required fields** (extract via `jq`):
67
+ - `extracted_text` — the load-bearing input for analysis
68
+ - `type` — guides extraction (text vs. URL vs. image have different signals)
69
+ - `structural_hints.entities_seen[]` — pre-extractor hints (may be empty)
70
+ - `structural_hints.actor_candidates[]` — pre-extractor hints (may be empty)
71
+
72
+ **Stub-mode handling**: if `extracted_text == "deferred to Phase C"`,
73
+ the input is a stub (Phase B doesn't implement extractors for non-text
74
+ modes). Surface a warning and produce a minimal decomposition with
75
+ empty inventories — operator's signal that downstream consumers will
76
+ have nothing meaningful to consume.
77
+
78
+ ### 2. Apply Jacobson method
79
+
80
+ For each section, the agent (the LLM running this skill) reads
81
+ `extracted_text` and identifies:
82
+
83
+ #### Entity inventory (nouns)
84
+
85
+ Domain nouns the system tracks. NOT generic technical concepts (like
86
+ "user" or "session" — those are control/boundary, not entity).
87
+
88
+ For the operator paragraph "deals that work for the family... close
89
+ to Wilmington... CPA business... organic food business", entities
90
+ might be: Deal, Business, Owner, Location, Cashflow, Family, Industry.
91
+
92
+ Output as bullet list under `## Entities`.
93
+
94
+ #### Actor list
95
+
96
+ Roles that interact with the system. Subjects of verbs in
97
+ `extracted_text`. Distinct from entities — an actor uses the system;
98
+ an entity is in the system.
99
+
100
+ For the operator paragraph: Operator (the searcher), Family (the
101
+ beneficiary), GM (placeholder operator), Broker (implicit).
102
+
103
+ Output as bullet list under `## Actors`.
104
+
105
+ #### Verb-goal pairs (use case candidates)
106
+
107
+ Each `<actor> <verb> <object>` triple from extracted_text. These
108
+ become use-case candidates that Cockburn's `/use-case` skill
109
+ formalizes later (deferred).
110
+
111
+ For the operator paragraph: "Operator surfaces deals", "Operator
112
+ filters by location", "GM is installed in business", "Family receives
113
+ cashflow".
114
+
115
+ Output as bullet list under `## Verb-goal pairs`.
116
+
117
+ #### BCE matrix (Jacobson classification)
118
+
119
+ For each identified noun in the extracted_text, classify per
120
+ Jacobson:
121
+
122
+ - **Boundary**: UI surface / form / API endpoint — what the actor sees
123
+ - **Control**: workflow orchestration — what coordinates the actors
124
+ - **Entity**: persistent domain state — the noun's data shape
125
+
126
+ Output as a 3-column markdown table under `## BCE matrix`.
127
+
128
+ For the operator paragraph: most identified nouns are Entity (Deal,
129
+ Business, Owner). Boundary objects emerge during /stage (formerly /preview)'s variant
130
+ generation (search bar, filter pills, deal card). Control objects
131
+ emerge during /decompose later (DealRanker, FamilyFitScorer).
132
+
133
+ ### 3. Write decomposition
134
+
135
+ Output: `docs/decompositions/<slug>-domain.md`
136
+
137
+ Slug derivation: `<input-artifact-slug>` (from the InputArtifact's
138
+ `id` field). Example: InputArtifact at
139
+ `docs/input-artifacts/2026-04-27-your-app-rework.json` → output
140
+ `docs/decompositions/2026-04-27-your-app-rework-domain.md`.
141
+
142
+ **Shape B frontmatter** (schema-validated by state-validate.sh):
143
+
144
+ ```yaml
145
+ ---
146
+ slug: <input-artifact-slug>-domain
147
+ type: domain-decomposition
148
+ input_artifact: <input-artifact-slug>
149
+ created_at: <ISO timestamp>
150
+ references:
151
+ - {type: input-artifact, id: <input-artifact-slug>}
152
+ entity_count: <integer>
153
+ actor_count: <integer>
154
+ phase: jacobson # marks Phase B MVP scope; cockburn is follow-up
155
+ ---
156
+ ```
157
+
158
+ **Body sections** (markdown, operator-readable narrative):
159
+ - `## Entities` (bullet list)
160
+ - `## Actors` (bullet list)
161
+ - `## Verb-goal pairs` (bullet list)
162
+ - `## BCE matrix` (3-column table)
163
+ - `## Notes` (any extraction caveats; stub-mode warnings; ambiguity flags)
164
+
165
+ ### 4. Validate output
166
+
167
+ After writing, the state-validate.sh hook validates the frontmatter
168
+ against `decomposition.schema.json`. If invalid, the write BLOCKs;
169
+ fix frontmatter and retry.
170
+
171
+ Or invoke explicitly:
172
+
173
+ ```bash
174
+ bash scripts/state.sh validate docs/decompositions/<slug>-domain.md
175
+ ```
176
+
177
+ Exit 0 = clean; exit 3 = schema violation (BLOCK message names the
178
+ field).
179
+
180
+ ### 5. Surface to next step
181
+
182
+ `/stage` workflow (WU-9) consumes the decomposition. Standalone
183
+ operator can read the markdown directly. Either way, this skill
184
+ returns the path to the decomposition file as its primary output.
185
+
186
+ ## Phase B MVP scope (what this skips)
187
+
188
+ Per the goal's WU-7 amendment ("compressed"):
189
+
190
+ | Element | Phase B (this skill) | Follow-up bet |
191
+ |---|---|---|
192
+ | Entity inventory | ✅ | (already done) |
193
+ | Actor list | ✅ | (already done) |
194
+ | Verb-goal pairs | ✅ | (already done) |
195
+ | BCE matrix | ✅ | (already done) |
196
+ | Cockburn use-case skeletons (precondition / main scenario / extensions / postcondition) | ❌ deferred | `/use-case` skill ships separately; consumes verb-goal pairs |
197
+ | GRASP responsibility assignment | ❌ deferred | `/decompose` skill (Larman, design-time) — runs after this in the chain |
198
+ | Domain model diagrams (entity-relationship) | ❌ deferred | Follow-up; mermaid renderer skill |
199
+
200
+ The skill produces the load-bearing structure (entities + actors +
201
+ verb-goals + BCE) so downstream variant generation has real domain
202
+ language to work with. Cockburn formalization is an exercise in
203
+ TIGHTENING what's here, not adding new content — defer until needed.
204
+
205
+ ## Rules
206
+
207
+ - **InputArtifact path is the only input** — never accept raw text
208
+ as an arg. Per parent goal's amendment, raw input is upstream's
209
+ concern; this skill consumes the normalized payload.
210
+ - **Schema validates frontmatter** — body is operator narrative;
211
+ state-validate.sh hook enforces frontmatter shape at write time.
212
+ - **No fabrication** — if `extracted_text` is sparse (or stub),
213
+ produce empty inventories and note the limitation. Don't invent
214
+ entities not present in the input.
215
+ - **References are typed** — `references: [{type, id}]` per spine
216
+ contract; raw paths or freeform strings are forbidden.
217
+
218
+ ## Skipping / Aborting
219
+
220
+ - Missing InputArtifact: error with exit 1 (not found per accessor
221
+ return semantics)
222
+ - Stub-mode InputArtifact: produce minimal decomposition, surface
223
+ warning, exit 0 (downstream consumers handle empty inventories)
224
+ - Schema validation failure on write: BLOCKed by state-validate.sh;
225
+ surface BLOCK to operator
226
+ - Existing decomposition for same slug: error; operator must
227
+ delete or re-slug
228
+
229
+ ## Reserved-names check
230
+
231
+ `objectory-decompose` is NOT on `standards/reserved-skill-names.md`
232
+ list. Verified during WU-7 goal shape and at branch creation time.
233
+
234
+ ## Relationship to other skills + standards
235
+
236
+ - `standards/input-handler-interface.md` — defines what InputArtifact
237
+ this skill consumes
238
+ - `standards/state-spine/schemas/decomposition.schema.json` — validates
239
+ output frontmatter
240
+ - `.claude/skills/interpret-input/SKILL.md` — upstream producer
241
+ - `.claude/skills/use-case/SKILL.md` — Cockburn formalization (consumes
242
+ verb-goal pairs from this skill's output; separate, deferred)
243
+ - `.claude/skills/decompose/SKILL.md` — Larman/GRASP (design-time
244
+ responsibility assignment; runs after this skill in the chain)
245
+ - `.claude/skills/preview/SKILL.md` — workflow that orchestrates the
246
+ full chain
247
+ - `.claude/luminaries/jacobson.md` (if exists) — methodology source
248
+
249
+ ## Enforcement
250
+
251
+ Methodology-level. State-validate.sh hook enforces output schema.
252
+ Reserved-names check passes. No additional hook enforcement added.
253
+
254
+ ## Output discipline
255
+
256
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
@@ -0,0 +1,100 @@
1
+ ---
2
+ tier: lite
3
+ name: pick-luminaries
4
+ description: "Pick N luminaries whose lens fits an intent. Runs in-turn. Reads the catalog helper. Writes JSON output. Drives variants in /launch, /stage, and /riff-prototypes."
5
+ problem: "Picking luminaries for a goal takes reading the whole catalog. Manual matching gets biased."
6
+ value: "Picks N luminaries whose lens fits an intent. Runs in-turn. Writes JSON output."
7
+ inputs: [Intent paragraph, Optional N count]
8
+ outputs: [JSON list of picked luminaries with fit scores, Rationale per pick]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ requires:
12
+ cli: [jq]
13
+ authoring_luminaries:
14
+ primary: john-ousterhout
15
+ supporting: [alan-cooper, michael-feathers]
16
+ ---
17
+
18
+ # /pick-luminaries — Match operator intent to the luminary catalog
19
+
20
+ Runs inside the Claude Code turn. Reads the catalog helper. Picks N slugs. Writes the JSON output. No separate LLM call. No provider key required.
21
+
22
+ Replaces the earlier picker that shelled out to an API. Adopters running the optional two-repo pattern can load their own `/extract-intent` skill. That skill overrides this one. Bassclef core stays oblivious to the override.
23
+
24
+ ## When to invoke
25
+
26
+ - Inside `/launch` Phase 3.5 — variants pre-grounded in matched luminaries
27
+ - Inside `/stage` Phase 3.5 — same
28
+ - Inside `/riff-prototypes` when invoked standalone
29
+ - Standalone — operator wants a preview of the picks
30
+
31
+ ## Procedure
32
+
33
+ ### Step 1 — Source the catalog helper
34
+
35
+ ```bash
36
+ source "${BASSCLEF_DIR:-$HOME/src/sunj-labs/bassclef}/lib/luminary-pick.sh"
37
+ CATALOG=$(luminary_pick_catalog)
38
+ ```
39
+
40
+ `CATALOG` holds one line per luminary. Format is `<slug> (<domain>) — <name>`. Sorted by slug.
41
+
42
+ ### Step 2 — Pick N slugs in-turn
43
+
44
+ You (Claude, in this turn) read the intent above. You enumerate `$CATALOG`. You pick N slugs whose lens fits the intent best. Prefer diversity across design planes.
45
+
46
+ `N` is the variant count from the caller. Default is 2 for standalone. `/launch` and `/stage` pass 3.
47
+
48
+ ### Step 3 — Write the JSON output
49
+
50
+ Write to the output path (default `/tmp/luminary-pick.json`):
51
+
52
+ ```json
53
+ {
54
+ "matched_luminaries": ["slug1", "slug2", "slug3"],
55
+ "rationale": "One short sentence per pick",
56
+ "picker_version": "bassclef-harness-pick-2.0",
57
+ "provider": "claude-code-harness"
58
+ }
59
+ ```
60
+
61
+ Every slug in `matched_luminaries` must appear in `$CATALOG`. The rationale carries one sentence per pick.
62
+
63
+ ### Output
64
+
65
+ Writes JSON to the output path. Downstream caller reads the JSON. Matched slugs drive variant generation.
66
+
67
+ ## What this skill is NOT
68
+
69
+ - Not an embedding model. Claude reads the catalog inline.
70
+ - Not a vendor adapter. No provider key required.
71
+ - Not a substitute for `/extract-intent`. That layer adds richer signal when loaded.
72
+
73
+ ## Composes with
74
+
75
+ - `lib/luminary-pick.sh` — provides `luminary_pick_catalog()`
76
+ - `/launch` Phase 3.5 — primary consumer
77
+ - `/stage` Phase 3.5 — primary consumer
78
+ - `/riff-prototypes` — standalone consumer
79
+ - `/luminary recommend` — signal-scoring alternative
80
+
81
+ ## Distinct from
82
+
83
+ - `/luminary recommend` — signal scoring by keyword and design plane
84
+ - `/extract-intent` — operator-private upgrade layer
85
+
86
+ ## Sources read
87
+
88
+ - `state/luminary-implementations/*.json` — catalog manifest
89
+ - `docs/iteration-bets/2026-09-03a-web-193-picker-harness-llm.md` — Option-A parent goal
90
+ - `docs/decompositions/2026-09-03-picker-harness-llm.md` — GRASP + Interface Registry
91
+ - bassclef#944 — Voyage matcher excision
92
+ - bassclef-web#193 — audit that drove the Option-A rewrite
93
+
94
+ ## Closes
95
+
96
+ Option-A caller update per sunj-labs/bassclef-web#193.
97
+
98
+ ## Output discipline
99
+
100
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.