@thebassclef/lite 1.1.0 → 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 +258 -63
- package/dist/cli.js +258 -63
- 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 +12 -5
- /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 -->
|