Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
bf4d0ed
Extend document seed mode to gather brand assets first.
abdulwahabone Jul 14, 2026
d6aa989
Add editor voice and capability-gated visual cues to document seed.
abdulwahabone Jul 14, 2026
f48de70
Recognize the seed-collected image key in shape and craft.
abdulwahabone Jul 14, 2026
50663af
Revert "Recognize the seed-collected image key in shape and craft."
abdulwahabone Jul 14, 2026
475b0e6
Generate visual cues for document seed color picks
abdulwahabone Jul 14, 2026
0e91463
Compose cue palettes with six competing persona subagents
abdulwahabone Jul 15, 2026
562fa6b
Unify studio flow on wave numbering
abdulwahabone Jul 15, 2026
936f6c3
Replace peer critique with a similarity convergence loop
abdulwahabone Jul 15, 2026
d06ad0c
Revert "Replace peer critique with a similarity convergence loop"
abdulwahabone Jul 15, 2026
a3da97a
Split the studio into a palette chain and an image wave
abdulwahabone Jul 15, 2026
ffbc2fb
Assign territories upfront and run the studio as one wave
abdulwahabone Jul 15, 2026
47e0e7d
Harden the parallel mandate and keep six cues on the serial path
abdulwahabone Jul 15, 2026
b51524f
Give every territory a hue ground and gate image gen on self-critique
abdulwahabone Jul 15, 2026
dbf3d96
Fix: em dashes in the territory example set
abdulwahabone Jul 15, 2026
be28c27
Stage hero palettes as large color fields, framed close
abdulwahabone Jul 15, 2026
5d6c735
Fix cross-subagent image collisions on shared output filenames
abdulwahabone Jul 15, 2026
149817e
Matte transparent artifacts from two sheet passes; require square, we…
abdulwahabone Jul 15, 2026
a8d8327
Switch artifact sheets to per-cue chroma keys kept in crops
abdulwahabone Jul 15, 2026
2ab637e
update
abdulwahabone Jul 15, 2026
4235348
Drop artifact sheets from visual cues for faster hero-only pipeline.
abdulwahabone Jul 16, 2026
d1409b4
Speed up visual cues wave: drop smoke test, slim spawns, brief-only r…
abdulwahabone Jul 16, 2026
84cf4e0
Add provider-flexible image API path and dedupe visual cue compiles.
abdulwahabone Jul 16, 2026
6364dc3
Improve visual cue heroes for color real estate and Gemini safety.
abdulwahabone Jul 16, 2026
020a5fe
Default the gemini provider to Nano Banana Pro.
abdulwahabone Jul 16, 2026
5962548
Revert "Default the gemini provider to Nano Banana Pro."
abdulwahabone Jul 16, 2026
831065b
Add browser questionnaire foundation
abdulwahabone Jul 16, 2026
1db2541
Add screen 02 palette picker: cue deck, sampling rings, band tools
abdulwahabone Jul 23, 2026
ae27b9b
Reconcile questionnaire branch with main's site split and redesign
abdulwahabone Jul 23, 2026
1097dfb
Improve palette preview: dual artboard, drop register wiring.
abdulwahabone Jul 23, 2026
f227b40
Add color strategy screen and font-pair pipeline step.
abdulwahabone Jul 23, 2026
3c4203c
Rework typography screen to match the questionnaire pattern.
abdulwahabone Jul 23, 2026
a8f39e7
Restyle font pair cards after fonttrio's pairing anatomy.
abdulwahabone Jul 23, 2026
a33c3a7
update
abdulwahabone Jul 24, 2026
39b38c3
Improve strategy preview wireframes on desktop and phone.
abdulwahabone Jul 24, 2026
7879933
update
abdulwahabone Jul 24, 2026
e3dfe7f
update
abdulwahabone Jul 24, 2026
0939be8
update
abdulwahabone Jul 24, 2026
1a60652
update
abdulwahabone Jul 25, 2026
976fe06
update
abdulwahabone Jul 25, 2026
77c74a4
update
abdulwahabone Jul 25, 2026
b459fbb
update
abdulwahabone Jul 25, 2026
628d445
Update
abdulwahabone Jul 25, 2026
c2f1c53
Update
abdulwahabone Jul 25, 2026
9512355
update
abdulwahabone Jul 25, 2026
23b4673
Update
abdulwahabone Jul 26, 2026
cbede94
Update
abdulwahabone Jul 26, 2026
0d3eead
update
abdulwahabone Jul 26, 2026
372fd27
udpate
abdulwahabone Jul 26, 2026
da5eb6e
update
abdulwahabone Jul 26, 2026
f1495ca
update
abdulwahabone Jul 26, 2026
2e6ef84
update
abdulwahabone Jul 26, 2026
7aa7bfd
update
abdulwahabone Jul 27, 2026
5231d0a
update
abdulwahabone Jul 27, 2026
1dabd72
update
abdulwahabone Jul 27, 2026
fa50c25
update
abdulwahabone Jul 29, 2026
dd499ef
update
abdulwahabone Jul 29, 2026
c748a8e
update
abdulwahabone Jul 29, 2026
e8fe398
update
abdulwahabone Jul 29, 2026
fce78f9
update
abdulwahabone Jul 29, 2026
e7fb208
update
abdulwahabone Jul 29, 2026
3c10366
update
abdulwahabone Jul 30, 2026
09ea436
Add design doc
abdulwahabone Jul 9, 2026
cfaf63e
Add standalone design context prototype and WHAT spec.
abdulwahabone Jul 9, 2026
478f565
update
abdulwahabone Jul 30, 2026
8efee37
update
abdulwahabone Jul 31, 2026
dc19781
update
abdulwahabone Jul 31, 2026
9905264
update
abdulwahabone Jul 31, 2026
a8e5ab3
Improve font pair and color strategy questionnaire screens
abdulwahabone Jul 31, 2026
965e10f
Fix uneven gallery squares and size the phone section copy
abdulwahabone Jul 31, 2026
2fad24e
Add the layout screen's portfolio board and default color to full pal…
abdulwahabone Aug 3, 2026
a7707ef
Default the color question to full palette and color the type boards
abdulwahabone Aug 3, 2026
d4eed5f
Build out the layout screen's three compositions
abdulwahabone Aug 7, 2026
54b979a
Warn on screen 02 when the palette neutral fails contrast
abdulwahabone Aug 7, 2026
7b5dbea
Add configure hub after the font pair screen.
abdulwahabone Aug 7, 2026
1204459
Refine configure hub cards with pills, notes, and layout polish.
abdulwahabone Aug 7, 2026
39b591c
Tighten configure hub pill sizing.
abdulwahabone Aug 10, 2026
fedd934
Move type scale and layout ahead of the five-card hub.
abdulwahabone Aug 10, 2026
0c1f0f0
Mute design-context tile accents at rest like Color.
abdulwahabone Aug 10, 2026
94ec804
Improve picker finish screen, neutral contrast alert, and DCX tile re…
abdulwahabone Aug 10, 2026
4520ee9
Add strategy-band contrast alert and expand design context fields.
abdulwahabone Aug 10, 2026
0f3dd83
update
abdulwahabone Aug 11, 2026
2b5d40e
Track questionnaire previews gallery and color strategy experiments.
abdulwahabone Aug 11, 2026
bfd56b4
Number questionnaire preview gallery cells 1 through 75.
abdulwahabone Aug 11, 2026
500bea7
Improve strategy previews for Docs wireframe weight and App UI color …
abdulwahabone Aug 11, 2026
6fb3227
Scale Docs board carry bars and fix Portfolio preview cells 19–21.
abdulwahabone Aug 11, 2026
ab6789f
Fix font-pair preview polish for cells 22–24 and sync gallery experim…
abdulwahabone Aug 11, 2026
dd7fe54
Polish Portfolio type-board captions for font-pair preview cells 19–20.
abdulwahabone Aug 11, 2026
aa9f9f8
Enrich design context Product, Brand, and Color sections.
abdulwahabone Aug 12, 2026
6fabe10
Restore dry-run guard around the release build step
abdulwahabone Aug 12, 2026
77764f1
Recommend the seed questionnaire before rolling a direction on world-…
abdulwahabone Aug 13, 2026
ebedcee
Require verbatim skip quote for seed pause and fix hidden doc shell.
abdulwahabone Aug 13, 2026
8318311
Constrain dealt font pairs to Latin-script faces and English copy.
abdulwahabone Aug 13, 2026
d973f7f
Dedupe the seed interview against the browser questionnaire.
abdulwahabone Aug 13, 2026
c917ab5
Launch the picker in the harness browser first.
abdulwahabone Aug 13, 2026
88c204d
Scope the comp's authority and bind builds to the recorded world.
abdulwahabone Aug 13, 2026
1ffef92
Regenerate bun.lock after rebase onto main
abdulwahabone Aug 14, 2026
42e7704
Make the questionnaire ask_instruction sites sentence-initial
abdulwahabone Aug 14, 2026
5dafe83
update
abdulwahabone Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ Thumbs.db
.impeccable/live/deferred-svelte-component-accepts.json
.impeccable/history/
.impeccable/config.local.json
# API keys for optional image-generation cues (document seed mode).
.impeccable/.env
# Generated visual-cue images + cues.json (document seed Step 4).
.impeccable/visual-cues/
**/.impeccable/hook.pending.json
.impeccable/provider-smoke/
src/__impeccable_provider_smoke_*.html
Expand Down Expand Up @@ -119,7 +123,8 @@ talks/
.astro/

