@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,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*?
|