@thebassclef/lite 0.1.3 → 1.0.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 +431 -135
- package/dist/cli.js +433 -137
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.bassclef-source.json +10 -0
- package/{substrate → dist/lite}/.claude/hooks/artifact-ingestion-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/assert-verify-steering.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/bassclef-source-config-validate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/bassclef-sync.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/compound-noun-scrub.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/kiss-expansion-inject.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/longrun-prep-compounding-sequence-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/plain-english-steering.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/post-skill-friction-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/post-skill-telemetry.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/pre-build-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/pre-commit-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/session-end.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/session-reflection.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/skill-body-grade-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/skill-body-intent-drift.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/state-validate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/substrate-clarity-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/temperance-gate.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/testing-tier-enforce.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/turn-prose-grade-measure.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/turn-prose-kiss-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/vocabulary-migration-check.sh +0 -0
- package/{substrate → dist/lite}/.claude/hooks/whereami-utc-gate.sh +0 -0
- package/dist/lite/.claude/settings.json +212 -0
- package/dist/lite/CLAUDE.md +41 -0
- package/dist/lite/gitignore +58 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +497 -0
- package/dist/lite/whereami.md +24 -0
- package/package.json +8 -2
- package/substrate/.bassclef/lite-manifest.json +0 -2701
- package/substrate/.claude/agents/architect.md +0 -70
- package/substrate/.claude/agents/builder.md +0 -114
- package/substrate/.claude/agents/designer.md +0 -156
- package/substrate/.claude/agents/reviewer.md +0 -88
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +0 -492
- package/substrate/.claude/hooks/skill-step-list-check.sh +0 -171
- package/substrate/.claude/luminaries/alan-cooper.md +0 -170
- package/substrate/.claude/luminaries/alistair-cockburn.md +0 -140
- package/substrate/.claude/luminaries/amazon-pr-faq.md +0 -34
- package/substrate/.claude/luminaries/ash-maurya.md +0 -121
- package/substrate/.claude/luminaries/bill-buxton.md +0 -210
- package/substrate/.claude/luminaries/charles-sanders-peirce.md +0 -150
- package/substrate/.claude/luminaries/david-ogilvy.md +0 -192
- package/substrate/.claude/luminaries/don-norman.md +0 -173
- package/substrate/.claude/luminaries/edward-tufte.md +0 -179
- package/substrate/.claude/luminaries/eric-evans.md +0 -160
- package/substrate/.claude/luminaries/frederick-brooks.md +0 -50
- package/substrate/.claude/luminaries/gang-of-four.md +0 -157
- package/substrate/.claude/luminaries/glenford-myers.md +0 -230
- package/substrate/.claude/luminaries/hunt-thomas.md +0 -115
- package/substrate/.claude/luminaries/hyrum-wright.md +0 -94
- package/substrate/.claude/luminaries/jason-fried-dhh.md +0 -46
- package/substrate/.claude/luminaries/jesse-james-garrett.md +0 -154
- package/substrate/.claude/luminaries/john-ousterhout.md +0 -94
- package/substrate/.claude/luminaries/karl-popper.md +0 -132
- package/substrate/.claude/luminaries/kent-beck.md +0 -168
- package/substrate/.claude/luminaries/linus-torvalds.md +0 -218
- package/substrate/.claude/luminaries/martin-fowler.md +0 -164
- package/substrate/.claude/luminaries/michael-feathers.md +0 -125
- package/substrate/.claude/luminaries/michael-nygard.md +0 -118
- package/substrate/.claude/luminaries/robert-c-martin.md +0 -164
- package/substrate/.claude/luminaries/saltzer-schroeder.md +0 -194
- package/substrate/.claude/luminaries/sophia-prater.md +0 -193
- package/substrate/.claude/luminaries/stephen-toulmin.md +0 -131
- package/substrate/.claude/luminaries/tony-hoare.md +0 -170
- package/substrate/.claude/luminaries/vaughn-vernon.md +0 -50
- package/substrate/.claude/luminaries/w-edwards-deming.md +0 -158
- package/substrate/.claude/rules/accessor-library-discipline.md +0 -138
- package/substrate/.claude/rules/adr-discipline.md +0 -120
- package/substrate/.claude/rules/api-conventions.md +0 -125
- package/substrate/.claude/rules/artifact-ingestion.md +0 -179
- package/substrate/.claude/rules/assert-only-after-verify.md +0 -137
- package/substrate/.claude/rules/blocked-items.md +0 -146
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +0 -141
- package/substrate/.claude/rules/branching.md +0 -28
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +0 -129
- package/substrate/.claude/rules/commit-conventions.md +0 -22
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +0 -188
- package/substrate/.claude/rules/context-engineering.md +0 -202
- package/substrate/.claude/rules/context-management.md +0 -85
- package/substrate/.claude/rules/defensive-bash.md +0 -68
- package/substrate/.claude/rules/deferred-actions.md +0 -233
- package/substrate/.claude/rules/destructive-operations.md +0 -69
- package/substrate/.claude/rules/diagnosis.md +0 -38
- package/substrate/.claude/rules/github-issue-flash-tweet.md +0 -156
- package/substrate/.claude/rules/guardrails.md +0 -73
- package/substrate/.claude/rules/hook-wire-on-author.md +0 -103
- package/substrate/.claude/rules/identifier-leak-prevention.md +0 -104
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +0 -54
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +0 -98
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +0 -89
- package/substrate/.claude/rules/loop-discipline.md +0 -81
- package/substrate/.claude/rules/manual-prod-approval.md +0 -100
- package/substrate/.claude/rules/marker-enrichment-discipline.md +0 -99
- package/substrate/.claude/rules/mobile-ephemeral-session.md +0 -109
- package/substrate/.claude/rules/new-dependency-check.md +0 -51
- package/substrate/.claude/rules/oo-ad-entry-point.md +0 -117
- package/substrate/.claude/rules/operator-facing-prose.md +0 -196
- package/substrate/.claude/rules/option-label-discipline.md +0 -108
- package/substrate/.claude/rules/pattern-annotation.md +0 -100
- package/substrate/.claude/rules/plain-english-discipline.md +0 -156
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +0 -211
- package/substrate/.claude/rules/pr-body-shape.md +0 -317
- package/substrate/.claude/rules/pr-strategy.md +0 -167
- package/substrate/.claude/rules/pr-title-shape.md +0 -161
- package/substrate/.claude/rules/prototype-workflow.md +0 -65
- package/substrate/.claude/rules/reserved-skill-names.md +0 -123
- package/substrate/.claude/rules/schema-management.md +0 -49
- package/substrate/.claude/rules/sdlc-gates.md +0 -149
- package/substrate/.claude/rules/security.md +0 -37
- package/substrate/.claude/rules/session-artifacts.md +0 -236
- package/substrate/.claude/rules/skill-composition-declarations.md +0 -124
- package/substrate/.claude/rules/skill-description-clarity.md +0 -247
- package/substrate/.claude/rules/skill-procedure-step-list.md +0 -137
- package/substrate/.claude/rules/state-schema-validation.md +0 -162
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +0 -140
- package/substrate/.claude/rules/substrate-config-schema.md +0 -98
- package/substrate/.claude/rules/test-list-discipline.md +0 -175
- package/substrate/.claude/rules/test-sufficiency.md +0 -210
- package/substrate/.claude/rules/testing-tier-config.md +0 -145
- package/substrate/.claude/rules/testing.md +0 -38
- package/substrate/.claude/rules/turn-estimate-grounding.md +0 -134
- package/substrate/.claude/rules/visual-hierarchy.md +0 -437
- package/substrate/.claude/rules/we-dont-break-adopters.md +0 -126
- package/substrate/.claude/rules/whereami-load-bearing.md +0 -202
- package/substrate/.claude/rules/writing-craft-discipline.md +0 -92
- package/substrate/.claude/rules/wu-sequencing-compounds.md +0 -145
- package/substrate/.claude/skills/build/SKILL.md +0 -640
- package/substrate/.claude/skills/chronicle/SKILL.md +0 -55
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +0 -249
- package/substrate/.claude/skills/decompose/SKILL.md +0 -280
- package/substrate/.claude/skills/diagnose/SKILL.md +0 -297
- package/substrate/.claude/skills/feynman/SKILL.md +0 -90
- package/substrate/.claude/skills/howdoi/SKILL.md +0 -105
- package/substrate/.claude/skills/ia-model/SKILL.md +0 -108
- package/substrate/.claude/skills/interaction-design/SKILL.md +0 -112
- package/substrate/.claude/skills/interpret-input/SKILL.md +0 -180
- package/substrate/.claude/skills/journal/SKILL.md +0 -209
- package/substrate/.claude/skills/kiss/SKILL.md +0 -449
- package/substrate/.claude/skills/launch/SKILL.md +0 -915
- package/substrate/.claude/skills/lean-canvas/SKILL.md +0 -332
- package/substrate/.claude/skills/longrun/SKILL.md +0 -463
- package/substrate/.claude/skills/luminary/SKILL.md +0 -481
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +0 -177
- package/substrate/.claude/skills/onboard-repo/SKILL.md +0 -1624
- package/substrate/.claude/skills/pattern-review/SKILL.md +0 -99
- package/substrate/.claude/skills/personas/SKILL.md +0 -207
- package/substrate/.claude/skills/promote/SKILL.md +0 -283
- package/substrate/.claude/skills/requirement/SKILL.md +0 -98
- package/substrate/.claude/skills/retro/SKILL.md +0 -117
- package/substrate/.claude/skills/riff/SKILL.md +0 -114
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +0 -163
- package/substrate/.claude/skills/session-end/SKILL.md +0 -309
- package/substrate/.claude/skills/session-log/SKILL.md +0 -299
- package/substrate/.claude/skills/skills/SKILL.md +0 -228
- package/substrate/.claude/skills/spec/SKILL.md +0 -105
- package/substrate/.claude/skills/sprint/SKILL.md +0 -392
- package/substrate/.claude/skills/stage/SKILL.md +0 -384
- package/substrate/.claude/skills/state-a-problem/SKILL.md +0 -185
- package/substrate/.claude/skills/temperance/SKILL.md +0 -108
- package/substrate/.claude/skills/use-case/SKILL.md +0 -417
- package/substrate/.claude/skills/user-stories/SKILL.md +0 -268
- package/substrate/.claude/skills/value-prop/SKILL.md +0 -251
- package/substrate/.claude/skills/verify/SKILL.md +0 -160
- package/substrate/.claude/skills/visual-review/SKILL.md +0 -503
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +0 -202
- package/substrate/.claude/skills/whereami/SKILL.md +0 -307
- package/substrate/AGENTS.md +0 -79
- package/substrate/CLAUDE-lite.md +0 -85
- package/substrate/CODE_OF_CONDUCT.md +0 -28
- package/substrate/CONTRIBUTING.md +0 -177
- package/substrate/README.md +0 -173
- package/substrate/SECURITY.md +0 -19
- package/substrate/architecture/decisions/ADR-029-release-pipeline.md +0 -79
- package/substrate/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +0 -139
- package/substrate/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +0 -192
- package/substrate/architecture/decisions/ADR-039-release-tagging-scheme.md +0 -145
- package/substrate/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +0 -155
- package/substrate/architecture/decisions/ADR-044-unified-skill-body-template.md +0 -162
- package/substrate/lib/clean-artifacts-sweep.sh +0 -112
- package/substrate/lib/code-comment-discipline.sh +0 -144
- package/substrate/lib/composer-preflight.sh +0 -459
- package/substrate/lib/hook-inject.sh +0 -255
- package/substrate/lib/luminary-pick.sh +0 -96
- package/substrate/lib/output-discipline.sh +0 -143
- package/substrate/lib/prose-scan-boundary.sh +0 -171
- package/substrate/lib/rewrite-check.sh +0 -214
- package/substrate/lib/state.sh +0 -1372
- package/substrate/lib/telemetry.sh +0 -205
- package/substrate/lib/tier-check.sh +0 -187
- package/substrate/lib/tier-dependency-audit.sh +0 -1088
- package/substrate/presence/install/bassclef-hook-connect.sh +0 -178
- package/substrate/presence/install/bassclef-sync.dispatcher.template.sh +0 -841
- package/substrate/presence/install/bassclef-sync.template.sh +0 -2076
- package/substrate/presence/install/schedule-auto-save.cron.sh +0 -88
- package/substrate/presence/install/schedule-auto-save.taskscheduler.md +0 -122
- package/substrate/scripts/aggregate-telemetry.sh +0 -217
- package/substrate/scripts/analyze-tier-dependencies.sh +0 -239
- package/substrate/scripts/generate-lite-manifest.sh +0 -505
- package/substrate/scripts/generate-tier-manifest.sh +0 -28
- package/substrate/scripts/intent-drift-check.sh +0 -456
- package/substrate/scripts/lite-manifest-drift-check.sh +0 -146
- package/substrate/scripts/render-lite-manifest-doc.sh +0 -150
- package/substrate/standards/adr-template.md +0 -86
- package/substrate/standards/api-conventions/nextjs.md +0 -84
- package/substrate/standards/artifact-composition.md +0 -209
- package/substrate/standards/bash-hook-safety.md +0 -246
- package/substrate/standards/bassclef-configs-schema.md +0 -232
- package/substrate/standards/bassclef-evolution.md +0 -143
- package/substrate/standards/bassclef-internal-jargon.md +0 -244
- package/substrate/standards/bassclef-managed-sentinel.md +0 -96
- package/substrate/standards/bassclef-source-config.md +0 -228
- package/substrate/standards/branch-stacking.md +0 -408
- package/substrate/standards/code-safety-principles.md +0 -176
- package/substrate/standards/composer-prerequisites.md +0 -155
- package/substrate/standards/deferred-actions-schema.md +0 -204
- package/substrate/standards/dependency-discipline/cargo.md +0 -39
- package/substrate/standards/dependency-discipline/gem.md +0 -43
- package/substrate/standards/dependency-discipline/go-mod.md +0 -41
- package/substrate/standards/dependency-discipline/npm.md +0 -42
- package/substrate/standards/dependency-discipline/pip.md +0 -42
- package/substrate/standards/deployment-topology/ec2-tailscale.md +0 -225
- package/substrate/standards/deployment-topology.md +0 -69
- package/substrate/standards/docs-sync-allowlist.md +0 -76
- package/substrate/standards/domain-and-dns.md +0 -145
- package/substrate/standards/frontend-stack.md +0 -67
- package/substrate/standards/frontmatter-schema.md +0 -154
- package/substrate/standards/graceful-exit.md +0 -227
- package/substrate/standards/hook-idempotency.md +0 -102
- package/substrate/standards/hook-injection-discipline.md +0 -202
- package/substrate/standards/hook-install-class.md +0 -215
- package/substrate/standards/input-handler-interface.md +0 -152
- package/substrate/standards/lite-manifest-schema-changes.md +0 -135
- package/substrate/standards/luminary-matching.md +0 -105
- package/substrate/standards/luminary-problem-patterns.md +0 -481
- package/substrate/standards/migration-discipline/active-record.md +0 -50
- package/substrate/standards/migration-discipline/alembic.md +0 -43
- package/substrate/standards/migration-discipline/gorm.md +0 -50
- package/substrate/standards/migration-discipline/prisma.md +0 -53
- package/substrate/standards/migration-discipline/sqlalchemy.md +0 -51
- package/substrate/standards/mobile-ephemeral-session.md +0 -167
- package/substrate/standards/model-routing-discipline.md +0 -160
- package/substrate/standards/ogilvy-writing-rules.md +0 -225
- package/substrate/standards/opener-discipline.md +0 -96
- package/substrate/standards/operator-facing-prose-discipline.md +0 -201
- package/substrate/standards/persona-schema.md +0 -229
- package/substrate/standards/pluggable-luminaries.md +0 -323
- package/substrate/standards/pr-body-discipline.md +0 -115
- package/substrate/standards/preview-state-schema.md +0 -189
- package/substrate/standards/project-directory-layout.md +0 -276
- package/substrate/standards/release-tagging.md +0 -137
- package/substrate/standards/reserved-skill-names.md +0 -120
- package/substrate/standards/scannable-multi-option-output.md +0 -261
- package/substrate/standards/sdlc-compliance.md +0 -286
- package/substrate/standards/sdlc-gates/typescript.md +0 -57
- package/substrate/standards/secrets-lifecycle.md +0 -210
- package/substrate/standards/security-scanner-adapter.md +0 -145
- package/substrate/standards/session-board.md +0 -256
- package/substrate/standards/skill-output-discipline.md +0 -90
- package/substrate/standards/state-spine-contract.md +0 -255
- package/substrate/standards/state-spine.md +0 -511
- package/substrate/standards/steering-hints/kiss-words.md +0 -11
- package/substrate/standards/substrate-config-schema.md +0 -267
- package/substrate/standards/tech-stack-config.md +0 -109
- package/substrate/standards/tier-dependency-analysis.md +0 -167
- package/substrate/standards/tier-runtime-deps/lite.md +0 -57
- package/substrate/standards/tier-tag-schema.md +0 -155
- package/substrate/standards/two-layer-config.md +0 -99
- package/substrate/standards/use-case-format.md +0 -292
- package/substrate/standards/user-story-invest.md +0 -268
- package/substrate/standards/velocity-and-appetite.md +0 -229
- package/substrate/standards/voice-input-pattern.md +0 -119
- package/substrate/standards/whereami-schema.md +0 -301
- package/substrate/standards/worktree-management.md +0 -211
- package/substrate/standards/writing-guide.md +0 -213
- package/substrate/templates/chronicle-template.md +0 -75
- package/substrate/templates/deferred-action-template.md +0 -45
- package/substrate/templates/memory-proposal-template.md +0 -77
- package/substrate/templates/persona-template.md +0 -200
- package/substrate/templates/pr-faq.md +0 -45
- package/substrate/templates/secret-rotation-template.md +0 -162
- package/substrate/templates/spec-template.md +0 -131
- package/substrate/templates/use-case-template.md +0 -194
- package/substrate/templates/user-story-template.md +0 -107
- package/substrate/templates/whereami-template.md +0 -101
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: verify
|
|
4
|
-
description: "Verify post-build before committing. Matches change type to check list. Writes a marker the pre-commit hook reads. Runs after each task."
|
|
5
|
-
problem: "Tests run but scope-drift and missed acceptance and ADR violations slip through."
|
|
6
|
-
value: "Post-build gate that matches change type to check list. Runs before commit not after."
|
|
7
|
-
inputs: [Change type or scope hint]
|
|
8
|
-
outputs: [Check results per gate, Blocking findings, Ready-to-commit signal]
|
|
9
|
-
user_invocable: true
|
|
10
|
-
disable_model_invocation: false
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Verify
|
|
14
|
-
|
|
15
|
-
## What you get
|
|
16
|
-
|
|
17
|
-
Post-build verification gate. Run `/verify` after any task before committing code. I look at the type of change. I run the matching verification. I confirm the production build passes.
|
|
18
|
-
|
|
19
|
-
When everything clears, I write a marker at `state/markers/verify/<branch>.marker`. The pre-commit-gate hook reads that marker. Without it, the hook blocks your commit. This is the check between "tests green" and "safe to ship."
|
|
20
|
-
|
|
21
|
-
## When to use it
|
|
22
|
-
|
|
23
|
-
After each task, before committing code. Not before you push. Not once per session. Each task.
|
|
24
|
-
|
|
25
|
-
If you change a pure function, run `/verify`. If you touch a route, run `/verify`. If you edit middleware, run `/verify`. The change-type table maps what you touched to what verification fires. One skipped `/verify` is how broken production builds ship — POA session 2026-04-12 lost hours to 6 CI deploys that broke because someone assumed "tests pass = safe."
|
|
26
|
-
|
|
27
|
-
Docs-only edits and config edits are the exception. State "docs/config only" in the summary and skip verification.
|
|
28
|
-
|
|
29
|
-
## FAQ
|
|
30
|
-
|
|
31
|
-
### What is the marker and why does it matter?
|
|
32
|
-
|
|
33
|
-
The pre-commit-gate hook reads `state/markers/verify/<branch>.marker`. If the marker is missing or older than 5 minutes, the hook blocks the commit. The hook emits `BLOCKED: /verify` which the blocked-items rule requires you to resolve (run `/verify`) or explicitly defer (with stated rationale — silence is not deferral).
|
|
34
|
-
|
|
35
|
-
The 5-minute window means re-running `/verify` refreshes the marker. Ephemeral sessions (mobile claude.ai/code) also write to `/tmp/claude-verify-<branch>` for desktop parity.
|
|
36
|
-
|
|
37
|
-
### Do I need to run tests AND the production build?
|
|
38
|
-
|
|
39
|
-
Both. Tests can pass while the production build fails. Vitest and Jest are permissive. The production build applies stricter rules — type narrowing catches, tree-shaking issues, bundler-specific module resolution, Next.js route-segment contract violations, strict null checks in inferred unions.
|
|
40
|
-
|
|
41
|
-
If tests pass but the build fails, `/verify` fails. Do not commit. Do not write the marker.
|
|
42
|
-
|
|
43
|
-
Evidence why this matters: POA session 2026-04-12 shipped 5 PRs (#480, #486, #488, #490, #492) with all tests passing locally. All 6 resulting CI deploys failed because the production build applied stricter rules. Prod stuck on the old image until hotfix — hours of reversed velocity.
|
|
44
|
-
|
|
45
|
-
### What about UI changes and visual review?
|
|
46
|
-
|
|
47
|
-
UI component or page changes MUST run `/visual-review`. The skill screenshots each page via Playwright MCP, evaluates against the usability standard and the complement luminaries, and outputs a report to `docs/visual-reviews/YYYY-MM-DD-<page>.md`. No report = do not commit.
|
|
48
|
-
|
|
49
|
-
Empty state is NOT verification — seed data first. If Playwright MCP is unavailable, do the manual check and note "manual — no screenshot" in the report.
|
|
50
|
-
|
|
51
|
-
### What about substrate-affecting changes?
|
|
52
|
-
|
|
53
|
-
Any staged or recently committed change matching the 12 patterns from `.claude/rules/cold-adopter-harness-discipline.md` § "When this rule fires" — hooks, skills, rules, agents, luminaries, lib, standards, schemas, sync templates, ADRs, workflows, scripts — runs `bash scripts/cold-adopter-harness-sync.sh --mode sync --target .` and reports pass/fail. Exit 0 = pass; exit 2 = at least one check failed; exit 3 = setup failure.
|
|
54
|
-
|
|
55
|
-
Override: `SKIP_COLD_ADOPTER_HARNESS=1 /verify` (logged via trace-helper). The pre-commit-gate hook and CI workflow fire the same matcher independently. Three layers together give the coverage you need.
|
|
56
|
-
|
|
57
|
-
### What if I wrote the test after the code?
|
|
58
|
-
|
|
59
|
-
State so in the summary — "test written after; check for tautology." Reviewer audits the test against Beck's four rules of simple design (all tests pass; code reveals intention; no duplication; fewest elements). A passing suite that reads as pattern-match against the code you already shipped is green but not done.
|
|
60
|
-
|
|
61
|
-
### What if the change traces to a use case?
|
|
62
|
-
|
|
63
|
-
If the change implements behavior spec'd in a fully-dressed use case at `docs/use-cases/UC-NNN-*.md`, `/verify` includes a traceability check. Every main-scenario step and every extension line maps to at least one test assertion. State the mapping in the summary: `UC-001:3a → test X, UC-001:3b → test Y`. Missing mappings are gaps; tests without use-case traceability are orphan coverage. Per @luminary alistair-cockburn (*Writing Effective Use Cases*).
|
|
64
|
-
|
|
65
|
-
**Extended per #1171 — decomposition + interaction-design + IA-model traceability.** If the change traces to a decomposition at `docs/decompositions/*.md`, `/verify` checks the responsibility assignment stays inside the deep-module boundary named in the decomposition body. If the change traces to an interaction design at `docs/interaction-designs/*.md`, `/verify` checks the state or sequence diagram scope. If the change traces to an IA model at `docs/ia-models/*.md`, `/verify` checks the entity + task-flow scope. Deviations surface to operator with accept-or-reshape choice — matching the adr-deviation-challenge.sh hook pattern (matcher extended per #1171 to fire on OOAD artifact edits). Advisory in V1 per adr-deviation-challenge calibration pattern.
|
|
66
|
-
|
|
67
|
-
## Details below the fold
|
|
68
|
-
|
|
69
|
-
### Procedure
|
|
70
|
-
|
|
71
|
-
**Step 1 — Identify change type.**
|
|
72
|
-
|
|
73
|
-
Pick the row that matches what you just changed:
|
|
74
|
-
|
|
75
|
-
| Change type | Minimum verification |
|
|
76
|
-
|---|---|
|
|
77
|
-
| Pure function (scoring, parsing) | Unit test passes for that function |
|
|
78
|
-
| Worker / agent / queue | Boot the worker + process at least one real job |
|
|
79
|
-
| API route | Hit the endpoint, verify response shape |
|
|
80
|
-
| Schema migration | Verify column exists in DB, ORM client regenerated |
|
|
81
|
-
| Refactor (same logic, new files) | Run the code path end-to-end |
|
|
82
|
-
| Middleware / auth | Verify protected routes redirect AND existing routes still work |
|
|
83
|
-
| Scraper / data source | Trigger one real scrape, verify data lands in DB |
|
|
84
|
-
| Config / env var | Verify the service picks up the new value |
|
|
85
|
-
| UI component / page | **MUST gate**: run `/visual-review` (see FAQ above) |
|
|
86
|
-
| Substrate-affecting change | **MUST gate**: cold-adopter-harness-sync (see FAQ above) |
|
|
87
|
-
| Lite SKILL body change | **MUST gate**: `bash .claude/hooks/tests/verify-lite-tier-resolution.test.sh` — every lite composes_with target resolves under the lite filter (Task 1.8) |
|
|
88
|
-
| Docs / config only | N/A — state "docs/config only" |
|
|
89
|
-
|
|
90
|
-
**Step 2 — Run verification.**
|
|
91
|
-
|
|
92
|
-
Execute the row's command. Show the command and output.
|
|
93
|
-
|
|
94
|
-
**Step 3 — Test check.**
|
|
95
|
-
|
|
96
|
-
- New pure function → unit test exists and passes. State the test file.
|
|
97
|
-
- Modified tested code → test suite passes. State the count.
|
|
98
|
-
- No testable logic → state why (docs, config, UI-only).
|
|
99
|
-
|
|
100
|
-
TDD discipline per @luminary kent-beck (*Test-Driven Development: By Example*): red / green / refactor — write the failing test first, make it pass with the minimum code, refactor with tests as safety net. Tests written after the fact confirm what exists, not what matters.
|
|
101
|
-
|
|
102
|
-
**Step 4 — Production build check (MUST gate).**
|
|
103
|
-
|
|
104
|
-
Run the project's production build command. Not just type check. Not just tests. Build commands per stack:
|
|
105
|
-
|
|
106
|
-
- Next.js: `npm run build` (or `pnpm build`, `yarn build`)
|
|
107
|
-
- Node service: `npm run build` or `tsc --noEmit` with prod tsconfig
|
|
108
|
-
- Library: `npm run build`
|
|
109
|
-
|
|
110
|
-
If tests pass but the production build fails, `/verify` FAILS. Do not proceed. Do not write the marker.
|
|
111
|
-
|
|
112
|
-
**Step 5 — Write the marker.**
|
|
113
|
-
|
|
114
|
-
When `/verify` passes end-to-end, write the marker to both locations:
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
BRANCH_SLUG=$(git branch --show-current | tr '/' '-')
|
|
118
|
-
# Desktop marker (fast; survives session; not machine-ephemeral)
|
|
119
|
-
touch "/tmp/claude-verify-${BRANCH_SLUG}"
|
|
120
|
-
# Ephemeral-safe marker (git-tracked; survives sandbox death)
|
|
121
|
-
mkdir -p state/markers/verify
|
|
122
|
-
date -u +%Y-%m-%dT%H:%M:%SZ > "state/markers/verify/${BRANCH_SLUG}.marker"
|
|
123
|
-
git add "state/markers/verify/${BRANCH_SLUG}.marker"
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
Re-running `/verify` refreshes both markers. Do NOT write the markers if any step failed. Tests passing but build failing = `/verify` FAILED = no marker.
|
|
127
|
-
|
|
128
|
-
The git-tracked marker is authoritative in ephemeral sessions. Desktop sessions use either; both are checked by pre-commit-gate with the 5-minute freshness window.
|
|
129
|
-
|
|
130
|
-
**Step 6 — Write the summary.**
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
## Post-Build Verification
|
|
134
|
-
- Change type: [from table]
|
|
135
|
-
- Verification performed: [exact commands + output summary]
|
|
136
|
-
- Tests: [file + count, or "no testable logic"]
|
|
137
|
-
- Build: [passes / fails]
|
|
138
|
-
- Result: [PASS / FAIL — if FAIL, do not commit]
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Anti-patterns
|
|
142
|
-
|
|
143
|
-
- "Unit tests pass" as sufficient for workers, routes, scrapers
|
|
144
|
-
- Batch-verifying 5+ tasks at once
|
|
145
|
-
- Skipping verification because "it's a small change"
|
|
146
|
-
- Treating compilation as verification
|
|
147
|
-
- Writing the marker when the production build failed
|
|
148
|
-
|
|
149
|
-
### Refs
|
|
150
|
-
|
|
151
|
-
- `.claude/hooks/pre-commit-gate.sh` — reads the marker; emits `BLOCKED: /verify`
|
|
152
|
-
- `.claude/rules/blocked-items.md` — the resolve-or-defer protocol the block triggers
|
|
153
|
-
- `.claude/rules/cold-adopter-harness-discipline.md` — the 12-pattern matcher for substrate changes
|
|
154
|
-
- `.claude/skills/visual-review/SKILL.md` — the UI gate this skill calls
|
|
155
|
-
- `.claude/luminaries/kent-beck.md` — TDD discipline anchor
|
|
156
|
-
- `.claude/luminaries/alistair-cockburn.md` — use-case traceability anchor
|
|
157
|
-
|
|
158
|
-
## Output discipline
|
|
159
|
-
|
|
160
|
-
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -1,503 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
tier: lite
|
|
3
|
-
name: visual-review
|
|
4
|
-
description: "Visual UX review \u2014 screenshot a rendered page and evaluate against design tokens, usability standard, and Creative Director / Designer luminaries. Requires Playwright MCP."
|
|
5
|
-
problem: "Rendered pages ship with visual regressions. Design tokens drift from usability standards."
|
|
6
|
-
value: "Visual UX review \u2014 screenshot a rendered page and evaluate against design tokens plus usability."
|
|
7
|
-
inputs: [Page URL and viewport]
|
|
8
|
-
outputs: [Screenshot at each viewport, Findings per usability rule, Token alignment report]
|
|
9
|
-
user_invocable: true
|
|
10
|
-
disable_model_invocation: false
|
|
11
|
-
composes_baseline: anthropic-frontend-design
|
|
12
|
-
requires:
|
|
13
|
-
cli: [npx]
|
|
14
|
-
mcp: [playwright]
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
# Visual Review
|
|
18
|
-
|
|
19
|
-
Screenshot a rendered page and evaluate it against the project's design
|
|
20
|
-
system, usability standard, and luminary principles. This gives the
|
|
21
|
-
Designer and Creative Director "eyes" on what was actually built.
|
|
22
|
-
|
|
23
|
-
> **Baseline composition:** Bassclef's review composes on top of Anthropic's `frontend-design` skill defaults. Adopters firing plain Claude produce output evaluated against the baseline's typography + color + motion + spatial-composition guidance; this skill extends the evaluation with luminary-specific lenses (Tufte for data density, Ive for hierarchy, Rams for restraint, Cooper + Norman for affordances) plus bassclef's design-token + usability-standard discipline.
|
|
24
|
-
|
|
25
|
-
## Prerequisites
|
|
26
|
-
|
|
27
|
-
### Infrastructure check (run before first use)
|
|
28
|
-
|
|
29
|
-
Check if Playwright MCP is available by looking for the
|
|
30
|
-
`mcp__playwright__browser_navigate` tool. If it's NOT available:
|
|
31
|
-
|
|
32
|
-
1. **Tell the user** — don't silently degrade:
|
|
33
|
-
> Visual review requires Playwright MCP but it's not available in this session.
|
|
34
|
-
> To install it, add the Playwright MCP server to your Claude Code config:
|
|
35
|
-
>
|
|
36
|
-
> ```json
|
|
37
|
-
> // In .claude/settings.json or ~/.claude/settings.json
|
|
38
|
-
> {
|
|
39
|
-
> "mcpServers": {
|
|
40
|
-
> "playwright": {
|
|
41
|
-
> "command": "npx",
|
|
42
|
-
> "args": ["@anthropic-ai/mcp-server-playwright"]
|
|
43
|
-
> }
|
|
44
|
-
> }
|
|
45
|
-
> }
|
|
46
|
-
> ```
|
|
47
|
-
>
|
|
48
|
-
> Then restart the session. Want me to add this to your settings now?
|
|
49
|
-
|
|
50
|
-
2. **If the user says yes**, use the `/update-config` skill to add the
|
|
51
|
-
Playwright MCP server configuration, then tell them to restart.
|
|
52
|
-
|
|
53
|
-
3. **If the user declines or this is an unattended session**, fall back
|
|
54
|
-
to manual verification mode: inspect code for tap targets, font sizes,
|
|
55
|
-
contrast values. Note "manual — no Playwright" in the report. This is
|
|
56
|
-
degraded mode, not a skip — a report is still required.
|
|
57
|
-
|
|
58
|
-
### Stale browser recovery
|
|
59
|
-
|
|
60
|
-
If Playwright MCP errors with "Target page, context or browser has been
|
|
61
|
-
closed" or "Browser is already in use", a stale chrome process from a
|
|
62
|
-
previous session is holding the lock. Fix:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
pkill -f "mcp-chrome" 2>/dev/null; sleep 1
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Then retry the navigation. This is common after long sessions, crashed
|
|
69
|
-
agents, or overnight runs where the browser outlived the session.
|
|
70
|
-
|
|
71
|
-
### Other prerequisites
|
|
72
|
-
|
|
73
|
-
- A page must be running (local dev server, staging URL, etc.)
|
|
74
|
-
- If the page requires auth, sign in first via Playwright before running this skill
|
|
75
|
-
|
|
76
|
-
## Procedure
|
|
77
|
-
|
|
78
|
-
### Step 1: Navigate and Screenshot (desktop + mobile)
|
|
79
|
-
|
|
80
|
-
Screenshot at **both** viewports. A desktop-only review misses broken
|
|
81
|
-
mobile layouts (sidebar eating half the screen, tables overflowing,
|
|
82
|
-
tap targets too close together).
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
Desktop (1280px):
|
|
86
|
-
1. Resize to 1280x800 via mcp__playwright__browser_resize
|
|
87
|
-
2. Navigate to the target URL via mcp__playwright__browser_navigate
|
|
88
|
-
3. Wait for the page to load
|
|
89
|
-
4. Take a full-page screenshot via mcp__playwright__browser_take_screenshot
|
|
90
|
-
5. Capture the accessibility snapshot via mcp__playwright__browser_snapshot
|
|
91
|
-
|
|
92
|
-
Mobile (375px):
|
|
93
|
-
6. Resize to 375x812 via mcp__playwright__browser_resize
|
|
94
|
-
7. Take a full-page screenshot
|
|
95
|
-
8. Capture the accessibility snapshot
|
|
96
|
-
9. Check: does the sidebar collapse? Do tables reflow? Are tap targets ≥44px?
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
If the mobile viewport shows a broken layout (sidebar visible at full width,
|
|
100
|
-
content pushed off-screen, horizontal scroll required), flag it as a
|
|
101
|
-
**FAIL** — not a minor issue. Mobile is not optional.
|
|
102
|
-
|
|
103
|
-
If the user didn't provide a URL, ask for one. Do not guess.
|
|
104
|
-
|
|
105
|
-
### Step 2: Structural Analysis (from accessibility snapshot)
|
|
106
|
-
|
|
107
|
-
Using the accessibility snapshot, evaluate:
|
|
108
|
-
|
|
109
|
-
- **Heading hierarchy**: Are headings properly nested (h1 > h2 > h3)?
|
|
110
|
-
- **Landmark regions**: Are banner, main, nav, contentinfo present?
|
|
111
|
-
- **Interactive elements**: Do all buttons/links have accessible labels?
|
|
112
|
-
- **Form structure**: Are form fields labeled? Are required fields marked?
|
|
113
|
-
|
|
114
|
-
### Step 3: Usability Standard Check (from screenshot + snapshot)
|
|
115
|
-
|
|
116
|
-
Evaluate against the 8-point usability standard (`.claude/rules/usability.md`):
|
|
117
|
-
|
|
118
|
-
| Check | Method | Pass/Fail |
|
|
119
|
-
|---|---|---|
|
|
120
|
-
| 1. Role check | Is operator jargon visible? Database enums exposed? | |
|
|
121
|
-
| 2. Scanning distance | Label-to-value gaps > 150px? | |
|
|
122
|
-
| 3. Typography hierarchy | Key numbers 14px+ bold? Labels smaller + muted? Text < 11px? | |
|
|
123
|
-
| 4. Jargon & copy | Raw enum values? Non-externalized labels? | |
|
|
124
|
-
| 5. Attribution | Actions attributed to people, not just counts? | |
|
|
125
|
-
| 6. Accessibility | Tap targets 44px+? Contrast 4.5:1+? Translucent text BGs? | |
|
|
126
|
-
| 7. Consistency | Same badge/status treatment everywhere? | |
|
|
127
|
-
| 8. Visual verification | Does what you SEE match what the code says? | |
|
|
128
|
-
|
|
129
|
-
For checks that need measurement, use `mcp__playwright__browser_evaluate` to
|
|
130
|
-
inspect computed styles:
|
|
131
|
-
|
|
132
|
-
```js
|
|
133
|
-
// Example: check tap target sizes
|
|
134
|
-
document.querySelectorAll('button, a, [role="button"]').forEach(el => {
|
|
135
|
-
const rect = el.getBoundingClientRect();
|
|
136
|
-
if (rect.width < 44 || rect.height < 44) {
|
|
137
|
-
console.log(`Small target: ${el.textContent?.trim()} (${rect.width}x${rect.height})`);
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
```js
|
|
143
|
-
// Example: check text sizes
|
|
144
|
-
document.querySelectorAll('*').forEach(el => {
|
|
145
|
-
const size = parseFloat(getComputedStyle(el).fontSize);
|
|
146
|
-
if (el.textContent?.trim() && size < 11) {
|
|
147
|
-
console.log(`Small text: "${el.textContent.trim().slice(0,30)}" at ${size}px`);
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Step 4: Designer Evaluation (luminary lens)
|
|
153
|
-
|
|
154
|
-
Evaluate what you SEE through these lenses:
|
|
155
|
-
|
|
156
|
-
**Norman (usability)**:
|
|
157
|
-
- Is the right action obvious? Can you tell what to do without thinking?
|
|
158
|
-
- Are affordances clear? Do clickable things look clickable?
|
|
159
|
-
- Is error prevention in place? Can the user make mistakes easily?
|
|
160
|
-
|
|
161
|
-
**Cooper (goal-directed)**:
|
|
162
|
-
- Does the page serve the user's primary goal directly?
|
|
163
|
-
- Is there unnecessary friction between the user and their goal?
|
|
164
|
-
|
|
165
|
-
**Krug (don't make me think)**:
|
|
166
|
-
- Can you navigate without reading instructions?
|
|
167
|
-
- Are choices obvious and unambiguous?
|
|
168
|
-
|
|
169
|
-
### Step 5: Creative Director Evaluation (luminary lens)
|
|
170
|
-
|
|
171
|
-
Evaluate the visual design through these lenses:
|
|
172
|
-
|
|
173
|
-
**Lupton (typography)**:
|
|
174
|
-
- Is there a clear typographic hierarchy (headline > subhead > body > caption)?
|
|
175
|
-
- Is type used to tell a visual story, or is it all the same weight/size?
|
|
176
|
-
- Do font choices support the brand's personality?
|
|
177
|
-
|
|
178
|
-
**Albers (color)**:
|
|
179
|
-
- Are colors working in context (not just in isolation)?
|
|
180
|
-
- Is there a clear color hierarchy (primary action, secondary, muted)?
|
|
181
|
-
- Are color relationships intentional or accidental?
|
|
182
|
-
|
|
183
|
-
**Rams (good design)**:
|
|
184
|
-
- Is the design honest? Does it promise only what it delivers?
|
|
185
|
-
- Is it as little design as possible — less but better?
|
|
186
|
-
- Could anything be removed without losing function?
|
|
187
|
-
|
|
188
|
-
**Ive (craft)**:
|
|
189
|
-
- Is there obsessive attention to detail (radii, shadows, weight, spacing)?
|
|
190
|
-
- Does the digital surface feel considered, or thrown together?
|
|
191
|
-
- Is there material honesty — do elements feel like what they are?
|
|
192
|
-
|
|
193
|
-
**Kuznetsov (motion)** — if transitions/animations are present:
|
|
194
|
-
- Do animations guide attention or just decorate?
|
|
195
|
-
- Do state transitions convey meaning (loading, success, error)?
|
|
196
|
-
- Is motion hierarchy clear (primary action animates, background stays still)?
|
|
197
|
-
|
|
198
|
-
**Apple HIG (restraint)**:
|
|
199
|
-
- Is there progressive disclosure, or is everything shown at once?
|
|
200
|
-
- Is there visual clutter that could be removed?
|
|
201
|
-
- Does the design show restraint and clarity?
|
|
202
|
-
|
|
203
|
-
**Tufte (data display)** — if data is present:
|
|
204
|
-
- Is the data-ink ratio high (minimal chartjunk)?
|
|
205
|
-
- Are numbers formatted for scanning (aligned, consistent decimals)?
|
|
206
|
-
- Is the most important data the most visually prominent?
|
|
207
|
-
|
|
208
|
-
### Step 5.5: Prototype Drift Check (production UI only)
|
|
209
|
-
|
|
210
|
-
When reviewing a production UI surface (not a prototype itself), diff
|
|
211
|
-
the rendered production against the approved prototype referenced by
|
|
212
|
-
the iteration goal or canvas. See
|
|
213
|
-
`.claude/rules/prototype-production-coupling.md` §4.
|
|
214
|
-
|
|
215
|
-
1. Locate the approved prototype for this surface — check the active
|
|
216
|
-
iteration goal's References block, or canvas under `docs/canvases/`,
|
|
217
|
-
for a `docs/prototypes/` path.
|
|
218
|
-
2. If no prototype exists and the surface is user-visible: flag as a
|
|
219
|
-
finding ("prototype-production coupling rule §2 violation — no
|
|
220
|
-
prototype on file for this surface").
|
|
221
|
-
3. If a prototype exists, render both and compare structurally:
|
|
222
|
-
- Layout: same regions, same hierarchy
|
|
223
|
-
- Affordances: same interaction targets, same visual weights
|
|
224
|
-
- Token fidelity: same color/spacing/type vocabulary
|
|
225
|
-
4. Acceptable variances (call out with rationale):
|
|
226
|
-
- Responsive adaptation for viewport
|
|
227
|
-
- Real-data density shifts (more rows, truncation)
|
|
228
|
-
- Performance-driven simplifications (removed animations)
|
|
229
|
-
5. Unacceptable (block merge as finding):
|
|
230
|
-
- Layout restructure
|
|
231
|
-
- Affordance changes (button → link, etc.)
|
|
232
|
-
- Hierarchy inversions
|
|
233
|
-
- Token substitutions not documented in an ADR
|
|
234
|
-
|
|
235
|
-
Output: "Prototype drift: [none | minor (listed) | blocking (listed)]"
|
|
236
|
-
|
|
237
|
-
### Step 6: Output Findings
|
|
238
|
-
|
|
239
|
-
Write a structured report:
|
|
240
|
-
|
|
241
|
-
```markdown
|
|
242
|
-
## Visual Review: [page name / URL]
|
|
243
|
-
|
|
244
|
-
**Screenshot**: [reference to saved file]
|
|
245
|
-
**Date**: [today]
|
|
246
|
-
**Reviewer**: Designer + Creative Director (automated)
|
|
247
|
-
|
|
248
|
-
### Structural (accessibility snapshot)
|
|
249
|
-
- [findings]
|
|
250
|
-
|
|
251
|
-
### Usability Standard (8-point check)
|
|
252
|
-
| Check | Result | Notes |
|
|
253
|
-
|---|---|---|
|
|
254
|
-
| 1. Role check | PASS/FAIL | |
|
|
255
|
-
| ... | | |
|
|
256
|
-
|
|
257
|
-
### Designer Findings
|
|
258
|
-
- **Norman**: [findings]
|
|
259
|
-
- **Cooper**: [findings]
|
|
260
|
-
- **Krug**: [findings]
|
|
261
|
-
|
|
262
|
-
### Creative Director Findings
|
|
263
|
-
- **Lupton**: [findings]
|
|
264
|
-
- **Albers**: [findings]
|
|
265
|
-
- **Apple HIG**: [findings]
|
|
266
|
-
- **Tufte**: [findings, if applicable]
|
|
267
|
-
|
|
268
|
-
### Summary
|
|
269
|
-
- **Critical** (must fix before merge): [list]
|
|
270
|
-
- **Important** (should fix this iteration): [list]
|
|
271
|
-
- **Minor** (log for future): [list]
|
|
272
|
-
- **Positive** (what's working well): [list]
|
|
273
|
-
|
|
274
|
-
### Verdict: PASS / PASS WITH NOTES / FAIL
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## Luminary Separation — Creator vs. Evaluator
|
|
278
|
-
|
|
279
|
-
When an iteration goal names a primary luminary, that luminary guided
|
|
280
|
-
construction. Visual review must use **complementary luminaries** as
|
|
281
|
-
evaluators — never grade your own homework.
|
|
282
|
-
|
|
283
|
-
### Complement pairs
|
|
284
|
-
|
|
285
|
-
| Primary (guided construction) | Evaluator (validates in visual review) | Tension |
|
|
286
|
-
|---|---|---|
|
|
287
|
-
| Norman (affordance) | Krug (simplicity) + Apple HIG (restraint) | "Is it obvious?" vs. "Is it too much?" |
|
|
288
|
-
| Cooper (goals) | Norman (affordance) + Weinschenk (cognition) | "Right goal?" vs. "Right controls?" |
|
|
289
|
-
| Krug (simplicity) | Cooper (goals) + Norman (affordance) | "Simple enough?" vs. "Complete enough?" |
|
|
290
|
-
| Lupton (typography) | Tufte (data clarity) + Rams (honesty) | "Does it narrate?" vs. "Is it true?" |
|
|
291
|
-
| Albers (color) | Heller (appropriateness) + Ive (craft) | "Does it work?" vs. "Does it feel right?" |
|
|
292
|
-
| Tufte (data) | Lupton (hierarchy) + Rams (less but better) | "Shows the data?" vs. "Tells the story?" |
|
|
293
|
-
| Prater (entity-derived) | Norman (affordance) + Morville (findability) | "Matches the model?" vs. "Users find it?" |
|
|
294
|
-
| Morville (findability) | Prater (entity-derived) + Krug (simplicity) | "Can they find it?" vs. "Do they understand it?" |
|
|
295
|
-
| Apple HIG (restraint) | Lupton (expression) + Walter (delight) | "Restrained enough?" vs. "Too sterile?" |
|
|
296
|
-
| Rams (honesty) | Ive (craft) + Apple HIG (restraint) | "Honest?" vs. "Refined?" |
|
|
297
|
-
| Material (systematic) | Apple HIG (restraint) + Tufte (data clarity) | "Systematic?" vs. "Necessary?" |
|
|
298
|
-
| Tidwell (patterns) | Norman (affordance) + Cooper (goals) | "Proven pattern?" vs. "Right pattern for this goal?" |
|
|
299
|
-
|
|
300
|
-
### How to apply
|
|
301
|
-
|
|
302
|
-
1. Read the iteration goal's `primary_luminary:` field
|
|
303
|
-
2. Look up the complement pair above
|
|
304
|
-
3. In Step 4 (Designer Evaluation), weight the evaluator luminaries
|
|
305
|
-
4. In Step 5 (Creative Director Evaluation), use the CD complement
|
|
306
|
-
5. If no primary luminary is set, use all luminaries equally (default)
|
|
307
|
-
|
|
308
|
-
The complement creates productive tension: the evaluator asks the questions
|
|
309
|
-
the primary luminary wouldn't ask about their own approach.
|
|
310
|
-
|
|
311
|
-
## Prototype Variant Evaluation
|
|
312
|
-
|
|
313
|
-
When called during `/riff-prototypes`, visual review evaluates each
|
|
314
|
-
variant and produces a **structured comparison** to inform the operator's
|
|
315
|
-
selection. This replaces pure preference with evidence.
|
|
316
|
-
|
|
317
|
-
### Procedure for prototype evaluation
|
|
318
|
-
|
|
319
|
-
For each variant (2-3):
|
|
320
|
-
1. Run the full visual review (Steps 1-5)
|
|
321
|
-
2. Score each usability check (0-2: fail / partial / pass)
|
|
322
|
-
3. Note which luminary principles are strongest and weakest
|
|
323
|
-
4. Capture the variant's distinctive quality in one sentence
|
|
324
|
-
|
|
325
|
-
Then produce a comparison:
|
|
326
|
-
|
|
327
|
-
```markdown
|
|
328
|
-
## Prototype Comparison
|
|
329
|
-
|
|
330
|
-
| Criterion | Variant A (Norman) | Variant B (Lupton) | Variant C (Prater) |
|
|
331
|
-
|---|---|---|---|
|
|
332
|
-
| Usability score | 14/16 | 11/16 | 13/16 |
|
|
333
|
-
| Strongest principle | Affordance clarity | Visual narrative | Domain coherence |
|
|
334
|
-
| Weakest area | Visual storytelling | Tap target sizes | Discoverability |
|
|
335
|
-
| Distinctive quality | "Every action is obvious" | "The page tells a story" | "Navigation mirrors the domain" |
|
|
336
|
-
|
|
337
|
-
### Recommendation
|
|
338
|
-
Based on the iteration goal's risk and value signals:
|
|
339
|
-
- If retiring UX risk → [variant] scores highest on usability
|
|
340
|
-
- If proving lovability → [variant] has strongest emotional quality
|
|
341
|
-
- If proving viability → [variant] best serves the primary user goal
|
|
342
|
-
|
|
343
|
-
**Recommended winner**: [variant] — [one sentence why]
|
|
344
|
-
**Elements to carry from others**: [specific things worth keeping]
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
The operator makes the final call. The recommendation is evidence, not a decision.
|
|
348
|
-
|
|
349
|
-
### What happens after selection
|
|
350
|
-
|
|
351
|
-
1. Selected variant's luminary becomes `primary_luminary:` in iteration goal
|
|
352
|
-
2. Complement pair is set for all subsequent visual reviews in this iteration
|
|
353
|
-
3. `/ux-migration` runs next — gap analysis from prototype to production
|
|
354
|
-
4. Construction builds the real thing, guided by the selected luminary
|
|
355
|
-
5. Every UI commit during Construction triggers visual review with the complement evaluators
|
|
356
|
-
|
|
357
|
-
## When to run this skill (MUST gate for UI changes)
|
|
358
|
-
|
|
359
|
-
This skill is a **MUST gate** — not a suggestion — for these triggers:
|
|
360
|
-
|
|
361
|
-
| Trigger | Gate level | Who invokes |
|
|
362
|
-
|---|---|---|
|
|
363
|
-
| Builder completes a UI change | **MUST** — blocks commit | Builder via /verify |
|
|
364
|
-
| Prototype sprint variant evaluation | **MUST** — blocks selection | Designer |
|
|
365
|
-
| Transition spot-check | **SHOULD** — logged if skipped | Creative Director |
|
|
366
|
-
| Human requests it | **MUST** — explicit invocation | Anyone |
|
|
367
|
-
|
|
368
|
-
**Evidence requirement**: Visual review produces a report file at
|
|
369
|
-
`docs/visual-reviews/YYYY-MM-DD-{page-name}.md`. The pre-commit hook
|
|
370
|
-
checks for this when UI files are staged. No report = warning.
|
|
371
|
-
|
|
372
|
-
If Playwright MCP is unavailable, the agent MUST:
|
|
373
|
-
1. State that Playwright MCP is not available
|
|
374
|
-
2. Perform manual verification (tap targets, contrast, typography from code)
|
|
375
|
-
3. Note "manual — no screenshot" in the report
|
|
376
|
-
4. This is degraded mode, not a skip
|
|
377
|
-
|
|
378
|
-
## Headless / CI Mode
|
|
379
|
-
|
|
380
|
-
Visual review can run in headless environments (Docker, CI, staging) for
|
|
381
|
-
automated pipeline verification. This extends the local-only default.
|
|
382
|
-
|
|
383
|
-
### Environment detection
|
|
384
|
-
|
|
385
|
-
At skill start, detect the environment:
|
|
386
|
-
|
|
387
|
-
```bash
|
|
388
|
-
# CI environment
|
|
389
|
-
[ -n "$CI" ] || [ -n "$GITHUB_ACTIONS" ] || [ -n "$GITLAB_CI" ]
|
|
390
|
-
|
|
391
|
-
# Docker / headless
|
|
392
|
-
[ ! -d /tmp/.X11-unix ] && [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ]
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
### Headless Playwright configuration
|
|
396
|
-
|
|
397
|
-
Playwright MCP runs headless by default — no display server needed. The
|
|
398
|
-
screenshots are identical to headed mode. No special configuration required
|
|
399
|
-
for headless operation.
|
|
400
|
-
|
|
401
|
-
If running in Docker, ensure the container has:
|
|
402
|
-
```dockerfile
|
|
403
|
-
# Playwright dependencies
|
|
404
|
-
RUN npx playwright install --with-deps chromium
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
### Targeting staging URLs
|
|
408
|
-
|
|
409
|
-
Visual review can target any URL, not just localhost:
|
|
410
|
-
|
|
411
|
-
```
|
|
412
|
-
/visual-review https://staging.example.com/deals
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
When targeting staging:
|
|
416
|
-
- Auth may differ — use staging credentials or service account
|
|
417
|
-
- Data may differ — note in report: "Reviewed against staging data"
|
|
418
|
-
- Network latency affects load times — increase wait timeouts
|
|
419
|
-
- Never target production for automated reviews (read-only risk is low,
|
|
420
|
-
but the principle matters)
|
|
421
|
-
|
|
422
|
-
### CI integration (GitHub Actions)
|
|
423
|
-
|
|
424
|
-
Run visual review as a non-blocking PR check:
|
|
425
|
-
|
|
426
|
-
```yaml
|
|
427
|
-
# .github/workflows/visual-review.yml
|
|
428
|
-
name: Visual Review
|
|
429
|
-
on: [pull_request]
|
|
430
|
-
|
|
431
|
-
jobs:
|
|
432
|
-
visual-review:
|
|
433
|
-
runs-on: ubuntu-latest
|
|
434
|
-
if: contains(github.event.pull_request.labels.*.name, 'ui-change')
|
|
435
|
-
steps:
|
|
436
|
-
- uses: actions/checkout@v4
|
|
437
|
-
|
|
438
|
-
- name: Install dependencies
|
|
439
|
-
run: npm ci && npx playwright install --with-deps chromium
|
|
440
|
-
|
|
441
|
-
- name: Start dev server
|
|
442
|
-
run: npm run dev &
|
|
443
|
-
env:
|
|
444
|
-
PORT: 3000
|
|
445
|
-
|
|
446
|
-
- name: Wait for server
|
|
447
|
-
run: npx wait-on http://localhost:3000 --timeout 30000
|
|
448
|
-
|
|
449
|
-
- name: Run visual review
|
|
450
|
-
run: npx claude -p "/visual-review http://localhost:3000"
|
|
451
|
-
continue-on-error: true # non-blocking initially
|
|
452
|
-
|
|
453
|
-
- name: Upload screenshots
|
|
454
|
-
uses: actions/upload-artifact@v4
|
|
455
|
-
with:
|
|
456
|
-
name: visual-review-screenshots
|
|
457
|
-
path: docs/visual-reviews/
|
|
458
|
-
if-no-files-found: warn
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### PR artifact screenshots
|
|
462
|
-
|
|
463
|
-
Screenshots are saved as PR artifacts for human review. The report
|
|
464
|
-
references them:
|
|
465
|
-
|
|
466
|
-
```markdown
|
|
467
|
-
### Screenshots
|
|
468
|
-
- Desktop (1280px): [artifact: visual-review-screenshots/desktop.png]
|
|
469
|
-
- Mobile (375px): [artifact: visual-review-screenshots/mobile.png]
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
In CI, these are downloadable from the Actions run. In local review,
|
|
473
|
-
they're at `docs/visual-reviews/`.
|
|
474
|
-
|
|
475
|
-
### Blocking vs. non-blocking
|
|
476
|
-
|
|
477
|
-
| Phase | Gate level | Recommended |
|
|
478
|
-
|-------|-----------|------------|
|
|
479
|
-
| Initial adoption | Non-blocking (continue-on-error) | Learn what it catches without blocking PRs |
|
|
480
|
-
| After 2 weeks | Blocking for FAIL verdicts | FAIL = broken layout, not style nits |
|
|
481
|
-
| Mature | Blocking for FAIL + PASS WITH NOTES | Full gate enforcement |
|
|
482
|
-
|
|
483
|
-
Start non-blocking. Promote to blocking after the team trusts the verdicts.
|
|
484
|
-
|
|
485
|
-
### Environment requirements summary
|
|
486
|
-
|
|
487
|
-
| Environment | Display | Server | Auth | Notes |
|
|
488
|
-
|-------------|---------|--------|------|-------|
|
|
489
|
-
| Local dev | Headed or headless | localhost:3000 | Dev credentials | Default mode |
|
|
490
|
-
| Docker | Headless | localhost:PORT | Dev credentials | Install playwright deps |
|
|
491
|
-
| CI (GitHub Actions) | Headless | localhost:PORT | Dev credentials | Upload artifacts |
|
|
492
|
-
| Staging | Headless | staging URL | Staging credentials | Note in report |
|
|
493
|
-
| Production | Not recommended | — | — | Use staging instead |
|
|
494
|
-
|
|
495
|
-
## What this skill does NOT do
|
|
496
|
-
|
|
497
|
-
- Interactive flow testing (clicking through multi-step flows) — see /visual-qa
|
|
498
|
-
- Design token generation — that's the Creative Director's job
|
|
499
|
-
- Implementation fixes — flag issues, don't fix them
|
|
500
|
-
|
|
501
|
-
## Output discipline
|
|
502
|
-
|
|
503
|
-
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|