Derive a Gecko-compatible manifest at build time and package
extension-firefox.zip alongside the Chrome zip:
- background service worker is declared as an event-page `scripts`
entry (top-level listeners + in-memory Map run unchanged on Gecko)
- browser_specific_settings.gecko with id, strict_min_version 140.0,
and data_collection_permissions (required by AMO; honored on 140+)
- packZip helper parameterized over cwd/excludes; `*.DS_Store` strips
junk at every depth and .DS_Store is excluded from the staging copy
- guard against a missing background.service_worker shape
CI now builds the extension and runs a pinned `web-ext@8 lint` over
the staged Firefox tree (innerHTML warnings are non-blocking); the
unpacked staging dir is excluded from the uploaded artifact. The
release script attaches both zips and points to AMO.
Bumps the extension to v1.2.0 with a changelog entry.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Paul Bakaus <paul.bakaus@gmail.com>
Mirrors the 5 prose changes in skill/SKILL.src.md + skill/reference/brand.md
out to every harness directory (`.claude`, `.gemini`, `.cursor`, `.codex`,
`.agents`, etc.) so the staged skill that workers / agents read matches the
source. Auto-generated by `bun run build:skills`.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>