---
version: alpha
name: Lossless Agent Skills — Operator (Astro Knots · CLI / handbook)
description: >-
  Design system for the lossless-agent-skills splash. Operator/CLI posture —
  the splash reads like a `man` page rendered on a high-end terminal. Mono-
  forward (JetBrains Mono is the headline AND the meta), brutalist hairline
  cards (no glow, sharp 2-3px radii), blueprint-grid backdrop. Dark ("operator")
  is the default mode; light ("daylight inspection") and vibrant ("demo") are
  first-class. Brand spine is terminal-teal + amber + magenta — deliberately
  diverged from sibling Lossless splashes (memopop's cyan-led, lfm's ink-violet,
  ai-labs's sodium-led). Tokens mirror the CSS custom properties in
  `src/styles/theme.css`; that file is the runtime source of truth, this
  DESIGN.md is the human- and agent-readable contract.

# ─── Colors ────────────────────────────────────────────────────────────
colors:
  # Tier 1 — named (raw values, mode-invariant). Inputs to the semantic tier
  # below; components do not consume these directly.

  # Brand spine — terminal hues.
  teal: "#5eead4"                  # primary accent · prompt / OK signal
  teal-deep: "#14b8a6"
  teal-soft: "#99f6e4"
  amber: "#fbbf24"                 # accent-warm · highlight / careful
  amber-deep: "#d97706"
  amber-soft: "#fde68a"
  magenta: "#e879f9"               # thread · signal-state / featured
  magenta-deep: "#c026d3"
  magenta-soft: "#f5d0fe"

  # Vibrant-mode signal hues — punched-up versions of the spine.
  neon-teal: "#2dd4bf"
  neon-amber: "#fcd34d"
  neon-pink: "#ff66c4"

  # Console neutrals — terminal-deep ink axis (dark mode bg + card layers).
  console-bg: "#0a0e14"
  console-soft: "#11161f"
  console-card: "#161b26"
  console-line: "#1f2632"
  console-rule: "#2a3441"

  # Paper neutrals — light mode bg + card layers ("daylight inspection").
  paper: "#f5f4f0"
  paper-soft: "#ebe9e3"
  paper-deep: "#ddd9d0"

  # Ink + slate — text axis used across light mode.
  ink: "#0a0e14"
  ink-soft: "#1c2230"
  slate-700: "#334155"
  slate-500: "#64748b"
  slate-400: "#94a3b8"
  slate-300: "#cbd5e1"
  slate-200: "#e2e8f0"

  # Tier 2 — semantic. These are what components read. Rebound per
  # <html data-mode>; values below are the dark-mode (default) bindings.
  bg: "{colors.console-bg}"
  bg-soft: "{colors.console-soft}"
  bg-elevated: "{colors.console-card}"
  bg-card: "{colors.console-card}"   # rendered at 92% alpha at runtime
  bg-code: "#060a10"

  text: "#e6edf3"
  text-soft: "#b1bac4"
  text-dim: "#8b949e"
  text-dimmer: "#6e7681"
  text-faint: "#484f58"

  accent: "{colors.teal}"
  accent-soft: "{colors.teal-soft}"
  accent-warm: "{colors.amber}"
  accent-hot: "{colors.amber-deep}"

  thread: "{colors.magenta}"
  thread-soft: "{colors.magenta-soft}"

  border: "#e6edf3"                  # rendered at 8% alpha at runtime
  border-strong: "#e6edf3"           # rendered at 18% alpha
  border-accent: "{colors.teal}"     # rendered at 45% alpha

# ─── Typography ────────────────────────────────────────────────────────
# Two-family stack with one of them used twice. JetBrains Mono is the
# headline AND the meta — display=mono is the defining type move.
# Inter carries body grotesque for long-form readability. No serif,
# never. Single mono family is intentional: less weight to load, more
# coherence between heading and inline-code.
typography:
  display-hero:
    fontFamily: JetBrains Mono
    fontSize: 2.9rem               # clamp(1.8rem, 4.6vw, 2.9rem)
    fontWeight: 700
    lineHeight: 1.1
    letterSpacing: -0.02em
  display-h2:
    fontFamily: JetBrains Mono
    fontSize: 2rem                 # clamp(1.5rem, 3vw, 2rem)
    fontWeight: 700
    lineHeight: 1.15
    letterSpacing: -0.012em
  display-h3:
    fontFamily: JetBrains Mono
    fontSize: 1.18rem
    fontWeight: 600
    lineHeight: 1.15
    letterSpacing: -0.012em
  card-title:
    fontFamily: JetBrains Mono
    fontSize: 1.04rem
    fontWeight: 600
    letterSpacing: -0.005em
  body:
    fontFamily: Inter
    fontSize: 1rem
    fontWeight: 400
    lineHeight: 1.6
    fontFeature: "'cv11' on"       # Inter slashed zero
  prose-body:
    fontFamily: Inter
    fontSize: 1.02rem
    fontWeight: 400
    lineHeight: 1.7
  tagline:
    fontFamily: Inter
    fontSize: 1.1rem
    fontWeight: 400
    lineHeight: 1.55
  folio:                           # the manual-style chapter mark "#01"
    fontFamily: JetBrains Mono
    fontSize: 0.74rem
    fontWeight: 500
    letterSpacing: 0.18em
  eyebrow:
    fontFamily: JetBrains Mono
    fontSize: 0.7rem
    fontWeight: 500
    letterSpacing: 0.24em
  pill:
    fontFamily: JetBrains Mono
    fontSize: 0.68rem
    fontWeight: 500
    letterSpacing: 0.08em
  chip:
    fontFamily: JetBrains Mono
    fontSize: 0.8em
    fontWeight: 400
  meta:
    fontFamily: JetBrains Mono
    fontSize: 0.76rem
    fontWeight: 400
    letterSpacing: 0.04em
  code:
    fontFamily: JetBrains Mono
    fontSize: 0.88em
    fontWeight: 400

# ─── Rounded — squarer than memopop, squarer than lfm; brutalist by design.
# Pills stay round (search trigger, status pills with .pill-round variant).
rounded:
  sm: 2px
  md: 3px
  lg: 4px
  xl: 6px
  full: 999px

# ─── Spacing — invariant ───────────────────────────────────────────────
spacing:
  "1": 0.25rem
  "2": 0.5rem
  "3": 0.75rem
  "4": 1rem
  "5": 1.25rem
  "6": 1.5rem
  "8": 2rem
  "10": 2.5rem
  "12": 3rem
  "16": 4rem
  "20": 5rem
  "24": 6rem
  # Layout containers
  container-max: 1200px
  container-narrow-max: 820px
  container-padding: 24px
  # Blueprint grid pitch — drives bg-mesh background-size; ×4 is the major
  grid-pitch: 32px
  # Header height + transitions
  header-height: 60px
  transition-fast: 140ms
  transition-mid: 280ms

# ─── Components ────────────────────────────────────────────────────────
components:
  # Hairline-bordered card — the defining card chrome. No rounded corners,
  # no glow, no lift on hover (border thickens only).
  skill-card:
    backgroundColor: "{colors.bg-card}"
    borderColor: "{colors.border}"
    borderWidth: 1px
    rounded: 0                       # zero radius — brutalist on purpose
    padding: "{spacing.5}"
    hover-borderColor: "{colors.border-strong}"
    hover-titleColor: "{colors.accent}"

  # Status pill — square corners, terminal-color signals via [data-status].
  pill:
    typography: "{typography.pill}"
    padding: "3px 8px"
    rounded: "{rounded.sm}"
    borderColor: "{colors.border-strong}"
    backgroundColor: "{colors.text}"  # rendered at 4% alpha at runtime
    color: "{colors.text-soft}"
    textTransform: uppercase
  pill-active:                        # [data-status='Active' | 'Stable' | 'live']
    color: "{colors.accent}"
    borderColor: "{colors.accent}"    # rendered at 55% alpha
    backgroundColor: "{colors.accent}"  # rendered at 10% alpha
  pill-iterating:                     # [data-status='Beta' | 'Iterating']
    color: "{colors.thread}"
    borderColor: "{colors.thread}"
    backgroundColor: "{colors.thread}"
  pill-experimental:                  # [data-status='Alpha' | 'Experiment' | 'Draft']
    color: "{colors.accent-warm}"
    borderColor: "{colors.accent-warm}"
    backgroundColor: "{colors.accent-warm}"

  # Chip — inline tag indicator inside cards.
  chip:
    typography: "{typography.chip}"
    padding: "2px 7px"
    rounded: "{rounded.sm}"
    backgroundColor: "{colors.bg-code}"
    borderColor: "{colors.border}"
    color: "{colors.text-soft}"

  # Folio — the manual-style "#01 · Featured" chapter mark.
  folio:
    typography: "{typography.folio}"
    color: "{colors.text-dim}"
    prefix-color: "{colors.accent}"   # the leading "#XX" rendered in accent
    textTransform: uppercase

  # Eyebrow — leading micro-label (used less than folio; folio is the more
  # defining mark on this splash).
  eyebrow:
    typography: "{typography.eyebrow}"
    color: "{colors.text-dim}"
    textTransform: uppercase

  # Brutalist ghost-rect button — square, no glow.
  btn:
    typography: "{typography.pill}"
    padding: "9px 16px"
    rounded: "{rounded.sm}"
    borderColor: "{colors.border-strong}"
    backgroundColor: "{colors.bg-elevated}"
    color: "{colors.text}"
    hover-borderColor: "{colors.accent}"
    hover-color: "{colors.accent}"
  btn-primary:
    backgroundColor: "{colors.accent}"
    borderColor: "{colors.accent}"
    color: "{colors.bg}"
    hover-backgroundColor: "{colors.accent-soft}"

  # Mode toggle — three icon buttons (operator / daylight / demo).
  mode-toggle:
    backgroundColor: "{colors.bg-elevated}"
    borderColor: "{colors.border-strong}"
    rounded: "{rounded.sm}"
    button-size: "30px"
    button-active-bg: "{colors.accent}"
    button-active-color: "{colors.bg}"
    button-rest-color: "{colors.text-dim}"

  # Site header — sticky, backdrop-blur 10px, hairline bottom border.
  site-header:
    position: sticky
    height: "{spacing.header-height}"
    backgroundColor: "{colors.bg}"     # rendered at 90% alpha + blur(10px)
    borderBottomColor: "{colors.border}"
    backdropFilter: "blur(10px)"

  # Brand mark in header — "$_" leading prompt + wordmark.
  brand-mark:
    prompt-text: "$_"
    prompt-color: "{colors.accent}"
    name-fontFamily: "{typography.display-hero.fontFamily}"
    name-fontWeight: 600

  # Hero terminal panel — the right-column "skills/" tree readout.
  hero-panel:
    backgroundColor: "{colors.bg-elevated}"
    borderColor: "{colors.border-strong}"
    rounded: "{rounded.sm}"
    head-backgroundColor: "{colors.bg-soft}"
    head-borderBottomColor: "{colors.border}"
    dot-1-color: "{colors.accent-warm}"   # amber (left)
    dot-2-color: "{colors.thread}"         # magenta (mid)
    dot-3-color: "{colors.accent}"         # teal (right)

  # Hero install line — "$ ./sync-skills.sh ..." chip.
  hero-install:
    backgroundColor: "{colors.bg-code}"
    borderColor: "{colors.border}"
    rounded: "{rounded.sm}"
    fontSize: 0.86rem
    color: "{colors.text-soft}"
    prompt-color: "{colors.accent}"

  # Gradient text — used sparingly on a single hero word.
  gradient-text:
    background: "linear-gradient(90deg, {colors.teal} 0%, {colors.amber} 55%, {colors.magenta} 100%)"
    backgroundClip: text
    color: transparent

  # Background — fixed blueprint grid overlay (.bg-mesh) on body.
  blueprint-grid:
    pitch: "{spacing.grid-pitch}"            # 32px fine
    pitch-major: 128px                       # ×4 the fine pitch
    line-color: "{colors.accent}"            # teal at 4.5% alpha
    line-color-major: "{colors.accent-warm}" # amber at 3.5% alpha
    mask: radial-gradient(ellipse at center, black 40%, transparent 92%)

# ─── Modes (off-spec extension, owned by theme-system skill) ───────────
# Three first-class modes. `dark` ("operator") is the default. `light`
# ("daylight inspection") inherits the paper axis but keeps the mono-
# forward type and brutalist hairlines. `vibrant` ("demo") is dark-based
# but pushes neon hues for room-scale presentations.
modes:
  dark:
    role: operator (default)
    bg: "{colors.console-bg}"
    text: "#e6edf3"
    accent: "{colors.teal}"
    thread: "{colors.magenta}"
    grid-line: "{colors.teal}"             # at 4.5% alpha
    color-scheme: dark
  light:
    role: daylight inspection
    bg: "{colors.paper}"
    text: "{colors.ink}"
    accent: "{colors.teal-deep}"
    thread: "{colors.magenta-deep}"
    grid-line: "{colors.teal-deep}"        # at 6% alpha
    color-scheme: light
  vibrant:
    role: demo
    bg: "#050810"
    text: "#f0f9ff"
    accent: "{colors.neon-teal}"
    thread: "{colors.neon-pink}"
    grid-line: "{colors.neon-teal}"        # at 10% alpha
    shadow-elevated: "0 0 0 1px rgba(252, 211, 77, 0.25)"
    color-scheme: dark

# ─── Imagery — Ideogram v3 recipe (owned by generate-consistent-og-images) ──
# Locked recipe for share imagery. Two variables per request: `aspect_ratio`
# (one entry from the four-format enum below) and `prompt` (subject +
# composition only). Every other field is constant across the image family.
imagery:
  provider: ideogram
  endpoint: POST https://api.ideogram.ai/v1/ideogram-v3/generate
  content_type: multipart/form-data

  # ── Locked defaults — DO NOT vary per request ───────────────────────
  defaults:
    style_type: AUTO              # REQUIRED with style_reference_images.
    magic_prompt: OFF             # off → no rewrite drift across requests.
    rendering_speed: QUALITY      # use TURBO/FLASH only when iterating.
    seed: 2048                    # canonical seed for skills splash; bump only on rebrand.

  # ── Locked negative prompt — short on purpose ───────────────────────
  # Trailing clauses ("oversized subject", "subject in top half") defend
  # the SVG overlay zone in tall aspect ratios. Don't extend without a
  # demonstrated failure mode worth excluding.
  negative_prompt: >-
    text, typography, lettering, logos, watermarks, central subject
    filling frame, photorealistic human faces, saturated, rainbow,
    vibrant, oversized subject, subject in top half

  # ── Locked color palette — weighted toward the console surface ──────
  # console-bg dominates (0.45) so the dark terminal ground reads as
  # the surface. Teal carries primary glow (the prompt/cursor color);
  # amber adds the careful-highlight; magenta reserves the dramatic
  # signal. Slate-200 keeps the subject from going stark white.
  color_palette:
    members:
      - { color_hex: "#0a0e14", color_weight: 0.45 }   # console-bg (surface)
      - { color_hex: "#5eead4", color_weight: 0.20 }   # teal (primary accent)
      - { color_hex: "#fbbf24", color_weight: 0.15 }   # amber (warm accent)
      - { color_hex: "#e879f9", color_weight: 0.10 }   # magenta (thread)
      - { color_hex: "#e2e8f0", color_weight: 0.10 }   # slate-200 (subject pass-through)

  # ── Locked style reference — the canonical aesthetic anchor ─────────
  # The .png lives alongside the .jpg deliverables and is re-uploaded as
  # `style_reference_images` on every generation. If no reference exists
  # yet (first run), generate one using only `color_palette` + `style_type:
  # AUTO`, save its PNG here, then point this field at it and proceed with
  # the canonical recipe for every subsequent variant.
  style_reference:
    path: public/ogimage__Lossless-Agent-Skills--Default.png
    mime: image/png

  # ── Aspect ratio enum — pick one per request ────────────────────────
  # Four canonical formats. WhatsApp / iMessage is the primary deliverable
  # (banner_image_tall); the rest are concentric rings around it.
  aspect_ratios:
    banner_image: 16x9            # OG / Twitter / Slack / generalized share
    banner_image_tall: 4x5        # WhatsApp / iMessage (close to 1x1, slightly taller — 1x1 too short for chat-preview crop)
    portrait_image: 9x16          # Stories / Reels / TikTok / vertical feed
    square_image: 1x1             # Avatars / square unfurls / Discord embeds

  # ── Prompt convention — the ONLY free-text per request ──────────────
  # Two clauses: (1) empty region declared as first-class subject with
  # concrete content; (2) subject zone. Explicit numeric proportions.
  # Subjects lean on the terminal/handbook/datasheet metaphor — terminal
  # windows, console prompts, monospaced labels, blueprint-grid
  # underlays. NOT humans, NOT logos, NOT product UI screenshots.
  prompt:
    pattern: "Top 1/3 of frame is empty negative space, {empty_region_content}. Bottom 2/3 contains {subject}."
    max_chars_recommended: 220
    # Locked sky — the same backdrop across every aspect ratio in a single
    # run, so the four images read as one console under one sky, not four
    # separate scenes. Pick ONE per generation round; don't rotate this.
    empty_region_content: dark gradient sky with faint teal glint at the horizon
    subject_themes:
      # Canonical subjects for the skills splash family — robot-gym canon.
      # Conceptual thread: robots developing skills at the gym = agents
      # developing skills via this catalog. Wall-E illustration style,
      # teenager-sized robot proportions, gym apparatus (barbells, weight
      # plates, bench-press rigs, dumbbells). Never humans, never logos.
      - a few humanoid teenager robots at a gym, pumping iron
      - three humanoid teenager robots overhead-pressing barbells in a row
      - humanoid teenager robots squatting and bench-pressing on yellow gym tile
      - humanoid teenager robots warming up with dumbbells along a magenta gym wall
      - a row of humanoid teenager robots spotting each other at a bench-press rig
    forbid:
      # Already encoded via locked channels; never repeat in the prompt.
      - brand names (Lossless, lossless-agent-skills, skill names)
      - color names (teal, amber, magenta, dark)
      - aesthetic adjectives (operator, handbook, brutalist, blueprint)
      - composition cues encoded by the style_reference (yellow tile floor,
        magenta gym wall, teal horizon band) — repeating them in the prompt
        dilutes attention from the actual subject variation

  # ── Output convention — naming + preservation ───────────────────────
  output:
    public_dir: public
    naming: "ogimage__Lossless-Agent-Skills--{Format}.jpg"
    formats:
      - BannerImage               # 16x9 — OG / Twitter / Slack
      - BannerImageTall           # 4x5 — WhatsApp / iMessage (primary)
      - PortraitImage             # 9x16 — Stories / Reels / TikTok
      - SquareImage               # 1x1 — Avatars / square unfurls
    # The .png style reference keeps its existing name (Default.png) — that's
    # the canonical aesthetic anchor uploaded on every request, not a JPEG
    # deliverable, so it stays separate from the four-format set above.
    archive_dir: .ogimage-archive       # dot-prefixed; outside public/
    candidates_dir: .ideogram-candidates # dot-prefixed; outside public/

---

# Lossless Agent Skills — Design System

> The runtime source of truth is `src/styles/theme.css`'s `:root` and
> `:root[data-mode='...']` blocks; long-form prose styling lives in
> `src/styles/prose.css`. This document is the human- and agent-readable
> contract that explains intent. Keep them in sync when any of them
> changes.

## Brand & Style

The lossless-agent-skills splash reads as an **operator's manual rendered on
a high-end terminal** — `$_` prompt in the brand mark, `#01 · Featured`
folios at every section, a `skills/` tree-panel readout in the hero, brutalist
hairline cards with sharp corners, a faint blueprint grid running underneath
everything. Not "AI startup with neon gradients", not "build-in-public emoji
sprawl", not "marketing-deck dark theme." Closer to a `man` page printed on a
high-DPI display: dense, instrumented, deliberate.

The defining typographic move is **mono-as-display**. JetBrains Mono is the
headline AND the meta — section folios, status pills, status indicators,
chips, identifiers, AND every `<h1>` / `<h2>` / `<h3>`. Inter carries body
prose. There is no third family. Sibling Lossless splashes lean *editorial*
(memopop sans, lfm serif) or *instrumented-but-display-sans* (ai-labs Space
Grotesk display + JetBrains meta); this one collapses display into mono and
treats that collapse as the brand.

Three modes are first-class: **dark** ("operator") is the default — this is a
developer surface first; **light** ("daylight inspection") inherits the paper
axis but keeps the mono-forward type and brutalist hairlines; **vibrant**
("demo") is dark-based, pushes neon hues, and adds amber-tinted shadow
contour for demo-room presentations.

The voice is **handbook / datasheet**: short, declarative, prefers `$ ./sync-skills.sh`
to "Let's get started!", prefers `load lossless-agent-skills` (a command) to
"Welcome to..." Words like *catalog*, *roster*, *sync*, *load*, *prompt*,
*manual*, *ship*, *active* are preferred over *vibrant*, *amazing*, *unleash*,
*empower*. Hero h1 is literally a shell command.

## Colors

Two tiers. **Named tokens** are raw values, mode-invariant — the inputs.
**Semantic tokens** are what components consume — `bg`, `text`, `accent`,
`thread`, `border`, etc. — and get rebound per `<html data-mode>`. Components
must read semantic tokens only; hard-coded hex values break mode switching
silently.

The **brand spine** is three terminal hues:

- **`teal`** (#5eead4) — the primary accent. Terminal-prompt color, OK-signal,
  cursor block. Drives all calls-to-act, the hero `$` prompt, the brand mark
  glyph, the eyebrow underline, the hover-state on cards (`title` shifts to
  teal). Sparing use; every appearance should read as meaningful.
- **`amber`** (#fbbf24) — the warm accent. Highlight / careful / draft. Used
  for the "Draft" pill state, the leftmost terminal-window dot, the major
  blueprint-grid line. Reserved for "this needs attention but isn't a stop."
- **`magenta`** (#e879f9) — the thread. Signal-state, featured, version
  callouts. The middle terminal-window dot. Used sparingly; the vibrant
  mode pushes it to neon-pink for demo presence.

The **console neutrals** are the dark axis: `console-bg` (#0a0e14) →
`console-soft` → `console-card` → `console-line` → `console-rule`. Harder-
edged than ai-labs's `ink-bench` and considerably darker than memopop's deep
ink — closer to a literal terminal background.

The **paper neutrals** are the light axis: `paper` (#f5f4f0) → `paper-soft` →
`paper-deep`. Slightly warmer than pure white; reads as printed-datasheet
paper, not as glare.

Mode bindings:

| Semantic | Dark (operator) | Light (daylight) | Vibrant (demo) |
|---|---|---|---|
| `bg` | `console-bg` | `paper` | `#050810` |
| `text` | `#e6edf3` | `ink` | `#f0f9ff` |
| `accent` | `teal` | `teal-deep` | `neon-teal` |
| `accent-warm` | `amber` | `amber-deep` | `neon-amber` |
| `thread` | `magenta` | `magenta-deep` | `neon-pink` |

Borders are rendered from a single hex (`#e6edf3` in dark, `#0a0e14` in light)
at varying alpha levels (8% / 18% for the strong / 45% for the accent-tinted) —
the alpha *is* the strength signal. Status-indicating pills tint the same
border at 55% with the relevant accent color and fill the surface at 10%.

## Typography

Two families. The split is intentional and unusual:

- **JetBrains Mono** (display AND mono — the dominant family) — `h1`/`h2`/
  `h3`, card titles, folios, eyebrows, status pills, chips, code, identifiers,
  every number, every shell-prompt glyph. **This is the defining type move.**
  Where memopop reaches for sans, lfm reaches for serif, and ai-labs splits
  display (Space Grotesk) from meta (JetBrains Mono), this splash collapses
  display *into* mono. Headlines are commands; commands look like commands.
- **Inter** (body grotesque) — long-form prose paragraphs and reading text.
  Optimized for short-to-medium paragraphs at 1rem with the slashed-zero
  feature on (`'cv11' on`). Never used in headlines, eyebrows, or chips.

Single mono family is also intentional — fewer font weights to load, more
visual coherence between heading and inline-code, and the headline shares the
exact glyph shapes with the `$ ./sync-skills.sh` install line directly below
it. That visual rhyme is the whole point.

Conventions:

- **Folios** (`#01 · Featured`) lead every section. JetBrains Mono `0.74rem`
  at `0.18em` letter-spacing, uppercase, with the leading `#XX` rendered in
  `--color-accent` (teal) via the `data-num` attribute and a `::before`
  pseudo-element. The chapter-style numbering is the manual voice expressed
  at the section level — sections without a folio don't read as part of the
  manual.
- **Hero h1** is `clamp(1.8rem, 4.6vw, 2.9rem)` JetBrains Mono `700` with the
  shell `$` glyph as a separate span in `--color-accent`. The h1 is literally
  a shell command (`load lossless-agent-skills`) with one gradient-text word.
- **Body paragraphs** stay Inter; never use mono for paragraph prose. Mono in
  paragraphs reads as code; we want long-form prose to read as prose so
  that mono in headings reads as command.

Never introduce a third family. Two is the contract — and one of those two
gets used twice.

## Layout & Spacing

Container model: `--container-max` of `1200px` (and `--container-narrow-max`
of `820px` for prose-heavy pages) centered with `var(--space-6)` (24px) inline
padding. Sections add vertical rhythm via `padding: var(--space-12) 0` (48px)
with a `1px solid var(--color-border)` top border that signals section change
without weight. The hero drops the top border (it's the first thing).

Spacing scale is a power-of-1.25 progression mostly aligned to rem multiples:
`0.25rem`, `0.5rem`, `0.75rem`, `1rem`, `1.25rem`, `1.5rem`, `2rem`, `2.5rem`,
`3rem`, `4rem`, `5rem`, `6rem`. Components reach for the scale tokens, never
raw `px` values; spot-tuning lives only where the scale is the wrong instrument
(e.g. the 30px mode-toggle button size, the 10px header backdrop blur, the
60px sticky-header height).

The hero uses an asymmetric two-column split at `≥980px`:
`grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr)`. The left column
carries the manual copy (folio + h1 command + tagline + philosophy + CTAs +
install line); the right column carries the **terminal-panel readout** — a
fake `skills/` directory tree showing the first 8 featured skills as
`└─ skill-name`. Below `980px`, both columns stack.

Other grids use `repeat(auto-fill, minmax(<min>, 1fr))`:

- Featured skill grid: `minmax(290px, 1fr)`.

The featured grid uses `auto-fill` (not `auto-fit`) on purpose — empty cells
preserve the column rhythm at wide widths instead of letting cards stretch
unevenly.

## Elevation & Depth

Flat. The blueprint grid is the *only* ambient lighting.

The blueprint grid runs as a fixed `.bg-mesh` element behind every page:
two layered grid systems (32px fine teal lines + 128px major amber lines)
at very low alpha (4.5% / 3.5%), masked to a radial-gradient ellipse that
fades to transparent at ~92% radius. That's the entire ambient lighting
layer; no glow, no other gradient washes, no noise.

Cards earn a hairline `1px solid var(--color-border)` and **no shadow at
all** in dark mode (`--shadow-card: 0 0 0 transparent`). Hover thickens the
border to `--color-border-strong` and shifts the title to `--color-accent`,
nothing else. No lift, no glow, no scale. The brutalism is non-negotiable.

`--color-bg-elevated` (the slightly-lighter tier) signals elevation without
shadow — the hero terminal panel, the mode toggle, ghost-rect buttons, and
the search popover all use it. Vibrant mode is the sole exception: cards
gain a faint amber-tinted 1px shadow contour for room-scale demo presence.
Light mode drops shadow intensity proportionally; ink-on-paper doesn't want
the same depth signal as a glowing console.

The header is sticky (`top: 0`) with a 10px `backdrop-filter: blur(10px)`
and `background: color-mix(... 90% --color-bg ...)` so the brand mark and
mode toggle stay reachable while scrolling, without breaking the console
surface beneath.

## Shapes

Cut, not poured. The radius scale is deliberately small and brutalist:

- `sm: 2px` — chips, inline kbd, status pills, ghost-rect buttons.
- `md: 3px` — used internally for the search popover panel.
- `lg: 4px` — reserved; not currently consumed.
- `xl: 6px` — reserved; not currently consumed.
- `full: 999px` — pills only when the `.pill-round` modifier is applied
  (the default `.pill` is square — square pills are part of the brutalist
  brand).

This is squarer than ai-labs (which uses 2/3/5), much squarer than lfm
(2/4/8/12), and another universe from memopop's glass shapes (8/16/24).
The skill-card itself uses **zero radius** — that's the strongest
brand-defining shape decision.

Borders are 1px hairlines everywhere. Two-pixel borders only appear as the
left-rail on `.hero__philosophy` and `blockquote` (a teal accent rail), and
as the prose `.prose blockquote` left-rail.

## Components

### SkillCard (the defining card chrome)

A **zero-radius hairline-bordered card** with the skill's directory path in
mono `0.74rem` as the meta-line, a status pill on the same row, a JetBrains
Mono `1.04rem` title, a body lede capped at 220 chars (truncated with `…`),
and up to four chip tags in the footer above a dashed top border.

Hover thickens the border (`-strong`) and shifts the title to teal. No lift,
no shadow change, no scale. The whole card is a single anchor.

This is THE defining card affordance. Cards on this splash do not have
rounded corners. Period.

### Pill (status indicator)

Square corners (`rounded.sm`), JetBrains Mono `0.68rem` at `0.08em`
letter-spacing, uppercase. Tinted by `[data-status]` attribute so frontmatter
status values flow through directly:

- `data-status='Active' | 'Stable' | 'live'` — teal border + teal text + 10%
  teal fill. Primary status indicator; "this works."
- `data-status='Beta' | 'Iterating'` — magenta border + magenta text + 10%
  magenta fill. "Shipped but moving."
- `data-status='Alpha' | 'Experiment' | 'planned' | 'Draft'` — amber border +
  amber text + 10% amber fill. "Work in progress / be careful."
- (default — no `data-status`) — neutral hairline border + soft text + 4%
  text fill. Used for low-key meta or legacy status values.

Never put more than one status pill on a single card; the cross-product
signal collapses otherwise.

### Chip (tag indicator)

Used inside SkillCards for tag rows. `0.68rem` JetBrains Mono, dim color,
hairline border, `rounded.sm`. Wraps freely; capped at 4 visible tags per
card (overflow is silent — fewer is fine, more isn't shown). The chip
divider above is a `1px dashed var(--color-border)` — the only dashed border
in the whole design.

### Folio (section marker)

The `#01 · Featured`, `#02 · Recent` chapter mark that leads every section.
JetBrains Mono `0.74rem` at `0.18em` letter-spacing, uppercase, color
`--color-text-dim`. The leading `#XX` is supplied via `data-num="#01"` and
rendered with `::before { content: attr(data-num); color: var(--color-accent); }`.
The teal-tinted number is what makes a folio read as a folio rather than a
plain eyebrow — it's the manual's table-of-contents reference.

### Hero terminal panel

A right-column aside on the hero showing a fake `skills/` directory tree
listing the first 8 featured skills. Frame chrome:

- `--color-bg-elevated` background, `--color-border-strong` 1px border,
  `rounded.sm`, overflow hidden.
- Header strip with three colored dots (amber / magenta / teal — the brand
  spine in left-to-right order, mimicking macOS traffic-light buttons) and a
  `skills/` title in mono.
- List body with `└─ <skill-name>  <STATUS>` rows in JetBrains Mono `0.82rem`,
  `line-height: 1.9` for readable density.

Demonstrates the rollup mechanism above the fold and doubles as a
proof-of-life signal. Hidden from screen readers (`aria-hidden="true"`) — it's
illustrative, not the primary content.

### Hero install line

A small mono chip showing `$ ./sync-skills.sh ~/.claude/skills`. Same code
surface (`--color-bg-code`) as inline `<code>`, hairline border, `rounded.sm`,
`max-width: max-content` so it sizes to its contents and doesn't stretch.
The leading `$` is in `--color-accent` (teal) like the hero `$` prompt and
the brand mark `$_` — three places where the same prompt glyph is the same
color, on purpose.

### Mode toggle (three-button segmented control)

Inline-flex group of three icon buttons (moon / sun / star). Pressed state
fills the button with `--color-accent` (teal) and inverts text to
`--color-bg`. Persists choice to `localStorage` under
`lossless-skills-splash-mode`. The pre-paint inline script in `BaseLayout`
reads the persisted value and writes `<html data-mode="...">` before first
paint, preventing FOUC on mode-switched visits.

### Brand mark (header)

`$_` prompt in mono `--color-accent` (teal) + "Lossless Agent Skills"
wordmark in mono `0.95rem` `font-weight: 600`. On viewports `≤720px` the
wordmark collapses to the short tag "LAS" in `--color-text-dim`. Never
substitute a glyph icon — the `$_` IS the logo.

### Gradient text

A single-word gradient applied sparingly — currently only on
`lossless-agent-skills` in the hero h1. Background-clipped gradient flows
teal → amber → magenta (the brand spine in left-to-right order, matching the
terminal-panel dots). Never apply to whole phrases; the move dilutes if
reused.

### Background — blueprint grid

A fixed `.bg-mesh` element renders four layered linear gradients: 32px-pitch
1px-line teal verticals + horizontals at 4.5% alpha, and 128px-pitch (×4)
1px-line amber verticals + horizontals at 3.5% alpha. The whole layer is
masked with a radial-gradient ellipse `(black 40%, transparent 92%)` so the
grid is brightest at the center of the viewport and fades outward. Pure CSS;
no images.

## Imagery

All splash imagery is generated via Ideogram's v3 generate endpoint. The
frontmatter's `imagery:` block is the **complete locked recipe** — every
field there stays constant across every request. The two things that vary
per call are `prompt` (subject + composition) and `aspect_ratio` (one entry
from the four-format enum). Everything else — style reference, color palette,
style type, magic-prompt flag, negative prompt, seed, rendering speed,
empty-region content — is identical request-to-request.

### The locked channels (don't touch per request)

- **`style_reference_images`** — `public/ogimage__Lossless-Agent-Skills--Default.png`,
  uploaded on every request. The canonical aesthetic anchor: humanoid
  teenager robots at a gym in Wall-E illustration style, yellow tile floor,
  magenta gym wall, teal-glint horizon band cresting under a dark sky. Wall-E
  proportions (chunky cartoon body, dark visor eye-band, exposed yellow
  torso). If this file doesn't exist yet (first generation), seed it by
  running once with only `color_palette` + `style_type: AUTO` and save the
  PNG output here.
- **`color_palette.members`** — five weighted members. `console-bg` (#0a0e14)
  dominates at 0.45 so the dark terminal surface is the ground. Teal at 0.20
  is the primary accent (the cursor / prompt color); amber at 0.15 is the
  warm highlight; magenta at 0.10 is the reserved signal; slate-200 at 0.10
  keeps the subject from going stark white.
- **`style_type: AUTO`** — required when `style_reference_images` is uploaded;
  the v3 API rejects `DESIGN` / `REALISTIC` / `FICTION` in that combination.
  AUTO lets the reference image carry the aesthetic.
- **`magic_prompt: OFF`** — non-negotiable. Magic-prompt rewrites the prompt
  before generation; rewriting is the largest source of drift across
  "identical" requests.
- **`negative_prompt`** — short on purpose:
  `text, typography, lettering, logos, watermarks, central subject filling
  frame, photorealistic human faces, saturated, rainbow, vibrant, oversized
  subject, subject in top half`. The trailing `oversized subject` /
  `subject in top half` exclusions defend the SVG-overlay zone in tall
  aspect ratios.
- **`seed: 2048`** — fixed canonical seed for the skills splash family. Bump
  only when the visual canon itself shifts (rebrand, new reference image,
  palette redo).
- **`rendering_speed: QUALITY`** — for production assets. `TURBO` / `FLASH`
  are for prompt iteration only.
- **`empty_region_content`** — locked at the project level (not per-request)
  to `"dark gradient sky with faint teal glint at the horizon"`. Same sky
  in all four crops; otherwise the family drifts even with everything else
  identical.

### The variable channels (the only things you change)

- **`prompt`** — one sentence, ≤220 characters, two clauses:
  1. **Empty region first** — declare the top region as empty negative space
     and give it the locked `empty_region_content` (the teal-glint sky).
  2. **Subject second** — what the bottom 2/3 contains. Skills-splash subjects
     lean on the **robot-gym canon**: humanoid teenager robots at a gym in
     Wall-E illustration style, working out with barbells, dumbbells, bench-
     press rigs. **Never humans, never logos, never literal product UI
     screenshots.** Humanoid robots (clearly mechanical, not biological) are
     the only character class.

  **Conceptual thread:** the imagery is a visual metaphor for what the splash
  catalogs — *agents developing skills*. Robots literally "develop skills"
  at the gym by lifting weights and getting stronger; the AI agents reading
  this catalog develop skills the same way, one rep at a time. The
  metaphor is the family glue.

  Canonical subject themes (rotate across generations, not within a single
  family-of-four — for one set of four, use the **same prompt** with only
  `aspect_ratio` varying so the style_reference can anchor all four crops):

  - *a few humanoid teenager robots at a gym, pumping iron*
  - *three humanoid teenager robots overhead-pressing barbells in a row*
  - *humanoid teenager robots squatting and bench-pressing on yellow gym tile*
  - *humanoid teenager robots warming up with dumbbells along a magenta gym wall*
  - *a row of humanoid teenager robots spotting each other at a bench-press rig*

  The "**teenager**" modifier matters — it pushes proportions taller and
  lankier than Wall-E's smol cousin defaults; without it the robots come
  back chibi-scale. The number is left soft (`a few`, `a row of`) — Ideogram
  consistently returns 3-5 robots which matches the "a few" framing.

- **`aspect_ratio`** — pick from `imagery.aspect_ratios`:

  | Format key | Ideogram value | Use for |
  |---|---|---|
  | `banner_image` | `16x9` | OG / Twitter / Slack / generalized share |
  | `banner_image_tall` | `4x5` | **WhatsApp / iMessage (primary)** — close to 1x1, slightly taller |
  | `portrait_image` | `9x16` | Stories, Reels, TikTok, vertical feed |
  | `square_image` | `1x1` | Avatars, square unfurls, Discord embeds |

### Naming + preservation

Save canonical deliverables to `public/` as:

```
public/ogimage__Lossless-Agent-Skills--BannerImage.jpg       # 16x9 — OG / Twitter / Slack
public/ogimage__Lossless-Agent-Skills--BannerImageTall.jpg   # 4x5 — WhatsApp / iMessage (primary)
public/ogimage__Lossless-Agent-Skills--PortraitImage.jpg     # 9x16 — Stories / Reels / TikTok
public/ogimage__Lossless-Agent-Skills--SquareImage.jpg       # 1x1 — Avatars / square unfurls
```

Plus the `.png` style reference at
`public/ogimage__Lossless-Agent-Skills--Default.png` (re-uploaded on every
request as `style_reference_images`). The reference is not a deliverable —
it's the aesthetic anchor that keeps the four JPEGs above looking like family.

Per the `generate-consistent-og-images` skill's **preservation discipline**:

- Raw candidates from each run land in `.ideogram-candidates/<subject>-<aspect>-<timestamp>/` (dot-prefixed, outside `public/` so the Pages workflow doesn't deploy them).
- When replacing a canonical JPEG, move the old one to `.ogimage-archive/ogimage__Lossless-Agent-Skills--{Format}--{YYYY-MM-DD}.jpg` *before* writing the new one. The unfurler URL stays stable; old bytes survive in archive with a date stamp.

## Do's and Don'ts

- **Do** lead every section with a folio (`#01 · Featured`, `#02 · Recent`).
  The chapter-style numbering with the teal `#XX` prefix is the manual voice;
  sections without it don't read as part of the manual.
- **Do** keep JetBrains Mono as the dominant family for headlines AND meta.
  That's the defining type move; weakening it (e.g. swapping h1 to a sans
  display) collapses the brand into "another dark startup splash."
- **Do** use the SkillCard chrome (zero-radius hairline border, no shadow,
  hover thickens) on every card. Cards with rounded corners or shadows don't
  belong to the system; if you need a different chrome, push back on the
  requirement first.
- **Do** keep imagery on the robot-gym canon. The conceptual thread —
  *robots developing skills at the gym = agents developing skills via the
  catalog* — is the family glue. Subject variation is fine within that
  canon (different exercises, different rigs); subject *class* should stay
  humanoid teenager robots in Wall-E illustration style.
- **Do** persist the mode choice and resolve it pre-paint. Mode toggling
  must never FOUC; the inline pre-paint script in `BaseLayout` is mandatory.
- **Do** keep the `.bg-mesh` blueprint grid as the *only* ambient lighting
  layer. No radial mesh, no gradient washes, no noise — those belong to
  sibling splashes.
- **Do** match the three terminal-panel dot colors (amber / magenta / teal,
  left-to-right) to the gradient-text sweep direction. The visual rhyme
  between the dots and the gradient is the whole point of having both.

- **Don't** introduce a third typeface. JetBrains Mono + Inter is the
  contract; a serif or second sans dilutes the mono-as-display signal.
- **Don't** use mono for paragraph prose. Mono in paragraphs reads as code;
  long-form prose is Inter. Mono in headlines reads as command precisely
  *because* prose is sans.
- **Don't** hard-code color hex values in components. Every value must come
  from a semantic token (`var(--color-*)`); hard-coding breaks mode
  switching silently.
- **Don't** apply the `gradient-text` move to more than one or two words at
  a time. It's a hero accent on a single word in the h1; reusing it on
  phrases dilutes the move.
- **Don't** soften the SkillCard corners past `0` (zero radius). The brutalism
  is the divergence from sibling splashes; rounding it up drifts the brand
  back toward generic dark-tech-startup territory.
- **Don't** add a shadow to any card in dark mode. `--shadow-card: 0 0 0
  transparent` is intentional — depth comes from the elevated surface tier,
  not from glow.
- **Don't** add a second background layer behind the blueprint grid. The grid
  is the ambient ground; a second layer (mesh, wash, noise) breaks the console
  feel.
- **Don't** put humans, logos, or product screenshots in OG imagery.
  Humanoid robots are the only character class — they read as agents
  (mechanical, learning, on-purpose), not as people. A photoreal human face
  in a share preview collapses the metaphor.
- **Don't** vary `seed`, `magic_prompt`, `style_type`, `color_palette`,
  `style_reference_images`, OR `empty_region_content` per Ideogram request.
  Two channels vary (`prompt` and `aspect_ratio`); the rest are locked at
  the project level exactly so that variation looks like family, not chaos.
- **Don't** overwrite a canonical OG JPEG in place when re-running. Archive
  the previous bytes to `.ogimage-archive/ogimage__Lossless-Agent-Skills--{Format}--{YYYY-MM-DD}.jpg`
  first, then write the new pick to the canonical path. The unfurler URL
  stays stable; byte history is preserved.
- **Don't** put raw Ideogram candidates inside `public/`. The Pages workflow
  ships everything under `public/` verbatim — ~1.4 MB per PNG ships otherwise.
  Candidates live in `.ideogram-candidates/`, dot-prefixed, outside `public/`.
- **Don't** rebrand the `$_` mark to a glyph icon. The shell prompt IS the
  logo; replacing it with a generic icon erases the operator-manual posture
  in one move.
