quiver-cli 0.8.0 → 1.0.0
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/README.md +110 -45
- package/bin/quiver-cli.mjs +3 -1
- package/dist/cli.js +546 -458
- package/package.json +2 -2
- package/template/.agents/AGENTS.md +4 -3
- package/template/.agents/config.json +7 -0
- package/template/.agents/plugins/opencode/rtk.ts +34 -0
- package/template/.agents/skills/agent-browser/SKILL.md +1 -0
- package/template/.agents/skills/apps/skybridge/SKILL.md +4 -0
- package/template/.agents/skills/design/impeccable/SKILL.md +36 -118
- package/template/.agents/skills/design/impeccable/reference/adapt.md +1 -0
- package/template/.agents/skills/design/impeccable/reference/adapt.native.md +58 -0
- package/template/.agents/skills/design/impeccable/reference/android.md +40 -0
- package/template/.agents/skills/design/impeccable/reference/animate.md +73 -188
- package/template/.agents/skills/design/impeccable/reference/audit.md +12 -9
- package/template/.agents/skills/design/impeccable/reference/audit.native.md +139 -0
- package/template/.agents/skills/design/impeccable/reference/bolder.md +19 -101
- package/template/.agents/skills/design/impeccable/reference/clarify.md +59 -253
- package/template/.agents/skills/design/impeccable/reference/colorize.md +51 -222
- package/template/.agents/skills/design/impeccable/reference/craft-floor.md +42 -0
- package/template/.agents/skills/design/impeccable/reference/craft.md +3 -121
- package/template/.agents/skills/design/impeccable/reference/critique.md +44 -23
- package/template/.agents/skills/design/impeccable/reference/degraded/asset-producer.md +90 -0
- package/template/.agents/skills/design/impeccable/reference/degraded/documenter.md +24 -0
- package/template/.agents/skills/design/impeccable/reference/degraded/finish-reviewer.md +37 -0
- package/template/.agents/skills/design/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/template/.agents/skills/design/impeccable/reference/delight.md +47 -279
- package/template/.agents/skills/design/impeccable/reference/distill.md +2 -2
- package/template/.agents/skills/design/impeccable/reference/doctor.md +53 -0
- package/template/.agents/skills/design/impeccable/reference/document.md +60 -73
- package/template/.agents/skills/design/impeccable/reference/harden.md +1 -12
- package/template/.agents/skills/design/impeccable/reference/hooks.md +20 -5
- package/template/.agents/skills/design/impeccable/reference/init.md +72 -119
- package/template/.agents/skills/design/impeccable/reference/ios.md +45 -0
- package/template/.agents/skills/design/impeccable/reference/layout.md +54 -131
- package/template/.agents/skills/design/impeccable/reference/live-setup.md +102 -0
- package/template/.agents/skills/design/impeccable/reference/live.md +116 -511
- package/template/.agents/skills/design/impeccable/reference/new-work.md +105 -0
- package/template/.agents/skills/design/impeccable/reference/{product.md → operate.md} +6 -5
- package/template/.agents/skills/design/impeccable/reference/optimize.md +4 -4
- package/template/.agents/skills/design/impeccable/reference/overdrive.md +1 -4
- package/template/.agents/skills/design/impeccable/reference/polish.md +68 -212
- package/template/.agents/skills/design/impeccable/reference/quieter.md +3 -3
- package/template/.agents/skills/design/impeccable/reference/routing.md +18 -0
- package/template/.agents/skills/design/impeccable/reference/shape.md +38 -144
- package/template/.agents/skills/design/impeccable/reference/typeset.md +51 -250
- package/template/.agents/skills/design/impeccable/reference/visualize.md +47 -0
- package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +1 -1
- package/template/.agents/skills/design/impeccable/scripts/concept-seed.mjs +558 -0
- package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +119 -10
- package/template/.agents/skills/design/impeccable/scripts/context.mjs +534 -45
- package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +18 -47
- package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +96 -10
- package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +174 -26
- package/template/.agents/skills/design/impeccable/scripts/detector/design-system.mjs +233 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +3348 -203
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +102 -7
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +297 -97
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +187 -16
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +41 -11
- package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +7 -1
- package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +16 -2
- package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +207 -38
- package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +3082 -173
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +11 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/fonts.mjs +30 -0
- package/template/.agents/skills/design/impeccable/scripts/doctor.mjs +336 -0
- package/template/.agents/skills/design/impeccable/scripts/embed-prompt.mjs +133 -0
- package/template/.agents/skills/design/impeccable/scripts/generate-image.mjs +240 -0
- package/template/.agents/skills/design/impeccable/scripts/hook-admin.mjs +98 -18
- package/template/.agents/skills/design/impeccable/scripts/hook-before-edit.mjs +46 -6
- package/template/.agents/skills/design/impeccable/scripts/hook-lib.mjs +518 -50
- package/template/.agents/skills/design/impeccable/scripts/hook.mjs +25 -8
- package/template/.agents/skills/design/impeccable/scripts/lib/artifact-schema.mjs +93 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/composition-catalog.mjs +200 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/concept-catalog.mjs +357 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-config.mjs +27 -7
- package/template/.agents/skills/design/impeccable/scripts/lib/impeccable-paths.mjs +17 -8
- package/template/.agents/skills/design/impeccable/scripts/lib/provider.mjs +5 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/roll-selection.mjs +362 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/staleness-deep.mjs +457 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/staleness-notice.mjs +169 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/staleness.mjs +457 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/surface-briefs.mjs +151 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/target-slug.mjs +33 -0
- package/template/.agents/skills/design/impeccable/scripts/lib/template-extensions.mjs +146 -0
- package/template/.agents/skills/design/impeccable/scripts/live/accept-css.mjs +617 -0
- package/template/.agents/skills/design/impeccable/scripts/live/accept-verify.mjs +60 -0
- package/template/.agents/skills/design/impeccable/scripts/live/browser-script-parts.mjs +7 -1
- package/template/.agents/skills/design/impeccable/scripts/live/completion.mjs +10 -1
- package/template/.agents/skills/design/impeccable/scripts/live/event-validation.mjs +67 -5
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/astro.mjs +47 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/detect-utils.mjs +73 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/index.mjs +143 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/journal.mjs +197 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/nuxt.mjs +161 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/script-src.mjs +17 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
- package/template/.agents/skills/design/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
- package/template/.agents/skills/design/impeccable/scripts/live/generation-preflight.mjs +149 -0
- package/template/.agents/skills/design/impeccable/scripts/live/instructions.mjs +142 -0
- package/template/.agents/skills/design/impeccable/scripts/live/poll-lanes.mjs +14 -0
- package/template/.agents/skills/design/impeccable/scripts/live/roots.mjs +508 -0
- package/template/.agents/skills/design/impeccable/scripts/live/session-store.mjs +324 -50
- package/template/.agents/skills/design/impeccable/scripts/live/source-lock.mjs +105 -0
- package/template/.agents/skills/design/impeccable/scripts/live/source-search.mjs +105 -0
- package/template/.agents/skills/design/impeccable/scripts/live/svelte-ast.mjs +961 -0
- package/template/.agents/skills/design/impeccable/scripts/live/svelte-component.mjs +588 -72
- package/template/.agents/skills/design/impeccable/scripts/live/sveltekit-adapter.mjs +59 -17
- package/template/.agents/skills/design/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
- package/template/.agents/skills/design/impeccable/scripts/live/vocabulary.mjs +135 -0
- package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +210 -68
- package/template/.agents/skills/design/impeccable/scripts/live-browser.js +1562 -223
- package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +3 -0
- package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +33 -1
- package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +175 -255
- package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +26 -6
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +6 -1
- package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +61 -16
- package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +39 -10
- package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +573 -47
- package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +17 -7
- package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +124 -91
- package/template/.agents/skills/design/impeccable/scripts/live.mjs +88 -26
- package/template/.agents/skills/design/impeccable/scripts/palette.mjs +76 -81
- package/template/.agents/skills/design/impeccable/scripts/pin.mjs +18 -11
- package/template/.agents/skills/design/impeccable/scripts/serve-question.mjs +932 -0
- package/template/.agents/skills/design/impeccable/scripts/surface-brief.mjs +74 -0
- package/template/.agents/skills/design/shadcn/SKILL.md +46 -11
- package/template/.agents/skills/design/shadcn/cli.md +49 -16
- package/template/.agents/skills/design/shadcn/customization.md +14 -7
- package/template/.agents/skills/design/shadcn/evals/evals.json +30 -0
- package/template/.agents/skills/design/shadcn/mcp.md +27 -16
- package/template/.agents/skills/design/shadcn/registry.md +277 -0
- package/template/.agents/skills/design/shadcn/rules/chat.md +224 -0
- package/template/.agents/skills/design/shadcn/rules/composition.md +20 -2
- package/template/.agents/skills/design/shadcn/rules/styling.md +23 -0
- package/template/.agents/skills/find-skills/SKILL.md +2 -3
- package/template/.agents/skills/hono/SKILL.md +579 -0
- package/template/.agents/skills/integrations/langfuse/SKILL.md +10 -6
- package/template/.agents/skills/integrations/langfuse/references/ci-cd.md +41 -0
- package/template/.agents/skills/integrations/langfuse/references/cli.md +8 -0
- package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +15 -27
- package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +39 -52
- package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +5 -2
- package/template/.agents/skills/integrations/langfuse/references/prompt-engineering.md +35 -0
- package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +41 -196
- package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +3 -0
- package/template/.agents/skills/integrations/langfuse/references/trace-evaluator-upgrade.md +76 -0
- package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +4 -0
- package/template/.agents/skills/integrations/langfuse/references/v4-project-migration.md +73 -0
- package/template/.agents/skills/supabase/CHANGELOG.md +71 -0
- package/template/.agents/skills/supabase/SKILL.md +145 -0
- package/template/.agents/skills/supabase/assets/feedback-issue-template.md +17 -0
- package/template/.agents/skills/supabase/references/skill-feedback.md +17 -0
- package/template/.agents/skills/supabase-postgres-best-practices/CHANGELOG.md +73 -0
- package/template/.agents/skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/_template.md +34 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/template/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
- package/template/.agents/upstreams.json +34 -12
- package/template/.agents/skills/design/impeccable/reference/brand.md +0 -108
- package/template/.agents/skills/design/impeccable/reference/codex.md +0 -105
- package/template/.agents/skills/design/impeccable/reference/interaction-design.md +0 -189
- package/template/.agents/skills/integrations/langfuse/references/sdk-upgrade.md +0 -175
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# New visual work
|
|
2
|
+
|
|
3
|
+
Use this flow when making a new surface or replacing a visual identity. PRODUCT.md owns product truth. DESIGN.md owns durable visual decisions. A surface brief keeps strategy that belongs only to one route or artifact. Complete [init.md](init.md) first when PRODUCT.md is missing; a missing DESIGN.md does not route back to init.
|
|
4
|
+
|
|
5
|
+
## 1. Decide what is already true
|
|
6
|
+
|
|
7
|
+
Read DESIGN.md, representative code, tokens, components, and assets.
|
|
8
|
+
|
|
9
|
+
- **Redesign:** preserve product truth, content, function, constraints, and explicit brand commitments; replace the old visual world rather than polishing it. The old look is evidence of what the subject is, not authority over what it becomes.
|
|
10
|
+
- **Established world:** inherit it. A missing DESIGN.md does not erase a coherent identity already present in code; document that identity instead of inventing a replacement.
|
|
11
|
+
- **Incomplete brand:** preserve confirmed assets and recognizable traits, then help the user expand the system for this new surface.
|
|
12
|
+
- **No visual authority:** create a new world with the user.
|
|
13
|
+
|
|
14
|
+
A section, component, feature, or state inside an established surface inherits that surface. Do not turn a local addition into a new identity exercise.
|
|
15
|
+
|
|
16
|
+
## 2. Ask what will change the work
|
|
17
|
+
|
|
18
|
+
Ask one round of two or three related questions through the structured question tool when available. Skip settled facts; a precise request may need only a compact confirmation.
|
|
19
|
+
|
|
20
|
+
- **Persuade:** clarify who must act, what they should believe, and which real proof, content, or assets can earn that belief.
|
|
21
|
+
- **Operate:** clarify the task, information, important states, frequency, and constraints.
|
|
22
|
+
- **Read:** clarify the reader's question, source material, structure, and wayfinding.
|
|
23
|
+
- **Experience:** clarify what leads, how exploration unfolds, and which interaction or transition matters.
|
|
24
|
+
|
|
25
|
+
Across modes, ask what success looks like, what must remain untouched, and what would make a polished result feel wrong. Do not ask for CSS values or canned aesthetic lanes.
|
|
26
|
+
|
|
27
|
+
## 3. Choose the right amount of invention
|
|
28
|
+
|
|
29
|
+
### Extend an existing surface
|
|
30
|
+
|
|
31
|
+
Inherit its world and composition. Resolve only the new purpose, content, hierarchy, states, interaction, and how the addition joins the surrounding experience. Do not run a concept tournament or change DESIGN.md unless the user approves a durable system change.
|
|
32
|
+
|
|
33
|
+
### Create a whole surface inside an established world
|
|
34
|
+
|
|
35
|
+
Keep the visual system fixed. Derive five to seven materially different structures from the content, task, and user behavior, ordered by resonance. For a genuinely open whole page, screen, or flow, run:
|
|
36
|
+
|
|
37
|
+
`node .pi/skills/impeccable/scripts/concept-seed.mjs --scope surface --mode <mode>`
|
|
38
|
+
|
|
39
|
+
The script assigns which structure gets built; your top-ranked structure is what every run would ship, so the dice come from outside. Never run the script for a local extension or a precisely specified narrow request; shape those directly.
|
|
40
|
+
|
|
41
|
+
### Create or replace the visual world
|
|
42
|
+
|
|
43
|
+
1. Name the product's unique mechanism in one sentence, the audience's real scene, its cultural home, and what this first surface must prove. Note the page this category always ships and its predictable opposite; name both as the rut and keep them out of the seven-candidate list. A brief that paints its own picture, a product name, a titled artifact, a governing metaphor, adds its literal reading to the rut: spend at most one candidate on it and derive the rest from elsewhere in the audience's world.
|
|
44
|
+
2. From that cultural world, list seven concrete visual systems, artifacts, places, or rituals the audience knows by heart, each with one line on why it resonates and can carry the mechanism, ordered by resonance. The audience's world includes its graphic and screen traditions, not only its physical objects: the notation, publications, identity programs, data graphics, and interfaces it reads daily; a nameable abstract system (a school of poster, a documentation standard) is as concrete a candidate as any artifact. What would this thing look like as a physical object; what did its world look like before the web? Near-duplicates count once. When more than three of the seven share one material family, the derivation stopped at the subject's most obvious artifact; dig until the list spans at least three families.
|
|
45
|
+
3. Turn that material into complete directions: each joins a reusable visual world to a concrete first-surface experience.
|
|
46
|
+
4. Run `node .pi/skills/impeccable/scripts/concept-seed.mjs --scope direction --mode <mode>` and follow what it prints. This step has no substitute and no skip condition: on a new or replacement world, writing artifact code before this script has run and its assignment is acknowledged is a contract violation, whatever the harness, the model, or the time pressure, because the roll is the mechanism that keeps every run from converging on the category default. The script assigns which direction gets built and deals catalog challengers. Fuse each challenger before judging it: the challenger supplies the form and its system grammar, the product supplies every fact, and clarity wins conflicts. Weigh fused challengers against the assigned direction on exactly two axes, audience identification and product clarity; losing to strong grounded material is a valid outcome, and beating a thin or tool-monoculture list is the point.
|
|
47
|
+
5. Present one direction, fully committed: its world, first viewport, visitor path, signature interaction, cross-surface reach, and honest risk. Alongside it, offer the hand's challengers as named alternates, the weighing's verdict written on each as its one-line case, an honest "fuses poorly because X" included; the weighing informs the user's choice, it never pre-empts it. A hand holds at most three challengers: when the roll deals more, the three strongest join the hand and the rest wait in the re-roll pool, noted in one line; dropping a challenger from the hand itself takes a named product-truth failure, disclosed. Add re-roll with an optional one-line steer. Never present a ranked menu of your own grounded candidates; a lineup of those invites the safest card. The two channels share this structure and differ only in richness: cards and boards on the decision page, names and one-liners through the structured tool; the structured tool's option list also carries the standing exit as its last option.
|
|
48
|
+
|
|
49
|
+
The standing exit: every direction round offers one quiet, permanent alternative, the category standard, played straight. It is the user's door, never yours: never recommend it, never weigh it against the roll, never let it soften the dealt directions; the counterweights bind the unchosen default, not the chosen one. When the user takes it, in the canon action, a safer-steer, or plain words asking for the familiar or competitor-like path, convention becomes the commitment: ask once for two or three products this should sit alongside, make their craft level the bar, and execute the canon at full fidelity, without irony or smuggled quirk. A standing preference gets recorded as a brand commitment in PRODUCT.md. Re-roll eliminates every direction already shown, grounded and challenger alike; after two consecutive re-rolls, ask what quality is missing. You may re-roll on your own only on named factual grounds, when the assigned direction cannot carry the product's truth or task; taste is never grounds. The user may re-roll freely, and a user- or brief-pinned direction beats the roll, always. Present the decision visually: write an options payload with the assigned direction leading, the dealt challengers as alternates carrying their QUALITY BAR cards, and re-roll, steer, plus canon enabled; a degraded roll with no challengers still uses the page, as a single text-only card with re-roll. Give every card the same anatomy, thesis, palette, materials, first viewport, honest risk, and the challengers' case lines (run the script with `--schema` for the exact shape); the page renders identity from these fields, and a challenger's catalog image rides as labeled inspiration, never as the promise of the build. Author `canonCard` too: the category standard as one honest card with the same anatomy; the page keeps it subordinate, and the counterweights still bind you. Run `node .pi/skills/impeccable/scripts/serve-question.mjs --start --payload <file>` (run it with `--schema` first for the exact payload shape). It daemonizes, prints the page URL and a key, and exits immediately; now open that URL for the user, in-app browser first, then the system opener, then showing the URL. Collect the choice with `--wait --key <key>`, repeating while it exits 3; the ANSWER prints as JSON. Exit 4 means the page was closed without an answer: re-present once through the structured question tool, and with no answer there either, proceed unattended with the assigned direction and state the assumptions. A harness that can leave a shell blocked in the background may instead run the script without `--start` and let it auto-open and block. Only a session where no browser can open at all, headless, CI, an eval worker, a remote shell with no display, puts the same decision through the structured question tool instead; the script self-detects these environments and exits 2 with that advice, so treat exit 2 as this fallback, never as an error to retry.
|
|
50
|
+
|
|
51
|
+
When image generation exists, every card also declares a `sketch` path under `.impeccable/sketches/`, the canon card included. Serve the page first, then produce the sketches; the page shimmer-waits per slot and the user may answer before they land. Render every sketch through one shared frame so the comparison stays about direction, never rendering luck: the requested surface's first viewport as a flat, matte design sketch in that card's own palette and type character, deliberately unfinished, no photorealism, no gloss, identical framing across cards; a candidate whose sketch looks more finished than the others has broken the comparison, not won it. The frame's aspect is the surface's own: a native app or mobile-first surface sketches portrait at its device viewport, a desktop web surface landscape, and the decision page adapts to either, so a phone screen sketched landscape is a broken frame, not a neutral default. The only legible text in a sketch is the product's real name and one real headline; every other text region is greeked, indistinct lines standing where copy will go, because a sketch that renders invented specs, prices, or dates puts claims in front of the user that PRODUCT.md never made. Produce in the order the user reads: the assigned card, then the hand, then canon, each file written the moment it is done. When the harness runs subagents in parallel, fan the set out as one agent per card: each spawn is the shipped asset producer with a single-sketch packet, that card's fields, PRODUCT.md, the shared frame, and the card's declared path, up to four in flight at once. A slot still empty when its agent returns is regenerated inline, and a slot still empty when the user answers is dropped without ceremony; no other supervision is owed. Without parallel subagents, generate in the main thread after serving, in the same reading order, and let the harness's own generation display carry the progress; the wait for the answer follows the last file. A sketch answers which world, never which composition: the comp round still renders its full set, and the chosen card's sketch seeds at most one probe. With no image generation, the cards carry their identity in palette chips and facts, and that page is complete, not a lesser version.
|
|
52
|
+
|
|
53
|
+
Catalog worlds are working systems, not mood references. When one survives, carry its palette and material, type and composition, topology, controls and state, and responsive rules into the product. When the source is itself an interface language, commit to its native grammar across navigation, content, controls, and states. Open the QUALITY BAR board and hero for the world you build the moment the choice lands, even if you viewed another card earlier; the ANSWER line names the chosen card's images (when the harness only reads files or runs sandboxed, download them into the workspace and open the relative path; sandboxed viewers reject absolute paths outside it). They set the craft level the build must reach, a rendered reference's finish, commitment, and art direction, never the composition; your surface serves this product.
|
|
54
|
+
|
|
55
|
+
Every direction the roll can land on must already be viable: every relationship and claim it visualizes true, a real palette and component family, a distinctive composition with one product-specific experience, workable at full-surface scale within the available assets, tools, and performance budget. A candidate that fails on truth is replaced before the roll, never rescued by it. Truth binds claims, not demonstrations: in greenfield work, author whatever illustrative material the concept needs at full fidelity, label it synthetic wherever a visitor could mistake it for the real thing, and hand the user the list of what to replace with real material. What stays uninventable are commercial and factual claims: prices, customers, benchmarks, endpoints, capabilities the product does not have. Refusing a bold direction because its demonstration data does not exist yet is the timidity reflex wearing honesty's clothes.
|
|
56
|
+
|
|
57
|
+
For **Persuade**, the opening must make the offer intelligible and desirable, expose a clear action, and demonstrate something only this product can prove. Conversion lives inside the form's own vocabulary: a hook that lands in one line, a visible primary action, a legible reading order. A committed form that hides the offer or the action has not finished translating. For **Operate**, expression may never obscure the task, state, or familiar affordance. For **Read**, comprehension and wayfinding remain intact. For **Experience**, the work itself leads from the first viewport.
|
|
58
|
+
|
|
59
|
+
## 4. Commit the world
|
|
60
|
+
|
|
61
|
+
Pick a color strategy before picking colors: Restrained (neutrals plus one accent; the default when the visitor came to operate or read), Committed (one saturated color carries 30-60% of the surface), Full palette (3-4 named roles), or Drenched (the surface IS the color). Persuade and Experience surfaces have permission for the bolder strategies; take them when the brief allows. Color commits at page scale: fields that own whole regions, not accents scattered over a neutral ground. Dark or light is never a default: write one sentence of physical scene (who uses this, where, under what light) and let it force the answer.
|
|
62
|
+
|
|
63
|
+
Choose faces like objects from the subject's world, in the mode's register. Operate and Read surfaces are well served by system stacks and workhorse UI faces; Persuade and Experience surfaces want faces with a point of view, and these training-data defaults mean you stopped looking: Fraunces, Playfair Display, Cormorant, Lora, Crimson, Newsreader, Syne, Space Grotesk, Space Mono, IBM Plex, Inter-as-display, DM Sans, DM Serif, Outfit, Plus Jakarta Sans, Instrument Sans. Naming one of these faces anyway requires a reason no other face could satisfy, and a subject association is never that reason: books wanting a serif, bookshops wanting hand-lettering, and tech wanting a mono are the associations the list exists to break.
|
|
64
|
+
|
|
65
|
+
Calibration: AI-generated interfaces cluster around a few looks regardless of subject: warm cream ground, high-contrast serif display, and a terracotta or signal-red accent; near-black with one neon accent and glowing edges; broadsheet-editorial hairlines, italic display serif, and small tracked mono labels. All are legitimate when the brief calls for them. Where the brief leaves the aesthetic free, landing in one means the self-check failed: if someone could guess your aesthetic from the category alone, or from category-plus-avoidance, rework until neither answer is obvious. Energy is not the enemy of trust: a brief's negative constraints (no gamification, no hype) rule out those devices, not exuberance, and adjectives describing the product's behavior (quiet support, calm coaching) do not dictate the surface's energy. A bookish, warm, or child-facing subject does not soften the calibration: book cloth, thread, jackets, endpapers, and shelf ephemera span the whole saturated spectrum, and cream paper is the smallest corner of that world; landing on cream plus serif for a book subject is the default wearing the subject's clothes. A brief-pinned world pins the world, not its softest rendition: the pinned world's full material range stays in play, and a rendition that matches what any model ships for that world failed the self-check at execution rather than selection.
|
|
66
|
+
|
|
67
|
+
## 5. Record the decision
|
|
68
|
+
|
|
69
|
+
Before code, state the chosen direction as a contract in the artifact's opening comment, five short blocks, 150 words at most, in a form that survives the production build: an HTML comment in the emitted markup, never only a templating-frontmatter comment, placed as the first child of the document's body in the root layout, never inside a slotted or child component (some compilers, Astro among them, strip a slot's leading comment while keeping deeper ones). After the first production build, grep the built output for the seed key; a contract the build erased is a contract nobody can audit. THESIS: the one idea this surface owns and the category-default arrangement it refuses. OWN-WORLD: the palette and component language, specific enough to be recognizable with all content removed. STORY: what the visitor understands, believes, and does. FIRST VIEWPORT: the exact composition, what is where and at what scale, and where the primary action sits. FORM: the chosen form, its position on your ordered list, and the seed key the script printed. Close the comment with one more line, FINISH: the run's exit condition, verbatim "unreviewed and undocumented is unfinished; this build ends with the finish review, the verdict, and DESIGN.md". The comment tops the artifact you re-open on every edit, the one reminder that survives a long build: a page that looks complete with the FINISH line undischarged is not done, it is abandoned at the finish line. If a block reads like a mood, the direction is not decided yet; the finishing review audits the render against this contract.
|
|
70
|
+
|
|
71
|
+
On a new or replacement world, DESIGN.md is written at finish, from the built world, by the shipped documenter (section 7); a rulebook written before the build gets defended against reality instead of describing it, and hands the design-system detector an unstable target. A new world shipped with no DESIGN.md is still an incomplete run. An ordinary extension does not rewrite DESIGN.md.
|
|
72
|
+
|
|
73
|
+
If the work establishes durable strategy for a route or artifact, read its existing surface brief, then update it:
|
|
74
|
+
|
|
75
|
+
`node .pi/skills/impeccable/scripts/surface-brief.mjs read <primary-target>`
|
|
76
|
+
|
|
77
|
+
`node .pi/skills/impeccable/scripts/surface-brief.mjs write <primary-target> <body-file> [related-target ...]`
|
|
78
|
+
|
|
79
|
+
Keep the brief small: scope and visitor mode; audience, job, action/task, proof/content, and constraints; chosen direction and memorable moment; unresolved decisions. Do not copy global product truth or DESIGN.md tokens into it.
|
|
80
|
+
|
|
81
|
+
Whenever any image generation is available, a harness-native tool or the API fallback context.mjs reports, the locked direction is visualized before it is built, never skipped: load [visualize.md](visualize.md) and follow it, three compositional options rendered and put before the user for approval. This step is proven to produce the most compositional and ambitious work.
|
|
82
|
+
|
|
83
|
+
For `shape`, return the selected direction to [shape.md](shape.md) and stop before persistence or implementation.
|
|
84
|
+
|
|
85
|
+
## 6. Build with full commitment
|
|
86
|
+
|
|
87
|
+
Build the assigned direction, not a safer interpretation of it. The form supplies structure, reading order, component conventions, and native motion; the product supplies every fact. Commit every atom: nav, buttons, inputs, and links are rebuilt in the form's vocabulary, and a stock component inside a committed form is a lapse. Land the first build fully committed; committing is the hard part, and the passes that follow exist to make the committed thing clear and effective, never to dilute it. In unattended work, the safe rendition is the known risk.
|
|
88
|
+
|
|
89
|
+
- **The first viewport is a thesis, not a header.** Demonstrate the mechanism immediately, at the scale the form has in life; do not trap the concept inside a standard hero or card shell. The memory test: if someone left after one viewport, what would they describe an hour later? If the honest answer is a mood, the concept has not committed yet.
|
|
90
|
+
- **Prove, don't claim.** Show the subject doing its job: the interface at work, the mechanism dramatized, specifics a competitor could not copy-paste. Sections that restate a claim in different words add length, not substance. Demonstration data is design material: author it at full fidelity and label it synthetic; claims stay uninventable.
|
|
91
|
+
- **Author the assets; never substitute chrome.** Great surfaces live on carefully made content: names, entries, copy, covers, thumbnails, textures. In greenfield work every blank the ask round left open is yours to author at production fidelity; content is authorable, claims are labelable, no section is omittable. An unanswered commercial claim ships as a clearly marked placeholder on the user's replacement list. When image generation exists, producing the design's imagery is part of building, at the scale the composition needs: a viewport that wants atmosphere gets a full-bleed layered scene, and a library of small centered subjects standardized for tidiness forecloses it. Gradients, glass, and generic icon tiles where an authored asset belongs are the gap wearing chrome; icons drawn in the world's own grammar are the remedy, not the target.
|
|
92
|
+
- **Build the form's web leverage.** When the chosen world names a technique (canvas, WebGL, view transitions, generative motion), build the technique itself, not a static imitation of it; the graceful fallback serves constrained clients, it is not the default experience.
|
|
93
|
+
- **Pace the scroll like a studio.** Vary density, scale, image, motion, and quiet inside one grammar; a dense passage earns a quiet one, and the page ends anchored by a real close. One spacing rhythm throughout, with more space above a heading than below it.
|
|
94
|
+
- **Use real, verified imagery when the brief implies it.** Search for the subject's physical object rather than the category; one decisive photo beats five mediocre ones. Verify stock URLs resolve.
|
|
95
|
+
- **Author motion as material.** The form has native motion, what it does in life between states; give the page that motion once, orchestrated, rather than scattered hover effects. Bound expensive effects and keep content visible by default.
|
|
96
|
+
|
|
97
|
+
Preserve semantics, accessibility, performance, responsiveness, project conventions, and working behavior.
|
|
98
|
+
|
|
99
|
+
## 7. Inspect and finish
|
|
100
|
+
|
|
101
|
+
Inspect desktop and mobile in one batched screenshot round, critique the render against the user's request and the direction contract, fix material gaps, and confirm with one final round; two rounds is the ceiling, and fixes batch between them rather than earning per-tweak screenshots. When an approved comp exists, the critique is a side-by-side: view the comp region and the build region together, the hero and each section as its own crop at legible scale, never one full-page thumbnail, which hides exactly the failures that matter, crude controls, wrong lettering character, flattened material, behind a superficially similar section order. On a Persuade surface, verify the mode did its job: a first-time visitor should know what this is, why it matters, and what to do within seconds, in the form's own vocabulary.
|
|
102
|
+
|
|
103
|
+
After the second inspection round the build thread's polishing is over: no further defect hunts, micro-edit scripts, or rebuilds here; whatever remains ships through the handoffs, where a fresh context does the finding better and cheaper. Where this harness runs no design hook, run `node .pi/skills/impeccable/scripts/detect.mjs --json` on the changed targets once here, fix what is mechanical, and pass the remaining findings to the reviewer; a hookless build that skips this ships every tell the hook exists to catch. Capture desktop and mobile screenshots to files, then spawn the shipped finish reviewer, `impeccable-finish-reviewer` (`impeccable_finish_reviewer` in codex; `/impeccable-finish-reviewer` in Cursor; on GitHub Copilot say "Use the impeccable-finish-reviewer agent"), with the original request, confirmed answers, the artifact path, the screenshot paths, its direction contract, existing hook findings, the QUALITY BAR card and approved comp paths, and the craft-floor reference path. The reviewer has no browser; screenshots you fail to pass are checks it cannot run. Verify its return carries the five contract sections; on an empty or thrashed return, respawn once with the same inputs before doing anything else. This review never runs inside the build thread and never inherits it: spawn the reviewer fresh, with no forked conversation history (`fork_turns: 0` in codex); a reviewer that inherits your transcript inherits your framing, your optimism, and your abstractions, and everything it needs travels in the inputs above. Only a harness whose tool surface has no subagent capability at all substitutes a fresh in-thread pass after stepping fully out of the build context, run from [degraded/finish-reviewer.md](degraded/finish-reviewer.md), and a substituted or failed-and-replaced review is disclosed in one line at finish, never silently. When the reviewer's first material fix is a rebuild directive, fidelity failed wholesale rather than in patches, so skip the fix batch: put that verdict in front of the user with the named comp regions and let them choose between a re-derivation and shipping as it stands. Otherwise apply the material fixes in one batch, rebuild once, and recapture the same viewports. A recapture measures positions, loading, and overflow; it cannot measure whether a fix reached the quality the finding named, so send the recaptured screenshots back to the same reviewer for a verdict scoring every material fix resolved, partial, or unresolved (through the harness's agent continuation; without one, run the scoring fresh from [degraded/finish-reviewer.md](degraded/finish-reviewer.md)'s Verdict Pass). Fixes scored partial or unresolved get another batch, recapture, and verdict. Two rounds is the budget an unattended run ends at; an attended session's ceiling belongs to the user, so when the second verdict still lists open items, put the table in front of them and let them choose between shipping as it stands and funding another round. Whoever is deciding, stop the moment a round resolves nothing, and the reviewer's findings are the only list you work from, never your own re-opened hunt. Report the final verdict table to the user as it stands, open items included, under the reviewer's own disposition word: a table with open material findings is never announced as a pass, and never under a softer label than the reviewer wrote. Do not run a second detector.
|
|
104
|
+
|
|
105
|
+
Then spawn the shipped documenter, `impeccable-documenter` (`impeccable_documenter` in codex), with the project root, the artifact path, the direction contract, PRODUCT.md, the [document.md](document.md) reference path, and the boundary to write at; it records DESIGN.md and the sidecar from the built world, ground truth over intention; without subagents the pass runs from [degraded/documenter.md](degraded/documenter.md). A clean detector pass is not finished; finished is the contract kept, the comp honored, the review closed, and the system recorded.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Operate mode depth (and Read notes)
|
|
2
2
|
|
|
3
|
-
When design SERVES the product: app UIs, admin dashboards, settings panels, data tables, tools, authenticated surfaces, anything where the user is in a task.
|
|
3
|
+
When design SERVES the product: app UIs, admin dashboards, settings panels, data tables, tools, authenticated surfaces, anything where the user is in a task. The essentials live in SKILL.md's modes and [craft-floor.md](craft-floor.md); this file is extended depth, written for Operate surfaces. Read surfaces (docs, guides, long-form) take SKILL.md's Read mode plus this file's typography and consistency rules; their prose measure and navigation matter more than component density.
|
|
4
4
|
|
|
5
5
|
## The product slop test
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Familiarity is often a feature here. The test is whether a category-fluent user can trust the interface immediately or must pause at every subtly-off component.
|
|
8
8
|
|
|
9
9
|
Product UI's failure mode isn't flatness, it's strangeness without purpose: over-decorated buttons, mismatched form controls, gratuitous motion, display fonts where labels should be, invented affordances for standard tasks. The bar is earned familiarity. The tool should disappear into the task.
|
|
10
10
|
|
|
@@ -34,6 +34,7 @@ Every interactive component has: default, hover, focus, active, disabled, loadin
|
|
|
34
34
|
- Skeleton states for loading, not spinners in the middle of content.
|
|
35
35
|
- Empty states that teach the interface, not "nothing here."
|
|
36
36
|
- Consistent affordances across the surface. Same button shape. Same form-control vocabulary. Same icon style.
|
|
37
|
+
- Overlays escape their container. An absolutely positioned dropdown inside an `overflow: hidden` or `overflow: auto` ancestor gets clipped; reach for `<dialog>`, the popover API, `position: fixed`, or a portal.
|
|
37
38
|
|
|
38
39
|
## Motion
|
|
39
40
|
|
|
@@ -41,7 +42,7 @@ Every interactive component has: default, hover, focus, active, disabled, loadin
|
|
|
41
42
|
- Motion conveys state, not decoration. State change, feedback, loading, reveal: nothing else.
|
|
42
43
|
- No orchestrated page-load sequences. Product loads into a task; users don't want to watch it load.
|
|
43
44
|
|
|
44
|
-
## Product
|
|
45
|
+
## Product constraints
|
|
45
46
|
|
|
46
47
|
- Decorative motion that doesn't convey state.
|
|
47
48
|
- Inconsistent component vocabulary across screens. If the "save" button looks different in two places, one is wrong.
|
|
@@ -54,7 +55,7 @@ Every interactive component has: default, hover, focus, active, disabled, loadin
|
|
|
54
55
|
|
|
55
56
|
Product can afford things brand surfaces can't.
|
|
56
57
|
|
|
57
|
-
- System fonts and familiar sans defaults
|
|
58
|
+
- System fonts and familiar sans defaults.
|
|
58
59
|
- Standard navigation patterns: top bar + side nav, breadcrumbs, tabs, command palettes.
|
|
59
60
|
- Density. Tables with many rows, panels with many labels, dense information when users need it.
|
|
60
61
|
- Consistency over surprise. The same visual vocabulary screen to screen is a virtue; delight is saved for moments, not pages.
|
|
@@ -5,7 +5,7 @@ Performance is a feature. Identify the actual bottleneck for THIS interface, fix
|
|
|
5
5
|
Understand current performance and identify problems:
|
|
6
6
|
|
|
7
7
|
1. **Measure current state**:
|
|
8
|
-
- **Core Web Vitals**: LCP,
|
|
8
|
+
- **Core Web Vitals**: LCP, INP, CLS scores
|
|
9
9
|
- **Load time**: Time to interactive, first contentful paint
|
|
10
10
|
- **Bundle size**: JavaScript, CSS, image sizes
|
|
11
11
|
- **Runtime performance**: Frame rate, memory usage, CPU usage
|
|
@@ -106,7 +106,7 @@ elements.forEach((el, i) => {
|
|
|
106
106
|
- Minimize DOM depth (flatter is faster)
|
|
107
107
|
- Reduce DOM size (fewer elements)
|
|
108
108
|
- Use `content-visibility: auto` for long lists
|
|
109
|
-
- Virtual scrolling for very long lists (react-window,
|
|
109
|
+
- Virtual scrolling for very long lists (react-window, TanStack Virtual)
|
|
110
110
|
|
|
111
111
|
**Reduce Paint & Composite**:
|
|
112
112
|
- Use `transform` and `opacity` for reliable movement, but allow blur, filters, masks, clip paths, shadows, and color shifts when they create meaningful polish
|
|
@@ -196,7 +196,7 @@ const observer = new IntersectionObserver((entries) => {
|
|
|
196
196
|
- Use CDN
|
|
197
197
|
- Server-side rendering
|
|
198
198
|
|
|
199
|
-
###
|
|
199
|
+
### Interaction to Next Paint (INP < 200ms)
|
|
200
200
|
- Break up long tasks
|
|
201
201
|
- Defer non-critical JavaScript
|
|
202
202
|
- Use web workers for heavy computation
|
|
@@ -226,7 +226,7 @@ const observer = new IntersectionObserver((entries) => {
|
|
|
226
226
|
- Performance monitoring (Sentry, DataDog, New Relic)
|
|
227
227
|
|
|
228
228
|
**Key metrics**:
|
|
229
|
-
- LCP,
|
|
229
|
+
- LCP, INP, CLS (Core Web Vitals; INP replaced FID in March 2024)
|
|
230
230
|
- Time to Interactive (TTI)
|
|
231
231
|
- First Contentful Paint (FCP)
|
|
232
232
|
- Total Blocking Time (TBT)
|
|
@@ -57,7 +57,7 @@ Organized by what you're trying to achieve, not by technology name.
|
|
|
57
57
|
|
|
58
58
|
### Render beyond CSS
|
|
59
59
|
- **WebGL** (all browsers): shader effects, post-processing, particle systems. Libraries: Three.js, OGL (lightweight), regl. Use for effects CSS can't express.
|
|
60
|
-
- **WebGPU** (Chrome/Edge; Safari
|
|
60
|
+
- **WebGPU** (Chrome/Edge; Safari 26+; Firefox on Windows/macOS; flag only on Firefox Linux/Android): next-gen GPU compute, more powerful than WebGL. Always fall back to WebGL2.
|
|
61
61
|
- **Canvas 2D / OffscreenCanvas**: custom rendering, pixel manipulation, or moving heavy rendering off the main thread entirely via Web Workers + OffscreenCanvas.
|
|
62
62
|
- **SVG filter chains**: displacement maps, turbulence, morphology for organic distortion effects. CSS-animatable.
|
|
63
63
|
|
|
@@ -102,7 +102,6 @@ else if (canvas.getContext('webgl2')) { /* WebGL2 fallback */ }
|
|
|
102
102
|
### Performance rules
|
|
103
103
|
|
|
104
104
|
- Target 60fps. If dropping below 50, simplify.
|
|
105
|
-
- Respect `prefers-reduced-motion`, always. Provide a beautiful static alternative.
|
|
106
105
|
- Lazy-initialize heavy resources (WebGL contexts, WASM modules) only when near viewport.
|
|
107
106
|
- Pause off-screen rendering. Kill what you can't see.
|
|
108
107
|
- Test on real mid-range devices, not just your development machine.
|
|
@@ -112,7 +111,6 @@ else if (canvas.getContext('webgl2')) { /* WebGL2 fallback */ }
|
|
|
112
111
|
The gap between "cool" and "extraordinary" is in the last 20% of refinement: the easing curve on a spring animation, the timing offset in a staggered reveal, the subtle secondary motion that makes a transition feel physical. Don't ship the first version that works; ship the version that feels inevitable.
|
|
113
112
|
|
|
114
113
|
**NEVER**:
|
|
115
|
-
- Ignore `prefers-reduced-motion`. This is an accessibility requirement, not a suggestion
|
|
116
114
|
- Ship effects that cause jank on mid-range devices
|
|
117
115
|
- Use bleeding-edge APIs without a functional fallback
|
|
118
116
|
- Add sound without explicit user opt-in
|
|
@@ -124,7 +122,6 @@ The gap between "cool" and "extraordinary" is in the last 20% of refinement: the
|
|
|
124
122
|
- **The wow test**: Show it to someone who hasn't seen it. Do they react?
|
|
125
123
|
- **The removal test**: Take it away. Does the experience feel diminished, or does nobody notice?
|
|
126
124
|
- **The device test**: Run it on a phone, a tablet, a Chromebook. Still smooth?
|
|
127
|
-
- **The accessibility test**: Enable reduced motion. Still beautiful?
|
|
128
125
|
- **The context test**: Does this make sense for THIS brand and audience?
|
|
129
126
|
|
|
130
127
|
"Technically extraordinary" isn't about using the newest API. It's about making an interface do something users didn't think a website could do.
|
|
@@ -1,241 +1,97 @@
|
|
|
1
|
-
> **Additional context needed**: quality bar
|
|
1
|
+
> **Additional context needed**: quality bar and shipping constraints.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Polish is refinement, never concealed redesign. Preserve the incumbent visual world, content, behavior, and everything outside scope. If the concept itself is wrong, say so and recommend redesign or `bolder` instead of smuggling in a replacement.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A detector result is defect evidence, not proof of quality. Inspect the rendered experience and real interaction path.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 1. Establish the system
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Read DESIGN.md and representative tokens, shared components, patterns, and neighboring flows. If no formal system exists, use coherent project conventions.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
2. **Note the conventions**: How are shared components imported? What spacing scale is used? Which colors come from tokens vs hard-coded values? What motion and interaction patterns are established? What flow shapes are used for comparable actions (modal vs full-page, inline vs route, save-on-blur vs explicit submit)?
|
|
13
|
-
3. **Identify drift, then name the root cause**: For every deviation, classify it as a **missing token** (the value should exist in the system but doesn't), a **one-off implementation** (a shared component already exists but wasn't used), or a **conceptual misalignment** (the feature's flow, IA, or hierarchy doesn't match neighboring features). The fix differs by category: patch the value, swap to the shared component, or rework the flow. Fixing the symptom without naming the cause is how drift compounds.
|
|
11
|
+
Classify each drift before fixing it:
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
- **missing token:** the system needs a reusable value;
|
|
14
|
+
- **one-off implementation:** an existing shared component or pattern should replace it;
|
|
15
|
+
- **conceptual mismatch:** the flow, information architecture, or hierarchy differs from comparable product areas;
|
|
16
|
+
- **local defect:** the implementation is simply incomplete or inconsistent.
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
Fix the cause at the narrowest correct level. Ask when a binding system principle cannot be inferred.
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
## 2. Gather the evidence
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
- Is it functionally complete?
|
|
23
|
-
- Are there known issues to preserve (mark with TODOs)?
|
|
24
|
-
- What's the quality bar? (MVP vs flagship feature?)
|
|
25
|
-
- When does it ship? (How much time for polish?)
|
|
22
|
+
Use the feature yourself at representative desktop and mobile sizes. Determine:
|
|
26
23
|
|
|
27
|
-
|
|
24
|
+
- whether the path is functionally complete;
|
|
25
|
+
- the intended quality bar and time available;
|
|
26
|
+
- known constraints or deliberately unfinished work;
|
|
27
|
+
- the states, content lengths, roles, and input methods users will actually encounter.
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
- Visual inconsistencies
|
|
31
|
-
- Spacing and alignment issues
|
|
32
|
-
- Interaction state gaps
|
|
33
|
-
- Copy inconsistencies
|
|
34
|
-
- Edge cases and error states
|
|
35
|
-
- Loading and transition smoothness
|
|
36
|
-
- Information architecture and flow drift (does this feature reveal complexity the way neighboring features do?)
|
|
29
|
+
If a prior critique exists, use it as one input:
|
|
37
30
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
node .pi/skills/impeccable/scripts/critique-storage.mjs latest "$slug"
|
|
42
|
-
```
|
|
43
|
-
Exit 0 with body = found; fold the P0/P1 items into your polish list and mention the snapshot path so the user sees what you read. Exit 2 = no snapshot, continue without it. The critique is one input among many. Do your own pass either way.
|
|
31
|
+
```bash
|
|
32
|
+
node .pi/skills/impeccable/scripts/critique-storage.mjs latest "<resolved target>"
|
|
33
|
+
```
|
|
44
34
|
|
|
45
|
-
|
|
35
|
+
Exit 0 returns the latest snapshot; incorporate relevant P0/P1 findings and name the snapshot read. Exit 2 means none exists. Perform an independent pass either way.
|
|
46
36
|
|
|
47
|
-
|
|
37
|
+
## 3. Triage
|
|
48
38
|
|
|
49
|
-
|
|
39
|
+
Separate functional defects from cosmetic ones and fix in this order:
|
|
50
40
|
|
|
51
|
-
|
|
41
|
+
1. broken or blocked tasks, data loss, misleading state, and inaccessible paths;
|
|
42
|
+
2. missing loading, empty, error, success, disabled, and permission states;
|
|
43
|
+
3. flow, hierarchy, responsive, and design-system drift;
|
|
44
|
+
4. visual and motion inconsistencies;
|
|
45
|
+
5. code and asset cleanup.
|
|
52
46
|
|
|
53
|
-
|
|
47
|
+
Do not perfect one corner while leaving the rest below the same quality bar.
|
|
54
48
|
|
|
55
|
-
|
|
56
|
-
- **Consistent spacing**: All gaps use spacing scale (no random 13px gaps)
|
|
57
|
-
- **Optical alignment**: Adjust for visual weight (icons may need offset for optical centering)
|
|
58
|
-
- **Responsive consistency**: Spacing and alignment work at all breakpoints
|
|
59
|
-
- **Grid adherence**: Elements snap to baseline grid
|
|
49
|
+
## 4. Polish the whole path
|
|
60
50
|
|
|
61
|
-
|
|
62
|
-
- Enable grid overlay and verify alignment
|
|
63
|
-
- Check spacing with browser inspector
|
|
64
|
-
- Test at multiple viewport sizes
|
|
65
|
-
- Look for elements that "feel" off
|
|
51
|
+
### Flow and hierarchy
|
|
66
52
|
|
|
67
|
-
|
|
53
|
+
- Match neighboring mental models, terminology, disclosure, routing, save behavior, and optimistic or pessimistic patterns.
|
|
54
|
+
- Make the primary task and current state obvious without flattening every element to equal weight.
|
|
55
|
+
- Ensure arrival, transition, empty, and recovery paths connect instead of behaving as isolated screens.
|
|
68
56
|
|
|
69
|
-
|
|
57
|
+
### Layout and type
|
|
70
58
|
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- **Naming and mental model**: The feature uses the same nouns and verbs as the rest of the system. A "Workspace" here shouldn't be a "Project" three screens away.
|
|
59
|
+
- Align to the project's grid and spacing scale; fix optical as well as mathematical alignment.
|
|
60
|
+
- Group related content tightly and separate distinct groups generously.
|
|
61
|
+
- Keep same-role typography consistent; test measure, wrapping, localization expansion, zoom, and font loading.
|
|
62
|
+
- Verify every supported viewport rather than correcting only the current screenshot.
|
|
76
63
|
|
|
77
|
-
###
|
|
64
|
+
### Color, imagery, and icons
|
|
78
65
|
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
- **Hyphenation**: Appropriate for language and column width
|
|
84
|
-
- **Kerning**: Adjust letter spacing where needed (especially headlines)
|
|
85
|
-
- **Font loading**: No FOUT/FOIT flashes
|
|
66
|
+
- Use semantic tokens and stable color meanings across themes.
|
|
67
|
+
- Verify text, control, and focus contrast in every state.
|
|
68
|
+
- Keep icon families, stroke/weight, sizing, and optical alignment coherent.
|
|
69
|
+
- Prevent image layout shift; use correct aspect ratios, responsive sources, and useful alt text.
|
|
86
70
|
|
|
87
|
-
###
|
|
71
|
+
### Interaction and state
|
|
88
72
|
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
- **Accessible focus**: Focus indicators visible with sufficient contrast
|
|
94
|
-
- **Gray on color**: Never put gray text on colored backgrounds; use a shade of that color or transparency
|
|
73
|
+
- Every control needs appropriate default, hover, focus, active, disabled, loading, error, and success behavior.
|
|
74
|
+
- Preserve visible keyboard focus, logical tab order, labels, and platform-appropriate touch targets.
|
|
75
|
+
- Keep motion coherent, interruptible, and performant. Do not add animation merely to make polish visible.
|
|
76
|
+
- Validate long, missing, localized, offline, slow, and permission-limited content where the product can encounter it.
|
|
95
77
|
|
|
96
|
-
###
|
|
78
|
+
### Content and code
|
|
97
79
|
|
|
98
|
-
|
|
80
|
+
- Keep terminology, capitalization, punctuation, and factual copy consistent. Ask before changing claims.
|
|
81
|
+
- Remove debug output, dead code, unused imports, obsolete styles, and polish-created duplication.
|
|
82
|
+
- Replace custom implementations with shared components where the system owns the pattern.
|
|
83
|
+
- Promote genuinely reusable values to tokens; do not create a system abstraction for one local exception.
|
|
99
84
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
- **Smooth transitions**: All state changes animated appropriately (150-300ms)
|
|
114
|
-
- **Consistent easing**: Use ease-out-quart/quint/expo for natural deceleration. Never bounce or elastic; they feel dated.
|
|
115
|
-
- **No jank**: Smooth animations; use atmospheric blur/filter/mask/shadow effects when they add polish, but bound expensive paint areas and avoid casual layout-property animation
|
|
116
|
-
- **Appropriate motion**: Motion serves purpose, not decoration
|
|
117
|
-
- **Reduced motion**: Respects `prefers-reduced-motion`
|
|
118
|
-
|
|
119
|
-
### Content & Copy
|
|
120
|
-
|
|
121
|
-
- **Consistent terminology**: Same things called same names throughout
|
|
122
|
-
- **Consistent capitalization**: Title Case vs Sentence case applied consistently
|
|
123
|
-
- **Grammar & spelling**: No typos
|
|
124
|
-
- **Appropriate length**: Not too wordy, not too terse
|
|
125
|
-
- **Punctuation consistency**: Periods on sentences, not on labels (unless all labels have them)
|
|
126
|
-
|
|
127
|
-
### Icons & Images
|
|
128
|
-
|
|
129
|
-
- **Consistent style**: All icons from same family or matching style
|
|
130
|
-
- **Appropriate sizing**: Icons sized consistently for context
|
|
131
|
-
- **Proper alignment**: Icons align with adjacent text optically
|
|
132
|
-
- **Alt text**: All images have descriptive alt text
|
|
133
|
-
- **Loading states**: Images don't cause layout shift, proper aspect ratios
|
|
134
|
-
- **Retina support**: 2x assets for high-DPI screens
|
|
135
|
-
|
|
136
|
-
### Forms & Inputs
|
|
137
|
-
|
|
138
|
-
- **Label consistency**: All inputs properly labeled
|
|
139
|
-
- **Required indicators**: Clear and consistent
|
|
140
|
-
- **Error messages**: Helpful and consistent
|
|
141
|
-
- **Tab order**: Logical keyboard navigation
|
|
142
|
-
- **Auto-focus**: Appropriate (don't overuse)
|
|
143
|
-
- **Validation timing**: Consistent (on blur vs on submit)
|
|
144
|
-
|
|
145
|
-
### Edge Cases & Error States
|
|
146
|
-
|
|
147
|
-
- **Loading states**: All async actions have loading feedback
|
|
148
|
-
- **Empty states**: Helpful empty states, not just blank space
|
|
149
|
-
- **Error states**: Clear error messages with recovery paths
|
|
150
|
-
- **Success states**: Confirmation of successful actions
|
|
151
|
-
- **Long content**: Handles very long names, descriptions, etc.
|
|
152
|
-
- **No content**: Handles missing data gracefully
|
|
153
|
-
- **Offline**: Appropriate offline handling (if applicable)
|
|
154
|
-
|
|
155
|
-
### Responsiveness
|
|
156
|
-
|
|
157
|
-
- **All breakpoints**: Test mobile, tablet, desktop
|
|
158
|
-
- **Touch targets**: 44x44px minimum on touch devices
|
|
159
|
-
- **Readable text**: No text smaller than 14px on mobile
|
|
160
|
-
- **No horizontal scroll**: Content fits viewport
|
|
161
|
-
- **Appropriate reflow**: Content adapts logically
|
|
162
|
-
|
|
163
|
-
### Performance
|
|
164
|
-
|
|
165
|
-
- **Fast initial load**: Optimize critical path
|
|
166
|
-
- **No layout shift**: Elements don't jump after load (CLS)
|
|
167
|
-
- **Smooth interactions**: No lag or jank
|
|
168
|
-
- **Optimized images**: Appropriate formats and sizes
|
|
169
|
-
- **Lazy loading**: Off-screen content loads lazily
|
|
170
|
-
|
|
171
|
-
### Code Quality
|
|
172
|
-
|
|
173
|
-
- **Remove console logs**: No debug logging in production
|
|
174
|
-
- **Remove commented code**: Clean up dead code
|
|
175
|
-
- **Remove unused imports**: Clean up unused dependencies
|
|
176
|
-
- **Consistent naming**: Variables and functions follow conventions
|
|
177
|
-
- **Type safety**: No TypeScript `any` or ignored errors
|
|
178
|
-
- **Accessibility**: Proper ARIA labels and semantic HTML
|
|
179
|
-
|
|
180
|
-
## Polish Checklist
|
|
181
|
-
|
|
182
|
-
Go through systematically:
|
|
183
|
-
|
|
184
|
-
- [ ] Aligned to the design system (drift named and resolved by root cause)
|
|
185
|
-
- [ ] Information architecture and flow shape match neighboring features
|
|
186
|
-
- [ ] Visual alignment perfect at all breakpoints
|
|
187
|
-
- [ ] Spacing uses design tokens consistently
|
|
188
|
-
- [ ] Typography hierarchy consistent
|
|
189
|
-
- [ ] All interactive states implemented
|
|
190
|
-
- [ ] All transitions smooth (60fps)
|
|
191
|
-
- [ ] Copy is consistent and polished
|
|
192
|
-
- [ ] Icons are consistent and properly sized
|
|
193
|
-
- [ ] All forms properly labeled and validated
|
|
194
|
-
- [ ] Error states are helpful
|
|
195
|
-
- [ ] Loading states are clear
|
|
196
|
-
- [ ] Empty states are welcoming
|
|
197
|
-
- [ ] Touch targets are 44x44px minimum
|
|
198
|
-
- [ ] Contrast ratios meet WCAG AA
|
|
199
|
-
- [ ] Keyboard navigation works
|
|
200
|
-
- [ ] Focus indicators visible
|
|
201
|
-
- [ ] No console errors or warnings
|
|
202
|
-
- [ ] No layout shift on load
|
|
203
|
-
- [ ] Works in all supported browsers
|
|
204
|
-
- [ ] Respects reduced motion preference
|
|
205
|
-
- [ ] Code is clean (no TODOs, console.logs, commented code)
|
|
206
|
-
|
|
207
|
-
**IMPORTANT**: Polish is about details. Zoom in. Squint at it. Use it yourself. The little things add up.
|
|
208
|
-
|
|
209
|
-
Sweat the details. Zoom in until the alignment is right and the spacing reads as deliberate. Then ship.
|
|
210
|
-
|
|
211
|
-
**NEVER**:
|
|
212
|
-
- Polish before it's functionally complete
|
|
213
|
-
- Polish without aligning to the design system; that's decoration on drift
|
|
214
|
-
- Guess at design system principles instead of asking when something is ambiguous
|
|
215
|
-
- Spend hours on polish if it ships in 30 minutes (triage)
|
|
216
|
-
- Introduce bugs while polishing (test thoroughly)
|
|
217
|
-
- Ignore systematic issues (if spacing is off everywhere, fix the system, not just one screen)
|
|
218
|
-
- Perfect one thing while leaving others rough (consistent quality level)
|
|
219
|
-
- Create new one-off components when design system equivalents exist
|
|
220
|
-
- Hard-code values that should use design tokens
|
|
221
|
-
- Introduce new patterns or flows that diverge from established ones
|
|
222
|
-
|
|
223
|
-
## Final Verification
|
|
224
|
-
|
|
225
|
-
Before marking as done:
|
|
226
|
-
|
|
227
|
-
- **Use it yourself**: Actually interact with the feature.
|
|
228
|
-
- **Test on real devices**: Not just browser DevTools.
|
|
229
|
-
- **Ask someone else to review**: Fresh eyes catch things.
|
|
230
|
-
- **Compare to design**: Match intended design.
|
|
231
|
-
- **Check all states**: Don't just test happy path.
|
|
232
|
-
- **Treat automation carefully**: Run detector or QA commands when they are available and relevant, fix their defects, but never cite a clean result as proof that the work is polished.
|
|
233
|
-
|
|
234
|
-
## Clean Up
|
|
235
|
-
|
|
236
|
-
After polishing, ensure code quality:
|
|
237
|
-
|
|
238
|
-
- **Replace custom implementations**: If the design system provides a component you reimplemented, switch to the shared version.
|
|
239
|
-
- **Remove orphaned code**: Delete unused styles, components, or files made obsolete by polish.
|
|
240
|
-
- **Consolidate tokens**: If you introduced new values, check whether they should be tokens.
|
|
241
|
-
- **Verify DRYness**: Look for duplication introduced during polishing and consolidate.
|
|
85
|
+
## 5. Verify and finish
|
|
86
|
+
|
|
87
|
+
Walk the complete path again with mouse, keyboard, and touch where applicable. Check:
|
|
88
|
+
|
|
89
|
+
- mobile, intermediate, and wide layouts;
|
|
90
|
+
- loading, empty, error, success, disabled, long-content, and missing-content states;
|
|
91
|
+
- zoom, contrast, focus, semantics, and screen-reader names;
|
|
92
|
+
- console errors, layout shift, interaction latency, image loading, and supported browsers;
|
|
93
|
+
- agreement with DESIGN.md, neighboring features, and the user's scope.
|
|
94
|
+
|
|
95
|
+
Follow the quality guidance supplied by `context.mjs` and hooks, then run any other relevant QA commands. Context requests a manual scan only when no automatic detector is active; never add another detector pass. Fix real defects and document only narrow intentional exceptions. A clean scan does not replace visual judgment.
|
|
96
|
+
|
|
97
|
+
Finish with a source diff: remove accidental churn, orphaned code, redundant values, and temporary artifacts. Ship only when the feature is functionally complete and consistently finished across the path.
|
|
@@ -2,11 +2,11 @@ Quiet design is harder than bold design. Subtlety needs precision. Reduce visual
|
|
|
2
2
|
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Visitor mode
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Persuade + Experience: "quieter" means more restrained palette, more whitespace, more typographic air. Drama is reduced, not eliminated; the POV stays intact.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Operate + Read: "quieter" means reducing visual noise. Fewer background accents, flatter cards, less color, less motion. The tool should disappear more completely into the task.
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# No-argument routing: the context-aware menu
|
|
2
|
+
|
|
3
|
+
Read this when the user invokes `/impeccable` with no argument. They are asking "what should I do?" Make the menu context-aware instead of static.
|
|
4
|
+
|
|
5
|
+
Setup has already run `context.mjs`. If that reported `NO_PRODUCT_MD`, the project has no captured context yet: lead the menu with `/impeccable init` as the top recommendation (one line on why) and still show the rest below; don't silently jump into init. Otherwise run `node .pi/skills/impeccable/scripts/context-signals.mjs` once and read its JSON, then lead with the **2-3 highest-value next commands**, each with a one-line reason pulled from the signals, followed by the full menu (the Commands table in SKILL.md, grouped by category). **Never auto-run a command; the recommendation is a suggestion the user confirms.**
|
|
6
|
+
|
|
7
|
+
Reason over the signals; there is no score to obey:
|
|
8
|
+
|
|
9
|
+
- `setup.hasDesign` false while `setup.hasCode` true → `document` (capture the visual system).
|
|
10
|
+
- `critique.latest` is `null` → the project has never been critiqued; for a set-up project with a real surface, offering `/impeccable critique <surface>` is a strong default.
|
|
11
|
+
- `critique.latest` with a low `score` or non-zero `p0` / `p1` → `polish` (it reads that snapshot as its backlog), or re-run `critique` if the snapshot looks stale.
|
|
12
|
+
- `git.changedFiles` pointing at one surface → scope `audit` or `polish` to those files specifically, naming them.
|
|
13
|
+
- `devServer.running` true → `live` is available for in-browser iteration; if false, don't lead with `live`. **`live` and the bundled `detect.mjs` are web-only.** If `setup.platform` is `ios`, `android`, or `adaptive`, don't lead with either; the browser overlay and the HTML rule engine don't apply to native app code.
|
|
14
|
+
- Otherwise group by intent (build new / improve what's there / iterate visually), tailored to the current surface and `setup.platform`.
|
|
15
|
+
|
|
16
|
+
**If `scan.targets` is non-empty and `setup.platform` is not `ios`/`android`/`adaptive`, run `node .pi/skills/impeccable/scripts/detect.mjs --json <scan.targets joined by spaces>` once** (the bundled detector over local files: no network, no npx; it reads HTML/CSS, so skip it for native projects). `scan.via` tells you what they are: `git-changes` (the markup/style files in your dirty tree, the most relevant set), `source-dir` (e.g. `src`, `app`), `html`, or `root`. Fold the hits into your picks: many quality / contrast hits → `audit` or `polish`; a specific slop family → the matching command (gradient text or eyebrows → `quieter` / `typeset`, flat or gray palette → `colorize`, and so on). It's a real, current signal that beats guessing. If detect errors or the tree is large and slow, skip it and recommend the user run `audit` themselves; never block the suggestion on it.
|
|
17
|
+
|
|
18
|
+
Keep it to 2-3 pointed picks with the exact command to type. The menu stays the fallback; the recommendation is the lede.
|