# Local-only scratch for exploratory scripts, parked pages, and unused asset candidates.
tmp/
tmp/*
!tmp/questionaire/

# Isolated ablation staging (impeccable-evals copies the built staged skill here
# per rule, removes one rule, points a worker at it). Throwaway; never committed.
Expand All @@ -129,3 +134,12 @@ tmp/
# PNGs, the old card backup). The canonical generator is `bun run og-image`
# (scripts/generate-og-image.js); this dir is throwaway and safe to delete.
.og-build/

# Working plans for agent-executed features (browser questionnaire etc.).
# Local planning scratch between the planning agent and executing agents.
plan/

# Intermediate and generated output for the picker build. Release builds sync
# the generated picker into the tracked provider harness directories.
build-picker/
skill/scripts/picker/
29 changes: 28 additions & 1 deletion .impeccable/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"ignoreFiles": [
"tests/fixtures/**",
"tests/framework-fixtures/**",
"tests/detect-antipatterns.test.js"
"tests/detect-antipatterns.test.js",
"picker/styles/design-context.css"
],
"ignoreValues": [
{
Expand All @@ -15,6 +16,32 @@
],
"createdAt": "2026-07-17T00:00:00.000Z",
"reason": "Live overlay chrome is injected over arbitrary host pages and builds a self-contained UI with its own small type scale; DESIGN.md's ramp describes the impeccable website, not this widget"
},
{
"rule": "broken-image",
"value": "*",
"files": [
"picker/pages/index.astro"
],
"createdAt": "2026-07-23T14:51:18.241Z"
},
{
"rule": "design-system-font-size",
"value": "*",
"files": [
"picker/styles/picker.css"
],
"createdAt": "2026-07-23T21:00:00.000Z",
"reason": "The picker is a self-contained questionnaire widget with its own kit-token type scale, and screen 04's cards render arbitrary Google Fonts at specimen sizes; DESIGN.md's ramp describes the impeccable website, not this tool (same footing as the live-browser.js entry)"
},
{
"rule": "design-system-font",
"value": "*",
"files": [
"picker/scripts/design-context.js"
],
"createdAt": "2026-07-30T13:11:54.730Z",
"reason": "Runtime font loader: builds a Google Fonts URL from the family the agent/user chose in the questionnaire; no literal face is being introduced"
}
]
},
Expand Down
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ TDD order is non-negotiable:
5. Add two adapters that wrap the pure check: `checkElementXxxDOM(el)` for the browser (`getComputedStyle` + `getBoundingClientRect`) and `checkElementXxx(el, tag, window)` for jsdom (`parseFloat(style.width)` instead of layout). Wire **both** adapters into **both** element loops in `cli/engine/detect-antipatterns.mjs` (browser loop ~line 1837, jsdom loop in `detectHtml` ~line 2058). Forgetting one is the most common mistake.
6. Verify on a live page at `http://localhost:4321/fixtures/antipatterns/{rule-id}.html` and on the homepage. The two adapter paths can disagree.

To scan the browser questionnaire, use `node cli/bin/cli.js detect skill/scripts/picker/` after `bun run build:picker`. Name the directory, never `index.html` on its own: the page links its stylesheet, so a page-only scan reads none of the picker's CSS. The baseline and the reason each accepted finding stands are in CLAUDE.md's **Picker anti-pattern gate**.

Conventions: wrap the identifying heading text in straight double quotes inside snippets so the fixture test can extract it. jsdom-specific helpers `resolveBackground()`, `resolveGradientStops()`, and `parseGradientColors()` exist because `background:` shorthand isn't decomposed and computed colors aren't normalized in jsdom — use them. Reference rules to copy from: `side-tab` (border), `low-contrast` (color+gradient), `icon-tile-stack` (sibling relationship), `flat-type-hierarchy` (page-level).

## Commit & Pull Request Guidelines
Expand Down
25 changes: 25 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,31 @@ bun run build:browser

**IMPORTANT**: Always use `node` (not `bun`) to run the detect CLI. Bun's jsdom implementation is extremely slow and will cause scans with HTML files to hang for minutes.

### Picker anti-pattern gate

After `bun run build:picker`, scan the **built directory**:

```bash
node cli/bin/cli.js detect skill/scripts/picker/
```

**Name the directory, not `index.html`.** The built page only links its stylesheet and its script, and the rules that read CSS or JS text run per file, so scanning the page alone never reads a line of either. That is how three `design-system-color` findings vanished with nothing fixed: the mode-tile demo palette moved out of an inline `style` attribute and into `picker.css`, and the gate went quiet while the values stayed put. Naming a bundle by path is not a fix either, because Vite content-hashes the filenames and a stale path silently narrows the scan back to the page.

Baseline: **54 findings**, 29 on `index.html`, 24 on the bundled stylesheet, and 1 on the bundled script. The groups below are accepted with a reason on record, so hold 54 rather than treating it as a backlog:

- 18 `cramped-padding` on the palette strips, nine for each of the two: the editable one on screen 02 and the reading copy under screen 03's choices. Each strip reports its group, its four items, and its four swatches. A swatch is a color that has to reach its own edges, so `.picker-band` carries no padding and places its hex readout and drag grip by inset instead, which the rule has no way to see. Adding padding here would put a frame around every color the visitor picked.
- 3 `design-system-color` for the mode-tile demo palette (`#195856`, `#5f7c7a`, `#3a958b`). They are examples standing in for the palette the visitor is about to pick, which is the carve-out DESIGN.md's OKLCH-Only Rule already names. The argument is at the declaration in `picker/styles/picker.css`; read it before touching them.
- 8 `design-system-font-size` from `picker/styles/picker.css`, seven of them already waived there in `.impeccable/config.json`. They reappear under the built path only because that waiver is scoped to the source path. The eighth is `1.05rem` on `.picker-finish-lede`, the review copy on the last screen, which sits on the questionnaire's own kit-token ramp for the same reason the other seven do.
- 2 `border-accent-on-rounded` on `.ks-bento` in the vendored `kinpaku-kit.css`, which carries no `border-radius` at all. The rule wants a radius on the same line, and minification puts the whole stylesheet on one line, so every line-scoped regex rule reads this bundle with no line context. Check a snippet against the source before acting on it.
- 13 from the design context document, the review UI the picker hands off to after the last question. Eleven are `picker/styles/design-context.css`: 5 `design-system-font-size` and 1 `design-system-radius` (`22px`) for the ported prototype's own type ramp and shape vocabulary, 2 `design-system-color` (`#7ba98f`, `#c26d5a`) for the tray status dots, 2 `design-system-font` naming the two faces the document sets itself in, and 1 `layout-transition` on the tile expander, which animates `width` and `height` because the tile morphing into a panel is the geometry it is animating. One is `picker/scripts/design-context.js`, whose Google Fonts URL is built from whichever family the run chose, so the rule sees a template where it wants a declared face. The last is `all-caps-body` on the doc masthead's mono note. The user locked that UI; both files carry a waiver in `.impeccable/config.json` saying so, and like the picker.css group those waivers are source-scoped, so the values resurface under the built path.
- 1 `undersized-ui-text` on the `Change` legend in the document's request-scope control, at 10.88px. Same slot and same argument as the micro-labels below.

The last 9 are the page findings the questionnaire has carried since those screens were built: 3 `cramped-padding` on the option panel and the icon sheet, both edge-to-edge grids whose rows hold their own padding, and 6 mono readouts and micro-labels under the text-size and tracking floors. They are the group to revisit first if the number is ever worth lowering.

**When the number moves, find out which file moved it before editing this section.** The baseline read 39 until the design context document landed, and all 15 findings that arrived with it are named above: 13 in its own two files, plus the finish-screen lede and the `Change` legend that ship in the picker's files but belong to that feature. The five other workstreams in the same batch added none. Building the tree at the previous commit in a `git worktree` and scanning both builds is how that was established, and it beats reasoning about which change is responsible.

For line numbers during triage, `node cli/bin/cli.js detect picker/styles/` scans the unminified sources. It is not the gate: the source scan's style-context heuristic skips custom-property declarations, so it misses the palette entirely. A served URL is worse than either, because the browser pass only measures the screen in front of it and the picker hides all but the active one.

## Versioning

**Feature PRs do not bump versions and do not add changelog entries.** Bumping is a release step, not part of the change that earns the release: a version in a feature branch conflicts with every other open branch, and a changelog entry describes a release that has not happened. Land the code first; the maintainer bumps and writes the changelog when cutting the release. This holds even though the "Bump when: ..." notes below name the source dirs — those say *which* component a change belongs to, not *when* to edit the manifest. The only PR that touches a manifest version is one whose purpose is the release itself.
Expand Down
18 changes: 18 additions & 0 deletions NOTICE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,21 @@ The `skill/reference/ios.md` and `skill/reference/android.md` platform reference
**Original work:** https://github.com/ehmo/platform-design-skills
**Original license:** MIT
**Author:** ehmo

## Icon specimens in the design picker

`picker/data/icon-packs.json`, and the copy of it built into `skill/scripts/picker/`, holds twenty-four glyphs from each of the icon families the picker offers, redistributed unmodified apart from the removal of attributes the specimen does not draw with. They are shown so a user can compare the families and choose one; the choice, not this file, is what a project then installs. `scripts/vendor-icons.mjs` records the exact version each set was taken from.

| Set | License | Source |
|---|---|---|
| Lucide | ISC | https://github.com/lucide-icons/lucide |
| Feather | MIT | https://github.com/feathericons/feather |
| Phosphor | MIT | https://github.com/phosphor-icons/core |
| Heroicons | MIT | https://github.com/tailwindlabs/heroicons |
| Tabler | MIT | https://github.com/tabler/tabler-icons |
| Radix Icons | MIT | https://github.com/radix-ui/icons |
| Bootstrap Icons | MIT | https://github.com/twbs/icons |
| Iconoir | MIT | https://github.com/iconoir-icons/iconoir |
| Octicons | MIT | https://github.com/primer/octicons |
| Hugeicons (free core) | MIT | https://github.com/hugeicons/hugeicons-react |
| Remix Icon | Apache-2.0 | https://github.com/Remix-Design/RemixIcon |
Binary file added assets/mode-illustrations/experience-final.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/mode-illustrations/operate-final.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/mode-illustrations/read-final.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading