@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.
Files changed (135) hide show
  1. package/dist/cli.cjs +258 -63
  2. package/dist/cli.js +258 -63
  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 +12 -5
  135. /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
@@ -0,0 +1,161 @@
1
+ ---
2
+ tier: lite
3
+ description: - .github/workflows/bassclef-s3-publish.yml — 🤖 auto URL-rotation notifications; routes to #bassclef-activity - .github/workflows/bassclef-template-sync.yml — 🙋 human-required template-sync PRs; routes to #bassclef-human-input - substrate.config.md…
4
+ ---
5
+
6
+ ## Sources read
7
+
8
+ - `.github/workflows/bassclef-s3-publish.yml` — 🤖 auto URL-rotation notifications; routes to #bassclef-activity
9
+ - `.github/workflows/bassclef-template-sync.yml` — 🙋 human-required template-sync PRs; routes to #bassclef-human-input
10
+ - `substrate.config.md` §Slack notifications — webhook secret names (`slack_activity_webhook_name`, `slack_queue_webhook_name`)
11
+ - `standards/substrate-config-schema.md` — typed-suffix convention for `*_webhook_name` fields
12
+ - `.claude/rules/bassclef-workflow-parity.md` — sibling-grep discipline for patterns shared across both workflows
13
+
14
+ ## What I'm NOT reading (with reason)
15
+
16
+ - Individual Slack channel configuration (member list, archive settings) — operator-owned; this standard is the routing convention, not the administration
17
+ - Non-bassclef repo Slack notifications — out of scope; POA and other consumer repos may adopt the convention independently, but this standard governs bassclef's channels only
18
+
19
+ # Slack Notifications Standard
20
+
21
+ Bassclef uses **two channels** for workflow notifications — one for
22
+ 🤖 auto events, one for 🙋 human-required events. Separate channels
23
+ separate signal from noise. Operator scans the human-input channel
24
+ independently of the activity channel.
25
+
26
+ ## Channel routing
27
+
28
+ | Channel | Emoji | Events | Expected operator action |
29
+ |---------|-------|--------|-------------------------|
30
+ | `#bassclef-activity` | 🤖 | URL rotation PRs opened + auto-merged; cron-triggered publishes; successful syncs | None required — ambient awareness only. Check when debugging. |
31
+ | `#bassclef-human-input` | 🙋 | Template-sync PRs (privileged hook code changes); failed syncs; manual-review-required events | Review within 24h. Block mobile sessions until template-sync merged per `.claude/rules/bassclef-hook-drift-blocker.md`. |
32
+
33
+ Events from bassclef workflows MUST route to exactly one channel.
34
+ Ambiguous events (e.g., "automated but might need review") default to
35
+ `#bassclef-human-input` — err on the side of operator visibility.
36
+
37
+ ## Message format
38
+
39
+ Every message begins with an ISO 8601 UTC timestamp and the routing
40
+ emoji:
41
+
42
+ ```
43
+ [2026-04-22T00:12:34Z] 🤖 Bassclef URL sync PR #245 for sunj-labs/poa — auto-merge enabled
44
+ https://github.com/sunj-labs/poa/pull/245
45
+ Bassclef SHA: abc1234
46
+ ```
47
+
48
+ Fields (in order):
49
+
50
+ 1. **Timestamp** — `[YYYY-MM-DDTHH:MM:SSZ]` in UTC. Prepended literal
51
+ string (not Slack's native timestamp — the native one is
52
+ message-time, timestamp in the body is event-time). Operators scan
53
+ by timestamp to understand event sequences across windows.
54
+ 2. **Emoji** — 🤖 or 🙋 per the routing table above.
55
+ 3. **Action phrase** — verb + object ("Bassclef URL sync PR opened",
56
+ "Bassclef template sync — review required"). First line summary.
57
+ 4. **Details** — PR URL, consumer repo, bassclef SHA, template
58
+ version as applicable. Multi-line OK.
59
+
60
+ Messages MUST be built inside jq's filter (not `--arg text`) so
61
+ `\n` renders as actual newlines, not literal characters. See
62
+ `.claude/rules/bassclef-workflow-parity.md` for the historical
63
+ incident (#167, #158).
64
+
65
+ ## Webhook secrets
66
+
67
+ Configured per-repo via `substrate.config.md`:
68
+
69
+ ```
70
+ slack_activity_webhook_name: SLACK_WEBHOOK_ACTIVITY
71
+ slack_queue_webhook_name: SLACK_WEBHOOK_QUEUE
72
+ ```
73
+
74
+ The values are the **names** of GitHub secrets (not the webhook URLs).
75
+ Workflows reference them as `${{ secrets.SLACK_WEBHOOK_ACTIVITY }}` /
76
+ `${{ secrets.SLACK_WEBHOOK_QUEUE }}`.
77
+
78
+ Webhook URLs live in the repo's GitHub Actions secrets, not in
79
+ `substrate.config.md`. The raw secret is never committed.
80
+
81
+ ## Legacy compatibility (rollout window)
82
+
83
+ During the rollout of #227 (the initial split), workflows fall back to
84
+ the legacy `SLACK_WEBHOOK` secret when the new names are unset:
85
+
86
+ ```yaml
87
+ SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_ACTIVITY || secrets.SLACK_WEBHOOK }}
88
+ ```
89
+
90
+ Once both new secrets are configured in repo settings, the legacy
91
+ fallback becomes dead code. Remove the `|| secrets.SLACK_WEBHOOK`
92
+ fallback in a follow-up PR after operator confirms the new channels
93
+ are receiving messages.
94
+
95
+ Rollout steps (operator):
96
+
97
+ 1. Create Slack app / incoming webhooks for `#bassclef-activity` and
98
+ `#bassclef-human-input` in your Slack workspace
99
+ 2. Add secrets to bassclef repo:
100
+ `SLACK_WEBHOOK_ACTIVITY` + `SLACK_WEBHOOK_QUEUE`
101
+ 3. Trigger one test event per channel (e.g., manual `workflow_dispatch`
102
+ on `bassclef-s3-publish`) — confirm message arrives with timestamp
103
+ 4. Follow-up PR removes the `|| secrets.SLACK_WEBHOOK` fallback
104
+ 5. Retire `SLACK_WEBHOOK` secret after fallback removal confirmed
105
+
106
+ ## Adding new workflow notifications
107
+
108
+ Any new bassclef workflow that sends Slack notifications MUST:
109
+
110
+ 1. Pick the correct channel per the routing table
111
+ 2. Use the correct webhook secret (`SLACK_WEBHOOK_ACTIVITY` or
112
+ `SLACK_WEBHOOK_QUEUE`)
113
+ 3. Follow the message format (timestamp + emoji + action phrase + details)
114
+ 4. Build the message inside jq's filter, not `--arg text`
115
+ 5. Document the event in this standard's routing table
116
+
117
+ Workflow-parity discipline per `.claude/rules/bassclef-workflow-parity.md`:
118
+ if the new workflow has patterns shared with existing workflows
119
+ (message shape, secret names, timestamp format), sibling-grep before
120
+ commit.
121
+
122
+ ## Why two channels
123
+
124
+ Operator feedback 2026-04-18: single-channel Slack mixed 🤖 auto-merges
125
+ (ambient) with 🙋 template-syncs (action-required). Operator scanned
126
+ the whole channel to find the action items. The split separates the
127
+ two concerns:
128
+
129
+ - Activity: ambient awareness, check occasionally
130
+ - Human-input: action-required, review within 24h
131
+
132
+ Timestamp addition per #227: operators reviewing the human-input channel wanted to
133
+ correlate template-sync events with iteration goal boundaries. Native
134
+ Slack timestamps work for "when did this message arrive" but not for
135
+ "when did the underlying event fire" — the latter matters for
136
+ retro/chronicle correlation.
137
+
138
+ ## Evolution
139
+
140
+ - **v1.0 (2026-04-22)** — initial two-channel split + timestamps per
141
+ bassclef #227. Legacy `SLACK_WEBHOOK` fallback retained during
142
+ rollout.
143
+
144
+ ## Open questions for future iteration
145
+
146
+ - **Thread-reply → GitHub merge action** (bassclef #169): should
147
+ replying to a human-input-channel message trigger a merge? Orthogonal
148
+ to this standard; tracked separately.
149
+ - **Per-repo channel routing**: consumer repos (POA, pruneguice, etc.)
150
+ currently receive no Slack notifications directly; they receive
151
+ bassclef-authored PRs in their repos. If consumer repos adopt a
152
+ similar split, they'll need their own secrets + channels. Defer
153
+ until first consumer requests it.
154
+ - **Retention / archiving**: neither channel has explicit retention
155
+ policy today. If message volume grows, consider time-based channel
156
+ archives. Defer until measured volume warrants.
157
+
158
+ ## Closes
159
+
160
+ - bassclef #227
161
+ - WS-3 of iteration goal 2026-04-21b
@@ -0,0 +1,173 @@
1
+ ---
2
+ tier: lite
3
+ description: Three-tier testing framework that uses personas to validate UX beyond what unit tests can catch.
4
+ ---
5
+
6
+ # Synthetic User Testing Standard
7
+
8
+ Three-tier testing framework that uses personas to validate UX beyond
9
+ what unit tests can catch. Unit tests cover logic. Synthetic users test
10
+ what a person sees, does, and fails to accomplish.
11
+
12
+ **Origin:** POA PPP-Scale IA migration — 932 unit tests passed while
13
+ track filter, search, and sortable contacts silently dropped. Unit tests
14
+ verified scoring math; nobody verified users could still filter by 1031.
15
+
16
+ ---
17
+
18
+ ## The Three Tiers
19
+
20
+ | Tier | What it catches | When to run | Requires |
21
+ |------|----------------|-------------|----------|
22
+ | 1 — Smoke | Blank pages, missing components, auth failures, console errors | Every PR (CI) | Playwright or browser |
23
+ | 2 — Feature parity | Capabilities that silently drop during rewrites | After any migration or redesign | Capabilities inventory |
24
+ | 3 — User journeys | Flows that break, friction that compounds, features nobody asked for | Before release, monthly, or after major UX changes | Personas + task scenarios |
25
+
26
+ Each tier builds on the previous. Tier 1 is table stakes. Tier 3 is
27
+ where synthetic users earn their keep by proposing features.
28
+
29
+ ---
30
+
31
+ ## Tier 1: Smoke Tests
32
+
33
+ One test per route. The cheapest test that catches the worst failures.
34
+
35
+ **For each page**:
36
+ 1. Navigate to the route
37
+ 2. Verify it loads without error
38
+ 3. Verify key elements are present (nav, primary content, expected headings)
39
+ 4. Check console for error-level messages
40
+ 5. Screenshot for the record
41
+
42
+ **Pass criteria**: Page loads, key elements render, no console errors.
43
+
44
+ **CI integration**: Run on every PR that touches `app/`, `components/`,
45
+ or `pages/` directories. Block merge on failure.
46
+
47
+ **Coverage target**: 100% of routes. No page should exist without a
48
+ smoke test. When you add a route, add a smoke test.
49
+
50
+ ---
51
+
52
+ ## Tier 2: Feature Parity Tests
53
+
54
+ Test that capabilities survive rewrites. This is the tier that would
55
+ have caught the POA migration failures.
56
+
57
+ ### Capabilities inventory
58
+
59
+ Before testing, build the inventory. For each surface, list what it DOES:
60
+
61
+ | # | Surface | Capability | How to verify |
62
+ |---|---------|-----------|---------------|
63
+ | 1 | Pipeline | Text search filters results | Type in search, verify rows narrow |
64
+ | 2 | Pipeline | Column headers sort | Click header, verify order changes |
65
+ | 3 | Pipeline | Track filter (1031/Operating) | Click filter, verify results narrow |
66
+ | 4 | Deal detail | Financial data renders | Inspect financial section, verify numbers |
67
+ | 5 | Shortlist | Search filters contacts | Type in search, verify contacts narrow |
68
+
69
+ ### When to build the inventory
70
+
71
+ - **Before any migration**: Inventory the OLD surface's capabilities.
72
+ The `/ux-migration` skill includes this as Step 1b.
73
+ - **After the first build**: Test the NEW surface against the inventory.
74
+ - **Ongoing**: Update the inventory when capabilities are added or intentionally removed.
75
+
76
+ ### Pass criteria
77
+
78
+ 100% of inventoried capabilities must be present and functional. There
79
+ is no acceptable parity score below 100%. Missing capabilities are either:
80
+ - **Bugs** — file as issues, label `feature-parity`, fix before release
81
+ - **Intentional removals** — must be documented in the migration spec with rationale
82
+
83
+ ---
84
+
85
+ ## Tier 3: User Journey Tests
86
+
87
+ Multi-page flows framed as persona tasks. The only tier that generates
88
+ new backlog items.
89
+
90
+ ### Persona requirements
91
+
92
+ Each persona needs:
93
+ - Name, age, role, device, tech comfort level
94
+ - Primary goal (what they come to accomplish)
95
+ - Context (when/where/why they use the app)
96
+
97
+ Store at `docs/design/personas/` in the app repo.
98
+
99
+ ### Journey structure
100
+
101
+ A journey is a sequence of steps a persona takes to accomplish their goal:
102
+
103
+ 1. Start at their entry point (usually / or a bookmarked page)
104
+ 2. Navigate to the relevant surface
105
+ 3. Perform their task (search, filter, read, decide, act)
106
+ 4. Complete their goal or get blocked
107
+
108
+ ### Evaluation criteria
109
+
110
+ At each step, evaluate:
111
+ - **Comprehension**: Would this persona understand the labels, numbers, jargon?
112
+ - **Navigation**: Can they find the next step without instructions?
113
+ - **Completion**: Can they finish end-to-end?
114
+ - **Friction**: What slowed them down?
115
+
116
+ ### JTBD proposals
117
+
118
+ The distinctive output of Tier 3. For each friction point:
119
+
120
+ > As [Persona], it would be great if I could [capability]
121
+ > so I could [outcome].
122
+
123
+ Proposals are auto-filed as GitHub issues with `synthetic-user` label.
124
+ They enter the backlog alongside operator-filed issues, giving the PM
125
+ a persona-driven signal for prioritization.
126
+
127
+ ### Quality bar for proposals
128
+
129
+ Not every friction point deserves an issue. Proposals must be:
130
+ - **Grounded** in an observed failure or friction (not speculative)
131
+ - **Persona-specific** (framed from their perspective)
132
+ - **Actionable** (specific enough to scope and build)
133
+ - **Non-duplicate** (check existing issues before filing)
134
+
135
+ ---
136
+
137
+ ## Relationship to Other Standards and Skills
138
+
139
+ | Standard/Skill | Relationship |
140
+ |---------------|-------------|
141
+ | `/ux-migration` | Step 1b (capabilities inventory) feeds Tier 2 |
142
+ | `/jtbd-tasks` | Produces the task analysis that informs Tier 3 flows |
143
+ | `/task-scenarios` | Produces user stories that become Tier 3 test cases |
144
+ | `/visual-review` | Evaluates visual quality; synthetic users evaluate functional quality |
145
+ | `/smoke-test` | Post-deploy smoke; synthetic users are pre-release and persona-aware |
146
+ | `standards/testing.md` | Defines the three test layers (unit, integration, E2E); synthetic users are a fourth layer |
147
+
148
+ ---
149
+
150
+ ## Anti-Patterns
151
+
152
+ - **Testing without personas**: Generic "click every button" tests miss
153
+ the comprehension and navigation failures that matter. Use personas.
154
+ - **Skipping the capabilities inventory**: "I'll just test what I see"
155
+ can't catch what's missing. Inventory first, test against it.
156
+ - **Filing every friction as an issue**: Not all friction is a bug.
157
+ Some is intentional complexity. Evaluate before filing.
158
+ - **Replacing manual testing**: Synthetic users supplement human testing.
159
+ They catch structural failures; humans catch taste failures.
160
+ - **Running Tier 3 without Tier 1**: If pages don't load, journey tests
161
+ waste time debugging infrastructure instead of evaluating UX.
162
+
163
+ ---
164
+
165
+ ## Output Artifacts
166
+
167
+ | Artifact | Location | Frequency |
168
+ |----------|----------|-----------|
169
+ | Smoke results | `docs/synthetic-user-reports/YYYY-MM-DD.md` | Per run |
170
+ | Capabilities inventory | `docs/specs/capabilities-[surface].md` | Per surface, updated on change |
171
+ | Journey reports | `docs/synthetic-user-reports/YYYY-MM-DD.md` | Per run |
172
+ | JTBD proposals | GitHub issues with `synthetic-user` label | Per finding |
173
+ | Persona definitions | `docs/design/personas/[name].md` | Stable, updated on research |
@@ -0,0 +1,165 @@
1
+ ---
2
+ tier: lite
3
+ description: The index of external services bassclef depends on.
4
+ ---
5
+
6
+ # Vendor Bindings
7
+
8
+ The index of external services bassclef depends on. For each: what bassclef uses it for, where in bassclef the binding lives, and **how portable** the usage is across enterprise vendors (GitHub vs Azure DevOps vs GitLab; AWS vs GCP vs Azure).
9
+
10
+ This is the agent-native equivalent of GitHub's *Insights → Dependencies → Filter by ecosystem* — but for substrate-level service bindings, not code-package dependencies.
11
+
12
+ ## Sources read
13
+
14
+ - `standards/bassclef-platform.md` — org-level infra surface (sibling concern; this catalog is the per-vendor breakdown)
15
+ - `architecture/decisions/ADR-014-substrate-sync-strategy.md` — thin-pointer architecture (GitHub-specific implementation)
16
+ - `architecture/decisions/ADR-018-bassclef-interaction-model.md` — Harness as a runtime object (Claude Code binding)
17
+ - `standards/secrets-lifecycle.md` — secret storage adapters (1Password / GitHub Actions Secrets / AWS Secrets Manager)
18
+ - `standards/deployment-topology.md` — deploy target adapter pattern (Amplify / EC2-Tailscale / others)
19
+ - `substrate.config.md` schema — `production_hosting_platform` + `journal_doc_id` + similar adapter fields
20
+ - `docs/bassclef-overview.md` — positioning doc; mentions "enterprise CI runners" but doesn't enumerate bindings
21
+ - 2026-05-11 operator framing — surfaced during Phase IIIa Follow-on scope (b) discussion: clarity-check reusable workflow is GitHub-Actions-specific; ADO + GitLab + Bitbucket need explicit thinking
22
+
23
+ ## Portability tiers
24
+
25
+ Each binding is classified by how hard it would be to swap the vendor:
26
+
27
+ | Tier | Definition | Migration cost |
28
+ |---|---|---|
29
+ | **Agnostic** | No vendor-specific code; works on any provider in the category | None — runs everywhere |
30
+ | **Adapter** | Vendor-specific code lives behind an interface; swap = new adapter | Days — new adapter per new vendor |
31
+ | **Locked** | Code/logic only works with this vendor; swap = rewrite | Weeks-months — substantial re-architecture |
32
+ | **Structural** | The vendor IS part of bassclef's identity; not realistically swappable | Out of scope — would define a new framework |
33
+
34
+ ## Vendor binding catalog
35
+
36
+ ### GitHub (code hosting + Issues/PRs/Projects)
37
+
38
+ | Usage | Where it's bound | Tier |
39
+ |---|---|---|
40
+ | Repo hosting + remote operations | `gh` CLI throughout `.claude/skills/`, `.claude/hooks/` | **Locked** — `gh` is GitHub-specific |
41
+ | Issues + PRs as tracking surface | `gh issue create`, `gh pr create`, `gh pr merge` in skills/hooks | **Locked** — issue model differs across providers |
42
+ | Source distribution (tarball API) | `.bassclef-source.json` points at `api.github.com/repos/.../tarball/main`; `bassclef-sync.template.sh` fetches via that URL | **Adapter** — `.bassclef-source.json` has `source_url` field; could swap to ADO REST API or GitLab tarball |
43
+ | GitHub Projects (board surface) | `design/object-model.md` `Task` object; referenced in `agent-choreography.md` | **Agnostic-ish** — not currently exercised; could swap to ADO Boards or Jira |
44
+
45
+ **ADO/GitLab equivalents:**
46
+ - gh CLI → `az repos` / `glab` / `bb` CLIs (different command shapes; would need adapter)
47
+ - GitHub API tarball → ADO REST `GET /git/repositories/{id}/items?download=true&path=/&versionDescriptor.version=main` (different URL shape; same outcome)
48
+
49
+ ### GitHub Actions (CI runner + workflow orchestration)
50
+
51
+ | Usage | Where it's bound | Tier |
52
+ |---|---|---|
53
+ | Workflow runs on PR open | `.github/workflows/bassclef-pr-ci.yml` | **Locked** — YAML schema differs; ADO Pipelines + GitLab CI + Bitbucket Pipelines all incompatible |
54
+ | Reusable workflows (`uses:`) | `.github/workflows/clarity-check.reusable.yml` (bassclef#611 shipped 2026-05-11) | **Locked** — ADO has template includes; GitLab has includes/components; not source-compatible. Abstraction tracked at bassclef#629 |
55
+ | Consumer-side reusable-workflow auto-wire | `presence/install/bassclef-sync.template.sh` section 3g-workflows writes consumer's `.github/workflows/clarity-check.yml` referencing bassclef#611's reusable workflow via `@main` | **Locked** — only GitHub consumers get the auto-wire; non-GitHub consumers skipped per `IS_GITHUB_CONSUMER` check |
56
+ | Hook tests in CI | `.github/workflows/bassclef-pr-ci.yml` hook-tests job | **Locked** — YAML structure GH-specific |
57
+ | Schema validation in CI | `.github/workflows/bassclef-pr-ci.yml` ajv-schema-validate job | **Adapter possible** — the validation logic itself is `npx ajv compile`; the WRAPPER is GH-specific |
58
+ | Body-clarity advisory | `.github/workflows/clarity-check.reusable.yml` (refactored from bassclef-pr-ci.yml 2026-05-11) | **Locked at the YAML wrapper layer; logic is portable** — clarity-check shell logic could be extracted to `lib/ci/clarity-check.sh` with thin per-vendor wrappers; tracked at bassclef#629 |
59
+
60
+ **Enterprise migration path:** the LOGIC (hook tests, schema validation, body clarity scan + comment) can each be extracted to vendor-agnostic shell scripts; per-vendor YAML wrappers (GH Actions / ADO Pipelines / GitLab CI / Bitbucket Pipes) call the shared scripts. Today bassclef hasn't done this extraction — the body-clarity logic is inline in the workflow YAML.
61
+
62
+ ### Anthropic — Claude API + Claude Code harness + community skills
63
+
64
+ | Usage | Where it's bound | Tier |
65
+ |---|---|---|
66
+ | LLM calls (Haiku / Sonnet / Opus / Opus 4.6) | Every skill that calls Claude; agent definitions; `substrate.config.md` model routing | **Structural** — bassclef IS a Claude Code framework |
67
+ | Claude Code as runtime harness | All hooks (PreToolUse, PostToolUse, SessionStart, Stop); `.claude/settings.json` schema | **Structural** — `Harness` is a named runtime object in ADR-018 |
68
+ | Community skills (frontend-design, etc.) | `standards/vendor-plugins/frontend-design.md` | **Adapter** — community skills are adoption choices, not bindings |
69
+ | Skill SDK / agent SDK conventions | `.claude/skills/*/SKILL.md` schema | **Structural** — would need to rewrite for OpenAI Assistants API or similar |
70
+
71
+ **Structural binding rationale:** bassclef's value proposition is *agent-native SDLC for Claude Code consumers*. The Anthropic binding is the identity, not an implementation detail. Migration to another agent runtime would define a new framework.
72
+
73
+ ### AWS — account-level infra (parent of Amplify)
74
+
75
+ | Usage | Where it's bound | Tier |
76
+ |---|---|---|
77
+ | AWS account + region | `bassclef-platform.yml` `aws.*` fields | **Adapter** — bassclef-platform.yml is multi-cloud-capable in schema; today only AWS shape implemented |
78
+ | IAM roles for deploys | `/provision-deploy-host` skill | **Adapter** — provisioner has per-cloud adapter dispatch |
79
+
80
+ **Migration path:** add GCP/Azure adapters to `/provision-deploy-host`; extend `bassclef-platform.yml` schema with `gcp.*` / `azure.*` sibling fields.
81
+
82
+ ### AWS Amplify (hosting adapter)
83
+
84
+ | Usage | Where it's bound | Tier |
85
+ |---|---|---|
86
+ | Prototype + app hosting | `substrate.config.md` `production_hosting_platform: amplify` | **Adapter** — adapter selected by config field; `none` / `ec2-tailscale` / `amplify` / others |
87
+ | Domain binding | `/bind-subdomain` skill; Amplify-specific API calls | **Adapter** — adapter dispatch per platform; new platform = new bind script |
88
+
89
+ ### Google Cloud — Docs / Drive APIs
90
+
91
+ | Usage | Where it's bound | Tier |
92
+ |---|---|---|
93
+ | Journal-entry corpus push | `substrate.config.md` `journal_doc_id` (field renamed to `journal_doc_id` in bassclef#1019); `scripts/push-to-gdoc.ts` | **Adapter** — doc-ID-based; swap to Notion API / Confluence API by replacing the push script |
94
+ | `gcloud auth` for service accounts | `secrets-bootstrap` skill | **Adapter** — secret-storage adapter |
95
+
96
+ ### Slack — notifications
97
+
98
+ | Usage | Where it's bound | Tier |
99
+ |---|---|---|
100
+ | Webhook posts (build / merge / deploy) | `standards/slack-notifications.md`; relevant hooks | **Adapter** — webhook-based; swap to Discord / Teams / Telegram via env-configured URL |
101
+
102
+ ### DNS providers (Cloudflare / Route53 / others)
103
+
104
+ | Usage | Where it's bound | Tier |
105
+ |---|---|---|
106
+ | Subdomain binding | `bassclef-platform.yml` `dns.*` fields; `/bind-subdomain` skill | **Adapter** — DNS provider selected per `bassclef-platform.yml` field; adapter dispatch per provider |
107
+
108
+ ### Secret storage (1Password / GitHub Actions Secrets / AWS Secrets Manager / .env)
109
+
110
+ | Usage | Where it's bound | Tier |
111
+ |---|---|---|
112
+ | Credentials at runtime | `substrate.secrets.md` `storage.type` field; `/secrets-bootstrap` skill | **Agnostic** — full adapter dispatch; type field selects implementation |
113
+
114
+ ### NPM ecosystem (dev tooling)
115
+
116
+ | Usage | Where it's bound | Tier |
117
+ |---|---|---|
118
+ | `ajv-cli` + `ajv-formats` for JSON Schema validation | `.github/workflows/bassclef-pr-ci.yml`; bassclef-pr-ci ajv-schema-validate job | **Agnostic** — Python `jsonschema` or other validators interchangeable; CI invocation swappable |
119
+ | Other dev tools (gitleaks, eslint, etc.) | Various CI jobs in app repos | **Agnostic** — pick equivalent tools per stack |
120
+
121
+ ---
122
+
123
+ ## Summary by tier
124
+
125
+ | Tier | Count | Examples |
126
+ |---|---|---|
127
+ | **Structural** | 1 | Anthropic (Claude API + Claude Code harness) |
128
+ | **Locked** | 2 | GitHub (Issues/PRs/CLI), GitHub Actions (workflow YAML) |
129
+ | **Adapter** | 7 | AWS, AWS Amplify, Google Cloud, Slack, DNS, secret storage, source distribution |
130
+ | **Agnostic** | 1 | NPM ecosystem (dev tooling) |
131
+
132
+ **11 vendor bindings total.** Only 2 are vendor-locked beyond the structural Anthropic binding. **Adapter pattern dominates** — bassclef's substrate is mostly portable across enterprise vendors; the GitHub binding is the main exception.
133
+
134
+ ## What this means for ADO / enterprise adoption
135
+
136
+ Per the operator's framing 2026-05-11:
137
+
138
+ The GitHub-locked bindings (Issues/PRs/CLI + Actions YAML) are real obstacles to bassclef running in ADO + GitLab + Bitbucket shops. Migration paths exist but require explicit per-vendor work:
139
+
140
+ 1. **gh CLI usage in skills/hooks** — every `gh issue ...` / `gh pr ...` call would need an adapter. Estimate: ~50 call sites in bassclef's substrate today (skills + hooks).
141
+ 2. **GitHub Actions workflows** — `.github/workflows/bassclef-pr-ci.yml` translates to ADO `azure-pipelines.yml`, GitLab `.gitlab-ci.yml`, Bitbucket `bitbucket-pipelines.yml`. Different YAML; same logic.
142
+ 3. **Source distribution tarball API** — swap `.bassclef-source.json` `source_url` field to point at the consumer's repo provider's tarball API.
143
+
144
+ **Recommended sequencing for ADO support (when prioritized):**
145
+
146
+ 1. Extract shared logic from GH Actions YAML into vendor-agnostic shell scripts (callable from any CI)
147
+ 2. Add ADO Pipelines YAML wrapper that calls the same scripts
148
+ 3. Add `gh-cli-adapter` abstraction (shell function wrapping `gh issue/pr/release/api`); implement `ado-cli-adapter` calling `az repos pr` etc.
149
+ 4. Track migration in a Phase IIIc-ADO bet (separate from Phase IIIb-hardening)
150
+
151
+ ## When to update this catalog
152
+
153
+ Add an entry when bassclef adds a new external service binding. Don't wait for an audit — surface the binding at the time of integration with:
154
+
155
+ - Vendor name + category (CI runner / cloud / LLM / secret store / etc.)
156
+ - Usage description (one sentence)
157
+ - Binding paths (file paths + skill/hook names)
158
+ - Portability tier classification
159
+ - Adapter migration notes if known
160
+
161
+ ## Distinct from
162
+
163
+ - **`standards/vendor-plugins/`** — *plugins bassclef adopts* (e.g., Anthropic community skills, third-party rules). Not the same as vendor bindings (bassclef's dependencies on external services).
164
+ - **`standards/bassclef-platform.md`** — *org-level infra surface* declared in `bassclef-platform.yml`. Sibling to this; that file is the operator-facing declaration; this catalog is the implementation breakdown.
165
+ - **`docs/bassclef-overview.md`** — *positioning doc*. References enterprise contexts; this catalog is the detailed mapping.
@@ -0,0 +1,66 @@
1
+ ---
2
+ tier: lite
3
+ description: Anthropic community skill — FRONTEND-DESIGN-SKILL.md
4
+ ---
5
+
6
+ # Vendor Plugin: Frontend Design Skill
7
+
8
+ ## Source
9
+ Anthropic community skill — `FRONTEND-DESIGN-SKILL.md`
10
+
11
+ ## Purpose
12
+ Design quality layer for frontend work. Ensures components are
13
+ production-grade and visually intentional, not generic "AI slop."
14
+
15
+ ## How it fits our SDLC
16
+
17
+ ```
18
+ Usability check (floor) → Design quality (ceiling)
19
+ - Correct - Distinctive
20
+ - Accessible - Intentional typography
21
+ - Consistent - Spatial composition
22
+ - No jargon - Motion & delight
23
+ ```
24
+
25
+ Usability check must pass first. Design quality applies on top.
26
+
27
+ ## Guardrails for our context
28
+
29
+ The raw skill optimizes for "unforgettable" and "bold." Our family app
30
+ optimizes for "trustworthy" and "readable." Apply with these filters:
31
+
32
+ ### DO apply to:
33
+ - Dashboard landing page (first impression, emotional job)
34
+ - Call Prep brief (the family artifact — this IS the product)
35
+ - Rubric/scoring explanation (educational, trust-building)
36
+ - Marketing surfaces (if/when we have them)
37
+
38
+ ### DO NOT apply to:
39
+ - Data tables and deal lists (predictable layout > distinctive layout)
40
+ - Ops dashboard (utilitarian, operator-only)
41
+ - Form inputs and filters (standard patterns win)
42
+
43
+ ### Adapt these principles:
44
+ | Skill says | Our context |
45
+ |-----------|-------------|
46
+ | Avoid Inter, system fonts | Keep system fonts for body text (readability). Distinctive fonts OK for headings on landing/brief surfaces. |
47
+ | Asymmetry, overlap, diagonal flow | Not for data layouts. OK for dashboard hero sections and empty states. |
48
+ | Bold maximalism OR refined minimalism | We are "refined minimalism" — Lupton, not Sagmeister. Mom is 76. |
49
+ | Unexpected, characterful choices | Channel into: card borders, score badges, chart styling, section dividers. Not into layout structure. |
50
+ | Motion and micro-interactions | Subtle: hover states, transition-colors, page load fade-in. Not: parallax, staggered reveals, scroll-triggered. |
51
+ | Gradient meshes, noise textures | Not for a data app. Clean backgrounds, solid badge colors, high contrast. |
52
+
53
+ ### Typography hierarchy (adapted)
54
+ - Display/headings: Can be distinctive (brief title, dashboard welcome)
55
+ - Body text: System fonts, 14px+, high contrast
56
+ - Data values: Monospace or tabular numerals, bold, 16px+
57
+ - Labels: Uppercase tracking, muted, 10-11px
58
+
59
+ ## When to invoke
60
+ After the usability check passes and before final review of a
61
+ family-facing surface. The designer (Claude) should ask:
62
+
63
+ 1. Is there a clear aesthetic direction for this surface?
64
+ 2. Does the typography serve the hierarchy?
65
+ 3. Is there one distinctive element someone will remember?
66
+ 4. Does it feel *designed* or *generated*?