Skip to content

feat(palette): §9.1 + Aurora Green rename, spacecraft.css generated from TOML — v2.06 - #72

Merged
UnbreakableMJ merged 1 commit into
mainfrom
feat/construct-v2.06
Sep 15, 2026
Merged

UnbreakableMJ merged 1 commit into
mainfrom
feat/construct-v2.06

Conversation

@UnbreakableMJ

Copy link
Copy Markdown
Contributor

Skill-side sync of Standard#40, plus the three mechanisms the Standard describes but cannot itself contain.

Signal GreenAurora Green (§11.3.1)

The name described two different colours — #28C76F in Steelbore Blue, #9ECE6A in 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.py walks 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.py

Fails 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 Signal and Ember Lift are 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.css is now generated

The header, @font-face rules and :root block are generated from steelbore.toml between 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.34 since v1.35. check-palette-css.py catches 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 @import is gone (§9.1)

Replaced by @font-face rules naming local() only, backed by the existing monospace fallback. 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 googleapis references, with the palette variables still present.

§9.1's wording was softened in Standard#40 to match what ships. The first draft said fonts are "bundled, never fetched" — but spacecraft.css exists in nine locations, and bundling would mean nine copies of two binaries plus REUSE sidecars for a fidelity gain, not a privacy one. Baseline is now local()-only, bundling permitted where fidelity requires it.

Scope note

Three copies of spacecraft.css are 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

…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>
@UnbreakableMJ
UnbreakableMJ merged commit 467eef0 into main Sep 15, 2026
4 checks passed
@UnbreakableMJ
UnbreakableMJ deleted the feat/construct-v2.06 branch September 15, 2026 16:42

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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 <<< */

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Comment on lines +55 to +56
seen.setdefault(key.strip().lower(), {}).setdefault(
value.upper(), []

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant