@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,381 @@
1
+ ---
2
+ tier: lite
3
+ name: synthetic-user
4
+ description: "Run persona-aware Playwright tests that simulate real user journeys, verify feature parity, and auto-file JTBD proposals as GitHub issues. Requires Playwright MCP and persona definitions."
5
+ problem: "Feature parity across releases needs real user journey coverage. Manual test walks take hours."
6
+ value: "Persona-aware Playwright tests that simulate real user journeys. Verify feature parity per persona."
7
+ inputs: [Persona ref, Optional flow or tier level]
8
+ outputs: [Playwright test run, Feature parity report, Screenshot diffs]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ requires:
12
+ cli: [npx, gh]
13
+ mcp: [playwright]
14
+ files: [docs/design/personas/]
15
+ ---
16
+
17
+ # Synthetic User Testing
18
+
19
+ Simulate real users interacting with the application. Synthetic users
20
+ don't just find bugs — they propose features and fixes that auto-populate
21
+ the backlog using the JTBD construct.
22
+
23
+ This skill runs at three tiers. Each tier builds on the previous one.
24
+ See `standards/synthetic-user-testing.md` for the full framework.
25
+
26
+ ## When to run
27
+
28
+ - **After any UI migration or redesign** — verify nothing was silently dropped
29
+ - **After adding a new surface** — smoke test it immediately
30
+ - **Before a release** — run Tier 2+ on all critical surfaces
31
+ - **On a schedule** — Tier 1 in CI on every PR, Tier 2 weekly, Tier 3 monthly
32
+ - **When lead volume ramps** — stress-test flows before real users hit pain points
33
+
34
+ ## When to skip
35
+
36
+ - No rendered UI exists yet (pure API work, schema changes)
37
+ - The change is documentation-only
38
+
39
+ ## Prerequisites
40
+
41
+ ### Infrastructure check
42
+
43
+ Check if Playwright MCP is available by looking for the
44
+ `mcp__playwright__browser_navigate` tool. If it's NOT available:
45
+
46
+ 1. Tell the user:
47
+ > Synthetic user testing requires Playwright MCP but it's not available.
48
+ > Add to .claude/settings.json:
49
+ > ```json
50
+ > { "mcpServers": { "playwright": {
51
+ > "command": "npx",
52
+ > "args": ["@anthropic-ai/mcp-server-playwright"]
53
+ > }}}
54
+ > ```
55
+ > Then restart the session.
56
+
57
+ 2. If Playwright is unavailable, Tier 1 can run in degraded mode
58
+ (code-level checks only). Tiers 2-3 require Playwright — do not
59
+ attempt them without it.
60
+
61
+ ### Persona definitions
62
+
63
+ Personas must exist at `docs/design/personas/` in the app repo.
64
+ Run `/jtbd-tasks` Step 0 to bootstrap them — five fields minimum
65
+ (name, age, role, device, goal, jargon comfort), extended profiling
66
+ optional.
67
+
68
+ If no persona files exist, the skill will prompt you to run
69
+ `/jtbd-tasks` Step 0 before proceeding to Tier 3. Tiers 1-2 can
70
+ run without personas.
71
+
72
+ ### Task scenarios
73
+
74
+ For Tier 3, task scenarios from `/jtbd-tasks` + `/task-scenarios` provide
75
+ the user flows to test. If these don't exist, the skill derives flows
76
+ from persona goals — but explicit scenarios produce better coverage.
77
+
78
+ ## Procedure
79
+
80
+ ### Step 0: Select Tier
81
+
82
+ Ask the operator which tier to run (or run all three sequentially):
83
+
84
+ | Tier | What it tests | Time | Requires |
85
+ |------|--------------|------|----------|
86
+ | 1 — Smoke | Pages load, key elements render, no crashes | ~5 min | Playwright |
87
+ | 2 — Feature parity | Capabilities survive across rewrites | ~15 min | Playwright + surface inventory |
88
+ | 3 — User journeys | Multi-page persona flows + JTBD proposals | ~30 min | Playwright + personas + scenarios |
89
+
90
+ ---
91
+
92
+ ### Tier 1: Smoke Tests
93
+
94
+ One test per page: loads, renders key elements, responds to basic interaction.
95
+
96
+ #### Step 1.1: Inventory pages
97
+
98
+ List every route in the application:
99
+
100
+ ```markdown
101
+ ## Page Inventory
102
+
103
+ | Route | Page name | Auth required | Key elements |
104
+ |-------|-----------|---------------|--------------|
105
+ | / | Home/Dashboard | Yes | Nav, summary cards, recent activity |
106
+ | /pipeline | Pipeline | Yes | Table, filters, sort headers, search |
107
+ | /deals/[id] | Deal detail | Yes | Deal header, scores, financials, actions |
108
+ ```
109
+
110
+ #### Step 1.2: Run smoke checks
111
+
112
+ For each page:
113
+
114
+ 1. Navigate via `mcp__playwright__browser_navigate`
115
+ 2. Wait for load via `mcp__playwright__browser_wait_for`
116
+ 3. Take screenshot via `mcp__playwright__browser_take_screenshot`
117
+ 4. Capture accessibility snapshot via `mcp__playwright__browser_snapshot`
118
+ 5. Verify key elements exist in the snapshot
119
+
120
+ ```markdown
121
+ ## Smoke Results
122
+
123
+ | Route | Loads | Key elements present | Errors in console | Screenshot | Result |
124
+ |-------|-------|---------------------|-------------------|------------|--------|
125
+ | / | Yes | Nav, cards, activity | None | [link] | PASS |
126
+ | /pipeline | Yes | Table, filters | 1 warning (React key) | [link] | PASS |
127
+ | /deals/123 | Yes | Header, scores | TypeError: undefined | [link] | FAIL |
128
+ ```
129
+
130
+ #### Step 1.3: Check console errors
131
+
132
+ Use `mcp__playwright__browser_console_messages` to capture errors.
133
+ Any `error`-level console message is a FAIL. Warnings are noted but pass.
134
+
135
+ ---
136
+
137
+ ### Tier 2: Feature Parity Tests
138
+
139
+ For each surface, test that capabilities survive any rewrite.
140
+
141
+ #### Step 2.1: Build the capabilities inventory
142
+
143
+ Before testing, inventory what each surface DOES (not just how it looks).
144
+ This is the same capabilities diff from `/ux-migration` Step 1b:
145
+
146
+ ```markdown
147
+ ## Capabilities Inventory: [Surface]
148
+
149
+ | # | Capability | How to verify | Expected behavior |
150
+ |---|-----------|---------------|-------------------|
151
+ | 1 | Text search | Type in search input, verify results filter | Table shows only matching rows |
152
+ | 2 | Column sort | Click column header, verify order changes | Rows reorder by clicked column |
153
+ | 3 | Track filter | Click "1031" filter, verify results narrow | Only 1031-exchange deals shown |
154
+ | 4 | Pagination | Click next page, verify new results load | Different rows appear |
155
+ | 5 | Deal link | Click deal row, verify navigation | Navigates to /deals/[id] |
156
+ | 6 | Financial display | Inspect financial columns | Numbers formatted with $ and commas |
157
+ ```
158
+
159
+ #### Step 2.2: Execute capability tests
160
+
161
+ For each capability:
162
+
163
+ 1. Navigate to the surface
164
+ 2. Perform the interaction via Playwright MCP tools
165
+ (`browser_click`, `browser_fill_form`, `browser_press_key`, etc.)
166
+ 3. Verify the expected behavior via snapshot or screenshot
167
+ 4. Record pass/fail
168
+
169
+ ```markdown
170
+ ## Feature Parity Results: [Surface]
171
+
172
+ | # | Capability | Status | Notes |
173
+ |---|-----------|--------|-------|
174
+ | 1 | Text search | PASS | Filters correctly |
175
+ | 2 | Column sort | FAIL | Header exists but click does nothing |
176
+ | 3 | Track filter | MISSING | Filter UI not present on new page |
177
+ | 4 | Pagination | PASS | |
178
+ | 5 | Deal link | PASS | |
179
+ | 6 | Financial display | PASS | |
180
+
181
+ **Parity score**: 4/6 (67%) — FAIL threshold is <100%
182
+ ```
183
+
184
+ #### Step 2.3: File issues for failures
185
+
186
+ For each FAIL or MISSING capability:
187
+ - File a GitHub issue with label `feature-parity`
188
+ - Reference the migration PR/issue
189
+ - Include the capability description and expected behavior
190
+
191
+ ---
192
+
193
+ ### Tier 3: User Journey Tests + Synthetic Proposals
194
+
195
+ Multi-page flows framed as persona tasks. This is where synthetic users
196
+ propose features, not just report bugs.
197
+
198
+ #### Step 3.1: Load personas and scenarios
199
+
200
+ Read persona definitions from `docs/design/personas/`.
201
+ Read task scenarios from `/task-scenarios` output. When `/task-scenarios` has not yet run for this scope, the skill BLOCKs with `INSTEAD: run /task-scenarios first; this skill consumes its output`.
202
+
203
+ Map each persona to their primary flows:
204
+
205
+ ```markdown
206
+ ## Persona → Flow Mapping
207
+
208
+ | Persona | Primary flow | Pages involved | Scenario source |
209
+ |---------|-------------|----------------|-----------------|
210
+ | Mom (76, Viewer, mobile Safari) | Find recommended deals → read scores | /, /deals/[id] | JTBD-003 |
211
+ | Operator (power user, desktop) | Pipeline → sort → detail → outreach | /pipeline, /deals/[id], /outreach | JTBD-001 |
212
+ | Family member (mobile) | Vote on deal → see consensus | /deals/[id], /votes | JTBD-005 |
213
+ ```
214
+
215
+ #### Step 3.2: Execute persona journeys
216
+
217
+ For each persona:
218
+
219
+ 1. **Set viewport** to match their device
220
+ - Mobile Safari: 375x812
221
+ - Desktop Chrome: 1280x800
222
+ - Tablet: 768x1024
223
+
224
+ 2. **Walk the flow** step by step via Playwright MCP:
225
+ - Navigate to starting page
226
+ - Perform each action in the flow
227
+ - At each step, evaluate: can the persona accomplish their goal?
228
+ - Screenshot at each decision point
229
+
230
+ 3. **Evaluate through persona lens**:
231
+ - **Comprehension**: Would this persona understand what they're seeing?
232
+ (Mom shouldn't see "BIZBUYSELL" or "CAP_RATE_PCT")
233
+ - **Navigation**: Can they find the next step without instructions?
234
+ - **Completion**: Can they finish their task end-to-end?
235
+ - **Friction**: What slowed them down or confused them?
236
+
237
+ ```markdown
238
+ ## Journey Report: [Persona Name]
239
+
240
+ **Device**: [viewport]
241
+ **Flow**: [description]
242
+ **Result**: COMPLETE / BLOCKED at step N / DEGRADED
243
+
244
+ | Step | Action | Expected | Actual | Screenshot | Status |
245
+ |------|--------|----------|--------|------------|--------|
246
+ | 1 | Navigate to / | See dashboard | Dashboard loads | [link] | PASS |
247
+ | 2 | Find recommended deals | Clear section for recommendations | No "recommended" section visible | [link] | FAIL |
248
+ | 3 | Click a deal | See deal detail | — (blocked by step 2) | — | BLOCKED |
249
+
250
+ **Friction points**:
251
+ - Step 2: No clear path from dashboard to "deals for me"
252
+ - Financial jargon visible (CAP_RATE) — Mom wouldn't understand
253
+
254
+ **Comprehension issues**:
255
+ - "Pipeline" label means nothing to a Viewer role
256
+ - Score of "73" has no context — 73 out of what?
257
+ ```
258
+
259
+ #### Step 3.3: Generate JTBD proposals
260
+
261
+ This is the distinctive step. For each friction point or gap discovered,
262
+ generate a feature proposal in JTBD format:
263
+
264
+ ```markdown
265
+ > As [Persona], it would be great if I could [capability]
266
+ > so I could [outcome].
267
+ ```
268
+
269
+ Proposals must be:
270
+ - **Grounded** — tied to a specific friction point observed in the journey
271
+ - **Persona-specific** — framed from their perspective, not the developer's
272
+ - **Actionable** — specific enough to become an issue
273
+
274
+ Examples:
275
+ > As Mom, it would be great if I could see which deals the family voted
276
+ > on so I could know what to research before Sunday dinner.
277
+ >
278
+ > As Operator, it would be great if I could filter pipeline by outreach
279
+ > status so I could focus on deals that haven't been contacted yet.
280
+ >
281
+ > As Family Member, it would be great if I could vote from the deal
282
+ > card without opening the detail page so I could review faster on mobile.
283
+
284
+ #### Step 3.4: Auto-file proposals as GitHub issues
285
+
286
+ For each JTBD proposal, create a GitHub issue:
287
+
288
+ ```bash
289
+ gh issue create \
290
+ --title "feat: [capability from proposal]" \
291
+ --label "synthetic-user,enhancement" \
292
+ --body "$(cat <<'EOF'
293
+ ## Source
294
+ Synthetic user test — [Persona Name] journey
295
+ Date: [today]
296
+
297
+ ## JTBD Proposal
298
+ > As [Persona], it would be great if I could [capability]
299
+ > so I could [outcome].
300
+
301
+ ## Context
302
+ - Observed during: [flow description]
303
+ - Friction point: [what went wrong or was missing]
304
+ - Screenshot: [link if available]
305
+
306
+ ## Acceptance Criteria
307
+ - [ ] [Persona] can [capability] from [surface]
308
+ - [ ] Verified via synthetic user re-test
309
+ EOF
310
+ )"
311
+ ```
312
+
313
+ Label all synthetic user issues with `synthetic-user` so they can be
314
+ filtered and prioritized separately from operator-filed issues.
315
+
316
+ ---
317
+
318
+ ### Step 4: Output the Report
319
+
320
+ Write the full report to `docs/synthetic-user-reports/YYYY-MM-DD.md`:
321
+
322
+ ```markdown
323
+ # Synthetic User Report — [Date]
324
+
325
+ ## Summary
326
+
327
+ | Tier | Surfaces tested | Pass | Fail | Missing |
328
+ |------|----------------|------|------|---------|
329
+ | 1 — Smoke | 8 | 7 | 1 | 0 |
330
+ | 2 — Parity | 3 surfaces, 18 capabilities | 15 | 2 | 1 |
331
+ | 3 — Journeys | 3 personas, 3 flows | 1 complete | 1 blocked | 1 degraded |
332
+
333
+ ## Issues Filed
334
+
335
+ | # | Title | Persona | Type | Priority |
336
+ |---|-------|---------|------|----------|
337
+ | 201 | feat: recommended deals section on dashboard | Mom | proposal | medium |
338
+ | 202 | fix: column sort not functional on pipeline | — | parity | high |
339
+ | 203 | fix: track filter missing from new pipeline | — | parity | critical |
340
+ | 204 | feat: vote from deal card on mobile | Family Member | proposal | low |
341
+
342
+ ## Tier 1: Smoke Results
343
+ [from Step 1.2]
344
+
345
+ ## Tier 2: Feature Parity Results
346
+ [from Step 2.2, per surface]
347
+
348
+ ## Tier 3: Journey Reports
349
+ [from Step 3.2, per persona]
350
+
351
+ ## JTBD Proposals
352
+ [from Step 3.3, all proposals listed]
353
+
354
+ ## Recommendations
355
+ - **Critical** (blocks release): [list]
356
+ - **High** (fix this iteration): [list]
357
+ - **Medium** (backlog): [list]
358
+ - **Low** (nice-to-have): [list]
359
+ ```
360
+
361
+ ## Degraded Mode (no Playwright)
362
+
363
+ If Playwright MCP is unavailable:
364
+
365
+ - **Tier 1**: Can run in code-analysis mode — check routes exist, components
366
+ render, no TypeScript errors. Note "degraded — no browser" in report.
367
+ - **Tier 2**: Can verify capabilities exist in code (grep for search inputs,
368
+ sort handlers, filter components). Cannot verify they work. Note gaps.
369
+ - **Tier 3**: Cannot run. Persona journeys require a browser.
370
+
371
+ ## What this skill does NOT do
372
+
373
+ - Write Playwright test files for CI (that's app-level test authoring)
374
+ - Fix the issues it finds (it files them)
375
+ - Replace manual user testing (it supplements it)
376
+ - Generate personas (use `/jtbd-tasks` to derive them from research)
377
+ - Run in CI automatically (see #79 for headless/CI visual review)
378
+
379
+ ## Output discipline
380
+
381
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
@@ -0,0 +1,105 @@
1
+ ---
2
+ tier: lite
3
+ name: task-scenarios
4
+ description: "Convert task analysis into user stories and scenarios with JTBD traceability. Second step in the UX translation chain."
5
+ problem: "Task analysis outputs stay abstract. Downstream user stories skip JTBD traceability."
6
+ value: "Converts task analysis into user stories or scenarios with JTBD traceability."
7
+ inputs: [Task analysis output from /jtbd-tasks]
8
+ outputs: [User stories with JTBD refs, Scenario narratives, Trace matrix]
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ ---
12
+
13
+ # Task Analysis → Scenarios + Stories
14
+
15
+ Convert HTA/CTA task flows into narrative scenarios and (currently)
16
+ user stories that trace back to JTBDs.
17
+
18
+ > **Boundary note** (added 2026-04-19 with the bassclef promotion of
19
+ > `/user-stories`): user stories and task scenarios are *distinct
20
+ > artifacts* per Nielsen Norman Group + Cockburn. The current version
21
+ > of this skill produces both — that conflation is being disentangled.
22
+ >
23
+ > **For backlog-intake stories** (formulaic As-a-I-want-So-that, INVEST-
24
+ > shaped, for sprint planning): use `/user-stories`.
25
+ >
26
+ > **For UX research narrative scenarios** ("Sam is stuck in traffic,
27
+ > running late…" with mental state, obstacles, environment — for
28
+ > usability testing and `/synthetic-user`): use this skill.
29
+ >
30
+ > A follow-up bassclef-evolution ticket tracks refocusing this skill
31
+ > on the NN/G narrative-scenario surface only (stripping the stories
32
+ > output that now belongs to `/user-stories`). Until that lands, this
33
+ > skill remains usable for both — but new work SHOULD prefer the
34
+ > dedicated skills for clarity.
35
+
36
+ ## When to Use
37
+
38
+ - After running `/jtbd-tasks` — task flows exist but not yet stories
39
+ - When writing stories and need to verify they connect to real jobs
40
+ - When reviewing a backlog and stories feel disconnected from user intent
41
+ - **The discipline**: every story must trace to a JTBD. If it can't, question whether it belongs.
42
+
43
+ ## Method
44
+
45
+ ### 1. Map Tasks to Stories
46
+
47
+ ```markdown
48
+ ### Story: [imperative title]
49
+
50
+ **As a** [persona],
51
+ **I want to** [task from HTA],
52
+ **So that** [goal from JTBD].
53
+
54
+ **Job trace**: JTBD #N → Goal M → Task M.X
55
+ **CTA decisions**: [what judgment does the user make? what cues do they need?]
56
+
57
+ **Acceptance criteria**:
58
+ - [ ] [observable behavior]
59
+ - [ ] [edge case from CTA decision points]
60
+ ```
61
+
62
+ ### 2. Scenario Writing
63
+
64
+ For judgment-heavy tasks (CTA), write scenarios that capture the decision context:
65
+
66
+ ```markdown
67
+ ### Scenario: [descriptive name]
68
+
69
+ **Given** [context — what state is the user in?],
70
+ **When** [trigger — what do they do?],
71
+ **Then** [outcome — what should happen?].
72
+
73
+ **Variant**: [what if the decision goes the other way?]
74
+ ```
75
+
76
+ ### 3. Traceability Matrix
77
+
78
+ ```markdown
79
+ | Story | JTBD | HTA Task | CTA Decision | Priority |
80
+ |-------|------|----------|-------------|----------|
81
+ | ... | ... | ... | ... | ... |
82
+ ```
83
+
84
+ **Red flag**: A story with no JTBD trace is a solution looking for a problem.
85
+ **Red flag**: A JTBD with no stories is an unserved user need.
86
+
87
+ ## Anti-Patterns
88
+
89
+ - Writing stories from features instead of jobs ("add a sidebar" — why?)
90
+ - Skipping task analysis and jumping from JTBD to stories (loses the "how")
91
+ - Stories that describe implementation, not behavior
92
+ - Acceptance criteria that test code, not user outcomes
93
+
94
+ ## Next Step
95
+
96
+ Stories feed into `/ia-model` (entity inventory + navigation structure).
97
+
98
+ ## References
99
+
100
+ - Mike Cohn, *User Stories Applied*
101
+ - Jim Kalbach, *The Jobs to Be Done Playbook*
102
+
103
+ ## Output discipline
104
+
105
+ Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: tier-dependency-audit
3
+ description: "Audit tier coverage. Sort every file into 4 buckets \u2014 tagged, missing tag, leak, missing from release. Works across lite, standard, standard-pro, ultra, upstream. Run before release to catch drift."
4
+ problem: "Tier coverage drifts across releases. Some files carry no tag; some tags mismatch the release manifest."
5
+ value: "Audits tier coverage. Sorts every file into 4 buckets \u2014 tagged or missing tag or leak or missing from release."
6
+ inputs: [Optional bucket filter]
7
+ outputs: [Bucket count per class, Findings per file, Cure suggestions]
8
+ tier: lite
9
+ user_invocable: true
10
+ disable_model_invocation: false
11
+ composes_with: []
12
+ ---
13
+
14
+ # tier-dependency-audit
15
+
16
+ ## What you get
17
+
18
+ A manifest with four buckets. Bucket 1 is tagged files that ship right. Bucket 2 is real deps that need a tag. Bucket 3 is leaks that need removal. Bucket 4 is real deps missing from the release. The file lands at `docs/dependency-audits/<date>-<tier>.md`.
19
+
20
+ ## When to use it
21
+
22
+ Run it before a release when the tier has drifted. Run it after you add a new adopter-runtime dep. Run it per tier as a periodic check. Run it when a new tier ships to build its first manifest.
23
+
24
+ ## Usage
25
+
26
+ ```bash
27
+ /tier-dependency-audit lite
28
+ ```
29
+
30
+ Or call the script:
31
+
32
+ ```bash
33
+ scripts/analyze-tier-dependencies.sh lite
34
+ ```
35
+
36
+ Both write to the same file. Re-running overwrites it.
37
+
38
+ <!-- FKGL-EXEMPT: technical arg + override enumeration -->
39
+ ## Args
40
+
41
+ | Arg | Values | Default |
42
+ |---|---|---|
43
+ | `<tier>` | one of lite / standard / standard-pro / ultra / upstream | required |
44
+
45
+ ## Overrides
46
+
47
+ For advanced use or Tier 0 tests:
48
+
49
+ - `OUTPUT_DIR` — where to write the manifest
50
+ - `INTENDED_FIXTURE` — pre-computed INTENDED set file (test only)
51
+ - `ACTUAL_FIXTURE` — pre-computed ACTUAL set file (test only)
52
+ - `TAGS_FIXTURE` — pre-computed tag file (test only)
53
+ - `RUNTIME_DEPS_FILE` — override the tier-runtime-deps file location
54
+ - `SKIP_TIER_DEPENDENCY_AUDIT=1` — bypass; exits 0
55
+ <!-- /FKGL-EXEMPT -->
56
+
57
+ ## The four buckets
58
+
59
+ **Bucket 1 — Tagged.** File has the tier tag. It ships right. Nothing to do.
60
+
61
+ **Bucket 2 — Missing tag.** File is a real dep per the graph walk. Currently ships via a bypass branch. Add the tier tag.
62
+
63
+ **Bucket 3 — Accidental leak.** File ships now but is not in the graph. Remove it from the repo. Extend `.gitignore`.
64
+
65
+ **Bucket 4 — Missing from release.** File is in the graph but not in the release list. Extend the release script or fix a filter.
66
+
67
+ ## Recommended fix order
68
+
69
+ The manifest lists a fix order. Follow it top to bottom:
70
+
71
+ 1. Fix Bucket 4 first. A release script gap may hide real ships.
72
+ 2. Fix Bucket 2 next. Add tags to real deps.
73
+ 3. Fix Bucket 3 last. Remove leaks and extend `.gitignore`.
74
+
75
+ ## Details below the fold
76
+
77
+ ### What it does under the hood
78
+
79
+ The script sources `lib/tier-dependency-audit.sh`. That lib holds eight named functions per the decomposition. One function per Larman GRASP job.
80
+
81
+ <!-- FKGL-EXEMPT: technical data-source enumeration -->
82
+ The 4 data sources:
83
+
84
+ - **Source 1** — files carrying `tier: <tier>` frontmatter or header (the root set)
85
+ - **Source 2** — files reachable from the root set via reference walk (composes_with, source lib, @luminary, etc.)
86
+ - **Source 3** — adopter-runtime deps from `standards/tier-runtime-deps/<tier>.md`
87
+ - **Source 4** — release script `--dry-run` include list
88
+ <!-- /FKGL-EXEMPT -->
89
+
90
+ Union Sources 1+2+3 to get INTENDED. Source 4 is ACTUAL. Classify each file into a bucket.
91
+
92
+ ### Reuse across tiers
93
+
94
+ One script serves all tiers. The tier arg picks the root set and adopter-runtime dep list. The walk is the same. Build the lite manifest first. Add tier-runtime dep lists for standard, standard-pro, ultra, upstream as those tiers mature.
95
+
96
+ <!-- FKGL-EXEMPT: technical exit code table -->
97
+ ### Exit codes
98
+
99
+ | Code | Meaning |
100
+ |---|---|
101
+ | 0 | Manifest written |
102
+ | 2 | Missing or invalid tier arg |
103
+ | 3 | Missing runtime-deps or intended fixture file |
104
+ | 4 | Release script dry-run failed |
105
+ | 5 | Output directory not writable |
106
+ <!-- /FKGL-EXEMPT -->
107
+
108
+ <!-- FKGL-EXEMPT: technical composes-with bullet list -->
109
+ ### Composes with
110
+
111
+ - `standards/tier-dependency-analysis.md` — walk algorithm
112
+ - `standards/tier-tag-schema.md` — per-file tier tag rules
113
+ - `standards/tier-runtime-deps/<tier>.md` — Source 3 adopter-runtime deps per tier
114
+ - `scripts/release-to-bassclef.sh` — Source 4 comes from `--dry-run`
115
+ - `lib/tier-dependency-audit.sh` — sourced lib with the 8 named functions
116
+ - `.claude/hooks/tests/lib-tier-dependency-audit.test.sh` — 32 per-function tests
117
+ - `.claude/hooks/tests/tier-dependency-audit.test.sh` — 15 end-to-end tests
118
+ - `.claude/rules/mechanism-fidelity.md` — the audit is the mechanism paired with tier-tag-schema
119
+ <!-- /FKGL-EXEMPT -->
120
+
121
+ ### Rules
122
+
123
+ Do not edit the manifest by hand. INSTEAD: re-run the audit and let it overwrite the file. Do not commit the manifest long-term. INSTEAD: treat it as regenerable and gitignore the output dir. Bucket 4 may hide a release script bug. Look at the file first before adding a tag.
124
+
125
+ <!-- FKGL-EXEMPT: refs section with technical citations -->
126
+ ### Refs
127
+
128
+ - `standards/tier-dependency-analysis.md`
129
+ - `standards/tier-tag-schema.md`
130
+ - `standards/tier-runtime-deps/lite.md`
131
+ - Goal doc `docs/iteration-bets/2026-08-17a-tier-dependency-audit-subsystem.md`
132
+ - Use case `docs/use-cases/UC-script-tier-dependency-audit.md`
133
+ - Decompositions `docs/decompositions/2026-08-17a-tier-dependency-audit-domain.md` + `.md`
134
+ - ADR-029 release pipeline
135
+ - ADR-031 we-dont-break-adopters
136
+ - @luminary john-ousterhout — deep modules (information hiding via narrow interfaces)
137
+ - @luminary michael-nygard — fail-safe default
138
+ - @luminary michael-feathers — characterization tests
139
+ <!-- /FKGL-EXEMPT -->