Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Add a new color theme to pixtuoid (a full ~90-role palette across 9 groups, rendered into the office). Use when the user says 'add a <name> theme', 'new color scheme', or 'port <palette> to pixtuoid'. Orchestrates the Rust registration PLUS the two steps agents miss — the site manifest bridge test and the committed-media regen.
.claude/skills/ivanwng97-add-theme/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -36% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -32% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -12% | 0% |
A theme is a pub static Theme with ~90 color roles across 9 groups (surface, office, lighting, furniture, effects, ui, tool_glow, ApplianceColors for corridor appliances, and SourceColors for per-CLI dashboard badge hues). Every field must be supplied — corridor appliances render wrong until each theme provides its own set.
<name> theme" / "new color scheme" / "port <palette>".Full current steps: .github/prompts/add-theme.prompt.md + the theme notes in crates/pixtuoid/src/tui/CLAUDE.md. Read an existing theme (e.g. crates/pixtuoid-scene/src/theme/dracula.rs) for the full field set, then:
crates/pixtuoid-scene/src/theme/<name>.rs — fill EVERY field; neverfall back to the normal palette.
mod in theme/mod.rs, append &<NAME> to ALL_THEMES,theme_by_name() resolves the kebab-case name.
rule belongs to SPRITE PACKS (RECOLOR_KEYS B/H/S/P, enforced at pack load by validate_recolor_palette), not to themes. What binds a theme author are the per-theme legibility guards in theme/mod.rs: appliance_palette_is_legible_for_every_theme, source_badges_legible_for_every_theme, token_paper_is_legible_on_the_desk_for_every_theme, and sun_and_moon_read_warm_and_cool_for_every_theme.
site/src/themes.json row (id = the kebab-case name) —theme_gallery_manifest_matches_all_themes (theme/mod.rs) asserts the manifest ids == ALL_THEMES names, so the theme fails just test until the row exists. The site never runs the binary, so this bridge test is the only guard that the switcher stays in sync.
just gen-media — themes.json drives the committed theme stills; a newtheme drifts them, so regenerate and commit them or the smoke gen-check reds the PR (the same error the bridge test's message points at).
(Full step list + field details: add-theme.prompt.md + the tui CLAUDE.md theme notes — this skill headlines the two teeth steps agents miss.)
just test — appliance_palette_is_legible_for_every_theme + the snapshottests must pass; update insta snapshots if the theme list changed.
snapshot example and eyeball the office (seethe beautify-decoration skill); a palette that passes the legibility guard can still read badly.
just preflight, then the two-lens-review skill (a theme is public-facing —add the editorial/film-critic lens for the rendered stills).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | pass→pass | 8,797 | 2,264 | -74% | 1 | 1 | 0% | 1,320 | 1,187 | -10% | 0 | 0 | — |
case-24 | pass→fail | 12,726 | 4,482 | -65% | 1 | 1 | 0% | 2,317 | 1,553 | -33% | 0 | 0 | — |
case-01 | fail→fail | 22,098 | 5,242 | -76% | 1 | 1 | 0% | 4,808 | 1,139 | -76% | 0 | 0 | — |
case-02 | fail→fail | 3,808 | 6,477 | +70% | 1 | 1 | 0% | 195 | 1,313 | +573% | 0 | 0 | — |
case-03 | fail→fail | 18,565 | 5,325 | -71% | 1 | 1 | 0% | 3,777 | 1,070 | -72% | 0 | 0 | — |
case-04 | pass→pass | 9,254 | 6,733 | -27% | 1 | 1 | 0% | 1,349 | 2,056 | +52% | 0 | 0 | — |
case-05 | fail→pass | 9,662 | 4,128 | -57% | 1 | 1 | 0% | 1,518 | 1,602 | +6% | 0 | 0 | — |
case-06 | fail→pass | 9,752 | 4,313 | -56% | 1 | 1 | 0% | 1,540 | 1,546 | +0% | 0 | 0 | — |
case-07 | fail→pass | 11,785 | 2,381 | -80% | 1 | 1 | 0% | 1,931 | 1,233 | -36% | 0 | 0 | — |
case-08 | fail→pass | 10,809 | 3,203 | -70% | 1 | 1 | 0% | 2,004 | 1,369 | -32% | 0 | 0 | — |
case-09 | fail→pass | 15,779 | 7,466 | -53% | 1 | 1 | 0% | 2,410 | 2,124 | -12% | 0 | 0 | — |
case-11 | fail→pass | 13,296 | 2,652 | -80% | 1 | 1 | 0% | 2,115 | 1,209 | -43% | 0 | 0 | — |
case-12 | pass→pass | 10,272 | 3,645 | -65% | 1 | 1 | 0% | 1,609 | 1,402 | -13% | 0 | 0 | — |
case-13 | pass→pass | 15,035 | 1,835 | -88% | 1 | 1 | 0% | 2,597 | 1,059 | -59% | 0 | 0 | — |
case-14 | fail→pass | 9,192 | 1,524 | -83% | 1 | 1 | 0% | 1,329 | 1,071 | -19% | 0 | 0 | — |
case-15 | fail→pass | 11,359 | 2,503 | -78% | 1 | 1 | 0% | 1,693 | 1,176 | -31% | 0 | 0 | — |
case-16 | pass→pass | 15,334 | 5,021 | -67% | 1 | 1 | 0% | 2,082 | 1,559 | -25% | 0 | 0 | — |
case-17 | fail→pass | 11,727 | 2,449 | -79% | 1 | 1 | 0% | 1,601 | 1,197 | -25% | 0 | 0 | — |
case-18 | fail→pass | 12,601 | 2,152 | -83% | 1 | 1 | 0% | 2,368 | 1,152 | -51% | 0 | 0 | — |
case-19 | pass→pass | 7,251 | 1,861 | -74% | 1 | 1 | 0% | 1,181 | 1,074 | -9% | 0 | 0 | — |
case-20 | pass→pass | 11,665 | 3,500 | -70% | 1 | 1 | 0% | 1,781 | 1,421 | -20% | 0 | 0 | — |
case-21 | fail→pass | 8,411 | 2,556 | -70% | 1 | 1 | 0% | 1,533 | 1,203 | -22% | 0 | 0 | — |
case-22 | pass→pass | 17,100 | 12,363 | -28% | 1 | 1 | 0% | 2,677 | 2,546 | -5% | 0 | 0 | — |
case-23 | pass→pass | 12,402 | 6,928 | -44% | 1 | 1 | 0% | 2,039 | 1,897 | -7% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +42 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.