@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.
- package/dist/cli.cjs +23 -6
- package/dist/cli.js +23 -6
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
- package/dist/lite/.claude/bassclef-orientation.md +120 -0
- package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
- package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
- package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
- package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
- package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
- package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
- package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
- package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
- package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
- package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
- package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
- package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
- package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
- package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
- package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
- package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
- package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
- package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
- package/dist/lite/.claude/hooks/save-state.sh +268 -0
- package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
- package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
- package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
- package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
- package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
- package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
- package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
- package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
- package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
- package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
- package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
- package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
- package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
- package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
- package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
- package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
- package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
- package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
- package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
- package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
- package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
- package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
- package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
- package/dist/lite/.claude/rules/cost-governance.md +154 -0
- package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
- package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
- package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
- package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
- package/dist/lite/.claude/rules/session-artifacts.md +30 -0
- package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
- package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
- package/dist/lite/.claude/rules/usability.md +22 -0
- package/dist/lite/.claude/settings.json +20 -0
- package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
- package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
- package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
- package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
- package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
- package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
- package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
- package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
- package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
- package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
- package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
- package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
- package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
- package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
- package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
- package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
- package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
- package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
- package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
- package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
- package/dist/lite/.claude/skills/release/SKILL.md +311 -0
- package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
- package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
- package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
- package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
- package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
- package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
- package/dist/lite/.claude/skills/state/SKILL.md +204 -0
- package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
- package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
- package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
- package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
- package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
- package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
- package/dist/lite/README.md +5 -1
- package/dist/lite/gitignore +6 -0
- package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
- package/dist/lite/lib/clone-failure-classifier.sh +59 -0
- package/dist/lite/lib/fixture-builder.sh +190 -0
- package/dist/lite/lib/fresh-install-check.sh +49 -0
- package/dist/lite/lib/hook-heartbeat.sh +0 -1
- package/dist/lite/lib/mechanism-fidelity.sh +569 -0
- package/dist/lite/lib/npm-version-check.sh +112 -0
- package/dist/lite/lib/preview-state.sh +229 -0
- package/dist/lite/lib/session-rescue.sh +0 -1
- package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
- package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
- package/dist/lite/standards/architect-review-discipline.md +222 -0
- package/dist/lite/standards/bassclef-platform.md +249 -0
- package/dist/lite/standards/bassclef-test-repos.md +97 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
- package/dist/lite/standards/cold-adopter-harness.md +205 -0
- package/dist/lite/standards/data-management.md +135 -0
- package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
- package/dist/lite/standards/lite-manifest.json +1456 -14
- package/dist/lite/standards/mechanism-fidelity.md +205 -0
- package/dist/lite/standards/operator-private-discipline.md +200 -0
- package/dist/lite/standards/operator-to-public-flow.md +195 -0
- package/dist/lite/standards/prototype-gallery.md +251 -0
- package/dist/lite/standards/pseudonym-key-schema.md +109 -0
- package/dist/lite/standards/sibling-validation-checklist.md +181 -0
- package/dist/lite/standards/slack-notifications.md +161 -0
- package/dist/lite/standards/synthetic-user-testing.md +173 -0
- package/dist/lite/standards/vendor-bindings.md +165 -0
- package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
- package/dist/lite/standards/vpc-fit-validation.md +167 -0
- package/dist/lite/templates/gallery-yml.md +113 -0
- package/dist/lite/templates/product-canvas.md +169 -0
- package/dist/lite/templates/value-prop-canvas.md +180 -0
- package/package.json +3 -3
- /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.
|