Phase-2 ablation audit caught these rules causing the exact behavior they
ban via the literal examples in their own prose. Verified: OpenAI samples
under skill-on produced "fake theater", "vendor theater", "heatmap theater"
as verbatim copies of the 'X theater' example. Same pattern for the
restrained-on-cream example, the aphoristic-cadence template, and the
"reserve uppercase for…" enumeration.
- skill-ban-codex-x-theater: drop the 3 syntactic templates + 3 example
phrases ("Productivity theater" etc.)
- brand-imagery-required: drop the niche enumeration that cued
"imagery not required elsewhere"
- skill-typo-no-all-caps-body: drop the "Reserve uppercase for labels /
eyebrows / badges" enumeration that primed uppercase usage
- brand-color-no-converge: drop the "restrained-on-cream" example that
was priming cream-heavy palettes
- skill-copy-no-aphoristic-cadence: drop the literal cadence template
("serious statement, then punchy short negation") that named the
rhythm it bans
Ablation re-run pending in impeccable-evals to measure impact.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Improve CI test coverage
* Stabilize live E2E harness
* Shard live E2E CI
* Cache live E2E CI dependencies
* Stabilize live E2E smoke CI
* Update generated live browser bundles
* Tighten live E2E smoke runtime
* Prevent live E2E smoke hangs
* Stabilize live E2E CI coverage
* Fix stale accept DOM cleanup
* Regenerate live browser outputs
The verbs/labels/icons were copied three ways: live-browser.js (ICONS + ACTIONS),
VISUAL_ACTIONS in live-event-validation.mjs, and the marketing demo. Collapse
them to one source, skill/scripts/live-vocabulary.mjs (LIVE_COMMANDS + derived
VISUAL_ACTIONS).
- live-event-validation.mjs imports VISUAL_ACTIONS from it.
- live-server.mjs serializes LIVE_COMMANDS into window.__IMPECCABLE_VOCAB__ when
it serves /live.js, next to the token/port. live-browser.js (served raw, can't
import at runtime) builds its ICONS + ACTIONS from that injected vocab instead
of an inline copy — byte-identical icons, zero behaviour change.
- site/components/LiveDemoPalette.astro imports the same module at build time, so
the demo and the real picker can no longer drift.
Adds a /live.js test asserting the injected vocab deep-equals the canonical list.
Harness skill dirs refreshed via build. (Pre-existing, unrelated: `bun run
build:site` fails on an htmlparser2 import in the CLI detector.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rewrite the hero around the why (the missing design vocabulary) instead of the
live-mode how: "The missing design vocabulary for agents." The live demo now
opens the picker's command palette and picks a verb before generating, which is
the move that makes the live approach unique and was previously skipped.
- Demo palette mirrors the real action picker (live-browser.js): same 12 verbs,
the same SVG icons, a 4-col icon-over-label grid, selected chip on a kinpaku
wash with its icon recolored. Light + dark covered.
- Shared <LiveDemoPalette> component renders the grid from one list, so the hero
and /live-mode no longer hand-copy the markup. /live-mode lands on "delight",
the hero on "colorize" (via data-demo-pick); pages without a palette filter the
switcher beats out of the shared timeline.
- Trim the opening beats so the cursor clicks the element at ~1.3s (was ~2s), and
slow the palette browse so the vocabulary is readable.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The changelog + FAQ pages share changelog-faq-kinpaku.css, which paints its
card/panel/pill backgrounds with literal dark oklch(8% …) values that don't
flip with the theme. The only light override was dead twice over: scoped to a
.changelog-faq-kinpaku wrapper that's never on the body (these pages use
.kinpaku-surface), and naming the wrong elements (.faq-item/.changelog-entry
instead of the cf-prefixed classes). So the cards stayed near-black on the
light page.
Replace that dead block with correct html.light .cf-* rules: flip the card
surfaces (cf-entry, cf-stats, cf-faq-item, cf-entry--current), the before/after
frame + before tag (cf-ba-shot, cf-ba-tag--before) to the shared light card
treatment, and drop the bright-kinpaku accents (cf-version, cf-stat-num,
cf-current-badge, cf-ba-tag--after, cf-faq-question) to --ks-kinpaku-ink so
they stay legible on paper, matching the .cf-eyebrow. Answer-body tokens
already flip, so they're untouched. Dark mode unaffected.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Each command section now reads in its own category accent (--spread-accent)
across the palette: the kicker, the skill name (big title + active list
item), and the divider all take it, while the slash before /impeccable
drops to the muted namespace ink. The per-section divider accents are also
made vibrant — refine/simplify/harden were muddy kinpaku-pale/-deep/oxide;
now create/refine/simplify = kinpaku gold, evaluate/harden = patina
verdigris, system = neutral, matching the established category color
grouping. Light mode re-applies the accents over the shared eyebrow :is()
rule; dark mode picks them up from the base rules.
Also includes light-mode readability fixes for the live-demo G-bar (brand
mark, active tool chip, control chips, pin-note text/caret) and a
specificity fix so the hotel-hero demo text stays light on its photo.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Default is "auto", which inherits from the OS via prefers-color-scheme
and follows it live. Clicking cycles auto → light → dark → auto; the
explicit choice persists in localStorage while auto stores nothing.
The toggle shows the active preference (half-circle / sun / moon) keyed
on a new data-theme-pref attribute, so "auto" is its own visible state
rather than collapsing into whatever the OS resolved to.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The palette's title, active command, and category kicker rendered in the
muddy kinpaku-ink in light mode (the shared eyebrow rule swaps pristine
kinpaku for kinpaku-ink for legibility on warm paper). But the palette
sits on a near-white card, where pristine kinpaku reads fine — and it now
matches the already-pristine slashes and the PALETTE toggle.
Scope the override under .magazine-container so it only affects the
palette and clears the eyebrow rule's :is() specificity (inflated to 4
classes by its .fisheye-item.is-active argument). Other eyebrows keep
kinpaku-ink for paper legibility; dark mode is unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The dark periodic table hardcodes a black stage and near-black tiles
with !important, and the only light override targeted .ptable-cell — a
class the component never emits (it renders .ptable-element). So in light
mode the tiles stayed black while the symbol/name text flipped to dark
ink: black on black, unreadable.
Add a proper light block (with !important to beat the dark rules): a soft
light stage, raised near-white tiles with neutral hairline borders and a
subtle shadow, and a darker hover border. Symbol/name colors and the
category labels already re-theme to dark inks, so they read cleanly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
app.js fetches /_data/api/commands.json and patterns.json, but those are
build artifacts written into site/public/_data/ by scripts/build.js. The
plain `astro dev` server never runs that build, so the homepage 404'd on
both in dev.
Extract generateApiData into scripts/lib/api-data.js (shared by the build
and a new scripts/gen-dev-api.mjs prebuild), and run the prebuild before
astro dev so `bun run dev` serves the same payloads as production.
site/public/_data/ stays gitignored.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
After the border audit reassigned every usage to --ks-kinpaku or
--ks-rule, the muddy gold token is dead. Delete its dark and light
definitions and update the comments that described it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Audit every --ks-rule-strong usage (the muddy desaturated gold). Where
the border/text sits beside pristine kinpaku or signals an active/hover/
brand state, lift it to --ks-kinpaku; where it's a large structural
frame, window chrome, or paired with neutral siblings, drop it to the
neutral --ks-rule hairline.
Lifted to --ks-kinpaku: detector focus ring + secondary action buttons,
design-system candidate caption + mini-ui "after" border, docs neon-case
secondary/hero-shot-hover, docs flow/chain arrows, homepage slop-teaser
hover + impeccable-card.
Dropped to --ks-rule: design-system comparison-stage frame, docs
neon-case-command frame, light-mode hero demo shell + split-label pill +
live-demo pin-note.
--ks-rule-strong is now unused outside its token definition.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The favicon was hardcoded to a muddy #d8a83a, duller than the header
logo's pristine kinpaku. Switch fill by OS theme via an embedded
prefers-color-scheme media query: near-black in light, pristine kinpaku
(#ffb900, matching --ks-kinpaku) in dark.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On wide viewports the hero's bright kintsugi seam sits under the
top-right nav cluster, where dark light-mode text and the toggle/GitHub
chips fight the gold. Add a contextual, light-only radial scrim anchored
to the corner: it feathers out by 70% (no hard edge), is faded via --hp
the moment the header glasses in on scroll, and is off below the mobile
drawer breakpoint. Dark mode needs no treatment (cream text reads fine
over the darker seam).
With the scrim carrying the corner, the toggle and GitHub counter become
refined hairline chips in light mode — neutral --ks-rule border, no fill
(the GitHub pill previously used the gold --ks-rule-strong and a solid
background).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Fix live preview state for framework components
* Complete stateful live preview coverage
* Record Svelte manual validation
* Fix Svelte live mode adapter
* Fix live Steer apply flow
* Fix Svelte live variant refresh recovery
* Fix live exit bar teardown
* Consolidate Svelte live DeepSeek sweep
* Reconcile Svelte live browser after main rebase
* Fix live accept review regressions
* Fix carbonize column-zero indentation
* Fix live poll lease expiry flake
* Fix Svelte shader preview capture
* Fix GitHub Copilot site mentions
* Fix mobile command blocks
* Fix mobile nav drawer centering
* Align mobile nav controls
* Align mobile nav controls
* Pad mobile nav drawer
* Fix light mobile nav drawer
* Remove light drawer active border
* Restore light drawer active underline
* Fix designing mobile layout
* Tune designing mobile loop
* Fix designing mobile section gutters
* Keep polish commands on one mobile row
* Fix designing mobile bento gutters
The `i-` prefix install option was a holdover from the multi-skill era.
With a single `impeccable` skill it only ever renamed that one skill to
`i-impeccable`, while the install message wrongly advertised `/i-audit`
style commands that never existed, and the unscoped rename could clobber
unrelated third-party skills in the same harness folder.
- Drop `--prefix=`, the interactive prompt, and all prefix machinery
(renameSkillsWithPrefix, prefixSkillContent, detectPrefix, undoPrefix,
prefixedCommandHint, isImpeccableSkillName).
- Add migrateUnprefixImpeccable: install --force and update rename any old
`<prefix>impeccable` back to canonical `impeccable` before the fresh copy
lands, scoped by name so foreign `i-*` skills are left untouched.
- Fix FAQ + editorial that wrongly described pinned commands as `i-`
prefixed (pins are bare `skills/<command>/` dirs).
- Tests now exercise the real exported migration, not a reimplementation.
- CLI 2.3.1 -> 2.3.2 with a changelog entry.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The lockup read a touch heavy. Drop the brand wordmark to 400 across the
header, footer, and the .ks-wordmark kit primitive so it stays consistent
everywhere. Alumni Sans was only loaded at 500/600/700, so 400 is added to
the font request (otherwise it would snap back to 500). DESIGN.md synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Closes the documentation gap from #177: how to update an installed
version was nowhere on the site. Install and Update now sit as paired,
equally-visible commands, with `npx impeccable skills check` and the
Claude Code `/plugin` path called out alongside.
Also a full pass on the section's composition:
- Commit to left-aligned asymmetry so content has one spine and the gold
seam owns the right edge, instead of floating left-of-center
- Make the install command pop: bright kinpaku frame + gold `$` prompt +
left-aligned mono so it reads as a runnable line, not a decorative chip.
Update box mirrors it one notch quieter in patina (the "updated" state)
- Group install/update/alternatives tightly, rule off the secondary
surfaces, drop the duplicate "Get started:" closing label
- Repurpose the "Stay updated" cell to "Follow along" so it stops
colliding with the real Update command
FAQ already had a strong #update entry; added the `skills check`
companion for parity. Getting-started tutorial gains a short update note
after Step 1. Both themes synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(home): command-wheel contrast, slop copy, line-length
Address P1/P2/P3 findings from /impeccable critique of the homepage:
- Command wheel (The Language): off-center command names floored at
~1.43:1 contrast were illegible (WCAG 1.4.3 fail) and hid most of the
23-command vocabulary. Raise the fisheye opacity floor 0.25 -> 0.62,
MIN_SCALE 0.35 -> 0.52, and lift the base color from --ks-text-muted to
--ks-text. Off-center now measures >=4.59:1; full list stays scannable
while gold + size + weight still carry focus.
- Slop section copy: rewrite all 7 discipline cards off the uniform
"No X. No Y. No Z." triad into varied cadence with positives, and lead
the section with what Impeccable does instead of the "Skills can't..."
negation pivot. Drops the en-dash joiners too.
- Line length: cap .downloads-rebuild-note (was unbounded, ~102ch) and
tighten the homepage .section-lead 68ch -> 62ch (rendered ~86 actual
chars/line).
The diagonal plinth ramp on the slop grid is intentionally kept per
design preference.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(home): de-warm and brighten the text ramp
Warmth now lives only in the gold accents and surfaces, not the type.
Body, headings, and the secondary tiers read crisp on lacquer instead of
mushing into the warm floor:
- --ks-champagne 84% .035 82 -> 91% .006 90 (headings/strong, now neutral;
token name kept for compatibility)
- --ks-text 81% .03 82 -> 88% .008 90 (body)
- --ks-text-muted / -faint / -mute-deep lifted and de-warmed to match
DESIGN.md frontmatter + prose synced to the new values.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(home): outlined testimonials + cleaner hero boundary
Testimonials:
- Flatten the double container: drop the t-plinth shelf wrapper (markup +
CSS); the marquee sits directly in the section and carries its inset.
- Outlined cards: no fill, 1px solid neutral border (oklch .64 0 0 / .22),
no dead drop-shadow. Removes the mushy gray-on-gray blend and the stacked
dotted-divider + gold-hairline chrome.
- Section has no background of its own (rides the body lacquer gradient) and
no top padding, so cards sit right under the hero divider.
Hero:
- Drop the bottom fade and the top nav scrim; the kintsugi art runs at full
strength. A 1px neutral border-bottom (matching the card border) marks the
testimonials boundary instead of a wash.
- "How it works" is the kit ghost link (white), not an outlined button.
Foundation/slop cards: lift the surface 9% -> 15% so they read as raised
specimen cards instead of vanishing into the ground.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(live): quieter, more refined picker chrome
Gold is reserved for the brand mark and the active control instead of
ringing every container. Applied to the homepage demo, /live-mode, and the
real injected picker (skill/scripts/live-browser.js, rebuilt into the
harness dirs):
- Container: neutral 1px hairline + tight neutral shadow (was a 1.5px gold
border + gold halo ring); radius 10px -> 8px.
- Active toggle: crisp graphite pill with gold text (was a murky kinpaku-dim
wash).
- Internal control borders (action pill / input / count): neutral hairline
(was a warm gold rule); configure-row controls share one 30px baseline.
- Pick outline: crisp 1.5px line, no soft gold glow ring; tighter radius.
- Demo browser chrome: small uniform neutral dots, neutral URL pill, slimmer
bar; frame edge neutral hairline + tighter shadow that registers on dark.
DESIGN.md "Live Mode Picker" spec + "Picker Is Brand Rule" updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(design): neutral default hairline (--ks-rule)
The default border/divider token was a warm gold hairline, used ~200x as
the site-wide default border — so every small label, pill, counter, card,
and divider carried warmth. Redefine it neutral so borders read clean;
gold stays where it signals.
- --ks-rule oklch(58% 0.065 82 / 0.32) -> oklch(78% 0 0 / 0.16)
- --ks-rule-strong (active/focus/brand borders) unchanged, still gold
- GitHub star pill: explicit near-white border (oklch 92% 0 0 / 0.18)
- DESIGN.md hairline mirror + prose synced
Verified across home, /design-system, and /docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(home): testimonials separator + visible star-pill border
- Move the dotted accent to the bottom of the testimonials (neutral dots)
as a deliberate separator into the slop section; drop the oversized
bottom padding to 1em so cards sit near the separator.
- Star-counter pill: solid oklch(80% 0 0) border. The previous near-white
at 0.32 alpha rendered as faded mid-gray on the near-black pill; a solid
light border reads as the intended white hairline.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(design): neutralize body text (--ks-text)
Drop the last bit of warm chroma from the body text token; it still read
slightly warm at 0.008 chroma.
--ks-text oklch(88% 0.008 90) -> oklch(88% 0 0) (pure neutral)
DESIGN.md mirror + prose synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(design): neutral text everywhere
Zero the residual warm chroma across the rest of the text ramp so no text
tier carries warmth (warmth lives only in gold accents + surfaces).
- --ks-champagne 91% .006 90 -> 91% 0 0
- --ks-text-muted 72% .01 90 -> 72% 0 0
- --ks-text-faint 62% .008 90 -> 62% 0 0
- --ks-text-mute-deep 52% .008 90 -> 52% 0 0
(--ks-text was already neutralized.) DESIGN.md mirror + prose synced.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(home): crisp, neutral Desloppification section
- Foundation card background: oklch(15% .004 95) -> oklch(15% 0 0) (neutral
graphite) so cards read crisp, not warm.
- Plinth hatch: kinpaku gold -> neutral (oklch 80% 0 0 / .07) on a neutral
base; the gold hatch was washing the section champagne.
- Remove the plinth bottom mask-fade so the pedestals end on a clean edge.
Gold stays only on the card icons as the accent.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(home): drop the homepage warm-token overrides
The homepage redefined --ks-rule, --ks-rule-strong, and --ks-muted to warm
values locally (an old "busier surfaces" tweak), so homepage borders and
secondary text stayed champagne even after the global de-warm. That's why
the Desloppification cards still read warm.
- Remove the --ks-rule / --ks-rule-strong overrides; inherit the global
tokens (neutral default border, gold strong/active border).
- Alias --ks-muted to the global --ks-text-muted (no divergent value);
legacy code still reads the --ks-muted name.
Result: all homepage borders + secondary text are neutral; gold stays on
accents (icons, mark, CTAs, active/focus).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(design): canonical code tokens (inline + block)
Code styling was all over the place: homepage inline code was gold-on-gold,
the slop CLI was a one-off gold-on-raised-lacquer, downloads used a separate
--card-cmd-* set, docs used yet another. Add one shared token set and point
the canonical surfaces at it.
New :root tokens:
- --ks-code-fg / --ks-code-bg / --ks-code-radius (inline: neutral chip)
- --ks-code-block-fg / -bg / -border / -radius (block/CLI: lacquer terminal)
- --ks-code-cmd (code that's a command link)
Migrated: homepage inline code (was gold -> neutral chip), slop-teaser-cli
(the "weird color" -> neutral terminal), downloads-cmd, and the docs inline +
fenced-block rules (now the token source of truth; block text also neutralized).
Remaining pages (designing, changelog/faq, detector, case studies) swept next.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(design): sweep remaining pages onto code tokens
Point the rest of the site's code rules at the shared code tokens so inline
code and blocks are consistent everywhere:
- Inline code (designing, changelog, faq): gold -> neutral chip
(--ks-code-fg / --ks-code-bg).
- Detector rule pills + table cells: code text -> --ks-code-fg.
- Neon-mirai case-study code block -> --ks-code-block-* tokens.
Command tags (the gold /command pills: spread-flow-cmd, docs-flow-cmd,
designing-phase-cmd, why-ci-cmd, etc.) are intentionally left as their own
interactive category, not generic code.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(home): polish "The Language" section
- Command tags (/polish, /adapt): gold command text on a neutral code chip
(--ks-code-cmd / --ks-code-bg), dropping the muddy gold-tint border.
- Commands panel kept as the solid oklch(0.17 0 0) panel (no border).
- Demo preview cleaned up to a single framed split: strip the grid ::before,
the gold-grid/radial-glow container background, and the inner drop-shadow;
before-half inherits the panel, after-half is near-black, with one thin
neutral border on the demo itself (caption sits outside it).
- Periodic table: crisp flat neutral graphite tiles. Removed the JS-inlined
category bg (var(--cat-*-bg)) + 1.5px colored border + hover drop-shadow,
the gold-leaf ::before texture, the ::after accent line, the inset box-shadow,
and the gold hover glow. Now a 1px neutral border, white symbols, readable
neutral names, and a clean neutral-border hover with no shadow.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(design): roomier inline-code padding
Inline code chips were tight top/bottom (the homepage one was only 0.05em).
Add a --ks-code-pad token (0.3em 0.5em) and point every inline-code rule at
it so the chips have consistent breathing room.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(home): drop non-steering commands from the command palette
impeccable, init, extract, document, and live are setup/management commands,
not steering verbs. Filter them out of the palette (fisheye + mobile carousel)
via a shared PALETTE_EXCLUDED set. They stay in the periodic table, which is
rendered separately by framework-viz.js.
Palette: 23 -> 18 commands.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): flatten the pre-ship nested box
The pre-ship cards were a box-in-box: a legacy .designing-polish-grid panel
(cream bg + L/R/B border + padding, from docs-visuals.css) wrapping cards that
already have their own border + fill. Override the grid to a plain transparent
layout so the three cards are the only surface.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): remove step counter + flatten design-debt boxes
- Drop the cryptic "03 · 04" pre-ship step counter (.designing-polish-band-meta)
and tighten the band to a single bottom hairline.
- Design-debt: flatten the box-in-box (bento plinth > tile > stage). The
.designing-maintain-stage no longer adds its own border + fill; the demo
sits directly in the bento tile.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): neutralize code/terminal/panel surfaces
The terminal block, surface-cmd chips, command pills, live-frame, and other
dark panels used a slightly-warm dark fill (oklch 1X% 0.006 95). Drop the warm
chroma so they read neutral like the rest of the de-warmed site; the page
ground + deep surfaces stay lacquer-warm.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): neutralize inline code + live-mock picker chrome
- Inline code: the phase-sub and avoid-title code were still gold; point them
at --ks-code-fg so all inline code reads neutral (gold stays only on command
*links*).
- docs-viz-live mock: bring the duplicated picker chrome in line with the
refactored neutral treatment — neutral 1px container borders (no gold halo),
neutral active "Pick" pill (was the kinpaku-dim wash), crisp pick outline
(no glow), tighter radii.
- CTAs (SEND ME ONE, Accept): pale-cream kinpaku-pale -> solid kinpaku gold.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): flatten lanes + avoid sections
- Brand/Product lane mock cards: drop the inner border+fill box; the mock sits
directly in the bento tile, separated by a top hairline (no plinth>tile>mock
nesting).
- "What to avoid" list: flatten the boxed list cards into a clean divided list
(hairline separators, no per-item border/fill).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): clean up the Brand/Product lanes
- Drop the bento plinth (0.17 fill + 8px gutter that drew the weird gutter
"borders") and the tile fill; the two lanes sit on the page split by a single
center hairline.
- Brand mock title used the pinstripe display face at 1.6rem (reads broken at
that size, the "champagne text"); switch it to the clean body face so it
matches the product mock title.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(site): update GitHub star count to 31k
31,188 stars as of now; header pill + aria-label were stale at 30k.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Add Neo Kinpaku light mode across the site.
Wire theme persistence and a header toggle, then layer light-mode overrides for docs viz contrast, command demos, live-mode pathway cards, and the designing/home surfaces.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(designing): replace em dashes flagged by prose validator
Brand/Product lane copy used em dashes ("the deliverable —", "the task —");
swap for colons per STYLE.md so the Cloudflare build's validateProse passes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(designing): address Cursor bugbot nits
- Fold the duplicate .designing-avoid { gap: 0 } override into the original
rule (the gap: 18px was dead code).
- Drop the leftover el.style.boxShadow = 'none' in the periodic-tile deactivate
handler — activate no longer sets a box-shadow, so this only left a dead
inline none that could suppress a future CSS shadow.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The .codex/agents sidecar + boot-time self-heal it described was reverted
in CLI v2.3.1 (nested in-skill agent is the whole delivery now), so the
bullet no longer matched shipped behavior. Removed from the changelog and
the skill-v3.5.0 GitHub release notes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codex auto-discovers subagents bundled inside an installed skill's own
agents/ folder, so the separate .codex/agents/*.toml sidecar was redundant.
- cli: remove installCodexAgents/isCodexLikely and their install/update calls
- context.mjs: remove the CODEX_AGENT_MISSING self-heal directive
- build: drop codex agentFormat so no top-level .codex/agents is emitted; the
nested in-skill .toml bundling is the whole delivery
- remove the tracked .codex/agents/*.toml and the gitignore exception
- docs + build.test.js updated for the nested layout
- CLI patch version bump; skill version unchanged
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(live): correct the generation shader's capture + halftone on dark and textured surfaces
The live-mode "ink-wash" loading shader rendered correctly on light
elements but broke on dark and textured ones. Root causes and fixes:
- Ground the halftone on the element's own background tone (new u_paper
uniform) instead of a fixed cream paper, so dark elements stop flashing
bright as the roller passes.
- Drive dot size by each cell's contrast from that ground, not absolute
darkness, so content (text, buttons) becomes the dots on light and dark
alike instead of inverting on dark elements.
- Cap the dot radius so a solid dark region stays separated dots rather
than flooding into a gold bar.
- Parse computed colors by rasterizing through a canvas, so oklch()/color()
tokens resolve instead of falling back to white.
- Two-stage dissolve (flatten to ground, then dots emerge) so the raw
element never bleeds through the band's soft core/trail.
- Carry the capture's alpha through the shader so rounded corners and
transparent regions show the live backdrop instead of rendering black.
- When an element is transparent up to the root but its backdrop comes from
an ancestor's image or a covering layer (e.g. a hero art div), capture
that ancestor and crop to the element. Fixes the homepage hero heading
capturing on white, and embeds the real backdrop in the model upload too.
The halftone ground is sampled from just outside the element so it tracks
the true backdrop rather than a muddy average of the content.
Adds /shader-lab, a standalone harness that runs the real capture + shader
pipeline against a matrix of background shapes (light, dark, gradient,
image, glass, rounded, and a homepage-hero replica) with raw vs
capture+shader side by side. The capture/shader code is copied from
live-browser.js and kept in sync.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(live): clear the cached color-parse canvas before each fill
Cursor Bugbot (PR #171): cssColorToRgb01 reuses a cached 2D context, so a
semi-transparent input (alpha 0<a<1, which isTransparentColor lets through)
blended source-over with the previous call's pixel, making the result depend
on call history. clearRect before the fill makes each call independent.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
#158 added the live-mode manual-edit subagent but did not commit the
.agents harness copy. Regenerated by bun run build; commit keeps the
tracked harness dirs in sync so the release script's clean-tree check passes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Pick an element, Edit copy in the browser, and on Apply a subagent
rewrites the real source the text renders from and repairs anything wired
to it. Folds into the v3.5.0 Live Mode bullet alongside the Steer bar.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>