pente-spec 0.1.1

The typed border of the pleme-io theme vocabulary: (deftheme …) as Rust.
docs.rs failed to build pente-spec-0.1.1
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.

pente-spec — the typed border of the fleet theme vocabulary.

A theme is authored ONCE as a (deftheme …) tatara-lisp form and rendered to every consumer. This crate is the border that form compiles into; nothing here emits, and nothing downstream may hold a palette of its own.

Why the vocabulary exists

Measured across the fleet 2026-08-18: 118 palette copies in eight distinct encodings, with an unknown denominator (~62 repos carry ≥5 colour literals; the census reached ~26). The encodings matter more than the count, because a #RRGGBB grep sees only three of them:

encoding live example
E1 #RRGGBB nix/lib/nord.nix:22
E2 bare hex "2E3440" irodzuki/src/presets.rs:26the live source of mado's terminal grid
E3 Rgb::new(0x2e,0x34,0x40) mado/src/platform.rs:39
E4 decimal Color::new(136,192,208) kura/kura-tui/src/theme.rs:27
E5 float vec3(0.53,0.75,0.82) a ghostty GLSL shader
E6 [f32;4] egaku/src/theme.rs:112
E7 decimal ANSI \x1b[38;2;136;192;208m skim-tab/src/lib.rs:103
E8 hex inside a style string seki/…/blzsh_parity.rs

And the source of truth had already drifted from itself: four Nord ANSI-16 tables exist, four slots disagree, and slot 7 is a three-way split.

What is authored here vs derived

The ramp is the ONLY place a colour literal may appear. variant and slug are derived, never authored — stylix interpolates them into artefact NAMES, so a defaulted "untitled" silently renames a pile of store paths.

The ANSI table is authored, deliberately. It is a convention Nord publishes, not a function of the ramp — which is exactly why four independent derivations of it disagree today. Authoring it once and projecting it everywhere is what makes that disagreement unconstructible.

Measured properties of the substrate this border relies on

Proven by a compile probe now living upstream as tatara-lisp's tests/phase_f_constructs.rs (tatara-lisp@6f2056a) — those constructs had zero use sites fleet-wide before it, against 202 files using DeriveTataraDomain:

  • A typo'd kwarg is REJECTED, with a did-you-mean and the allowed set. (The surface notes' "empty Vec reported as success" warning describes the manual extraction path, not the derive path.)
  • A typo'd struct attribute is SILENT: #[tatara(keywords = …)] yields a keyword computed from the struct NAME. Hence the literal KEYWORD assertions in the tests below — they are load-bearing, not ceremony.
  • KeywordSexp lowercases the ident with no separator (Base0A:base0a), while field names go through snake_to_kebab (bright_black:bright-black). Two opposite rules; both are exercised here.