feat(palette): §9.1 + Aurora Green rename, spacecraft.css generated from TOML — v2.06 - #72
Conversation
…v2.06 Skill-side sync of Standard PR #40, plus the three mechanisms the Standard describes but cannot itself contain. §11.3.1's `success` token is renamed Signal Green -> Aurora Green. The name described two colours (Blue #28C76F, Tokyo Night #9ECE6A), and token names are one flat namespace to every consumer that resolves a name to a value: check-palette-css.py walks all [palettes.*] first-writer-wins, so a doubled name checks a stylesheet against the wrong palette and still reports success. Blue's moves because Tokyo Night is registered verbatim and Blue's names are uniformly orbital. The hex is unchanged, so no ratio moves. check-token-names.py is added and wired into CI, failing when any token name maps to more than one hex. It checks values rather than banning reuse: Ember Red, Solar Amber, Mint Signal and Ember Lift are deliberately shared across palettes at one value each, and that stays legal. One name meaning two colours does not. spacecraft.css's header, @font-face rules and :root block are now generated from steelbore.toml between sentinels, with the hand-authored layout below left untouched. This removes nine retyped hexes (§11.4) and fixes a header that had claimed `Palette: … v1.34` since v1.35 — check-palette-css.py catches a drifted value, but nothing caught a drifted version, because nothing generated it. Both copies are written by the generator, so they are byte-identical by construction rather than by discipline. The Google Fonts @import is gone (§9.1). Verified by building the Standard's HTML against the new stylesheet: zero googleapis references in the output. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e3bddf0ba2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| derivatives, written by the same generator; keep all three byte-identical. */ | ||
|
|
||
| @import url('https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&family=Share+Tech+Mono&display=swap'); | ||
| /* >>> generated from steelbore.toml — do not edit below this line <<< */ |
There was a problem hiding this comment.
Rebuild every modified skill bundle before shipping
For anyone installing these skills from the repo-root .zip or .skill archives, none of this commit's fixes is delivered because the archives are unchanged: the Texinfo and palette bundles still contain the Google Fonts @import, the Standard bundle lacks §9.1, the palette bundle retains both Signal Green definitions, and the Theme Factory bundle still advertises its older version. Rebuild and commit both archives for spacecraft-steelbore-standard, spacecraft-texinfo-document, spacecraft-theme-factory, and steelbore-color-palette.
AGENTS.md reference: AGENTS.md:L98-L101
Useful? React with 👍 / 👎.
| seen.setdefault(key.strip().lower(), {}).setdefault( | ||
| value.upper(), [] |
There was a problem hiding this comment.
Normalize names to the CSS property namespace
When two palette tokens differ only by whitespace versus hyphens—for example, Foo Bar and Foo-Bar with different values—this checker records distinct keys and passes them, while generate-palette-css.py::kebab() maps both to --foo-bar and check-palette-css.py::kebab_to_name() treats that property as foo bar. The resulting collision is therefore exactly the ambiguity this new gate is intended to reject; normalize token names using the same kebab/space conversion before grouping them.
Useful? React with 👍 / 👎.
Skill-side sync of Standard#40, plus the three mechanisms the Standard describes but cannot itself contain.
Signal Green→Aurora Green(§11.3.1)The name described two different colours —
#28C76Fin Steelbore Blue,#9ECE6Ain Tokyo Night. Token names look per-palette but are one flat namespace to every consumer that resolves a name to a value:check-palette-css.pywalks all[palettes.*]first-writer-wins, so a doubled name checks a stylesheet against the wrong palette's value and still reports success. It never misfired only because no stylesheet happened to declare that token.Blue's is the one that moves — Tokyo Night is registered verbatim under §11.3.5, and Blue's names are uniformly orbital (Orbit Navy, Deep Orbit, Ion White, Dawn Sky, Azure Hue, Warm Thruster). The hex does not change, so no contrast ratio moves.
New gate:
check-token-names.pyFails when any palette token name maps to more than one hex. It checks values rather than banning reuse, because shared tones are deliberate:
Ember Red,Solar Amber,Mint SignalandEmber Liftare carried across palettes at one value each and stay legal. One name meaning two colours does not.Tested both ways — passes on the fixed file (104 distinct names across 10 palettes), and fails with a readable diagnostic when the collision is reintroduced.
spacecraft.cssis now generatedThe header,
@font-facerules and:rootblock are generated fromsteelbore.tomlbetween sentinels; the hand-authored layout below is left untouched.This removes nine retyped hexes (§11.4) and fixes a header that had read
Palette: … v1.34since v1.35.check-palette-css.pycatches a drifted value; nothing caught a drifted version, because nothing generated it. Both copies are now written by the same generator, so they are byte-identical by construction rather than by discipline.The Google Fonts
@importis gone (§9.1)Replaced by
@font-facerules naminglocal()only, backed by the existingmonospacefallback. Previously every reader of any generated HTML doc disclosed their IP, User-Agent and Referer to a third-party CDN on every page view.Verified in the built output, not just the source: building the Standard's HTML against the new stylesheet gives zero
googleapisreferences, with the palette variables still present.Scope note
Three copies of
spacecraft.cssare in the sync contract and are fixed here. Six more exist in unrelated project repos (os-prober,vacuum/doc— whose header says §10, off by a whole section —skyroads-rs/doc, and three synced ones). Those belong to their own repos and are deliberately out of scope.Verification
All eight CI gates pass locally:
generate-steelbore-scm.py --check,generate-palette-css.py --check,check-token-names.py, description cap, license files, skill refs, frontmatter,reuse lint.🤖 Generated with Claude Code