{
  "kata": "0.1",
  "system": {
    "name": "Leaf",
    "compiledFrom": [
      {
        "kind": "code",
        "ref": "docs/.vitepress/theme/components/Home/ui.ts",
        "method": "parsed",
        "note": "The marketing component vocabulary, written down. Closed seven of the eleven open questions."
      },
      {
        "kind": "tokens",
        "ref": "docs/.vitepress/theme/styles/home.css",
        "method": "parsed",
        "note": "--home-* palette for the landing, light and dark."
      },
      {
        "kind": "tokens",
        "ref": "docs/.vitepress/theme/styles/index.css",
        "method": "parsed",
        "note": "Brand values and vitepress overrides. Mixed scope: some values here are docs-only."
      },
      {
        "kind": "code",
        "ref": "docs/.vitepress/theme/components/Home/Hero.vue",
        "method": "parsed"
      },
      {
        "kind": "url",
        "ref": "https://v5-x.leafphp.dev",
        "method": "computed-style inspection at three widths"
      },
      {
        "kind": "note",
        "ref": "design notes, prior session",
        "method": "human-written prose"
      }
    ],
    "compiledAt": "2026-08-03",
    "widths": [
      1280,
      900,
      390
    ],
    "complete": true,
    "note": "1440 was not reachable (inspection pane clamps at 1280). 1280 is the site's last breakpoint (Tailwind xl), so every step of the type ramp and every grid collapse was still exercised. 390 and 900 measured directly."
  },
  "surfaces": {
    "marketing": {
      "description": "Landing and product pages, including satellite products on their own subdomains. Light by default, with a stated dark counterpart.",
      "appliesTo": [
        "leafphp.dev/",
        "*.leafphp.dev/",
        "design.hanabira.dev/"
      ],
      "roles": {
        "page": {
          "value": "#FAF7F2",
          "confidence": "stated",
          "source": "Michael, review 2026-08-03. Production ships #FDFBF7 and should migrate.",
          "conflict": "paper-value",
          "note": "The decision moves muted text #737373 to 4.44:1 on this paper — below AA, where it scraped past at 4.59:1 on the shipped value. Recorded under contrast-policy."
        },
        "band": {
          "value": "rgba(245,245,245,.6) over page",
          "confidence": "stated",
          "source": "ui.band bg-neutral-100/60",
          "role": "full-width alternating band behind a section"
        },
        "card": {
          "value": "#FFFFFF",
          "confidence": "stated",
          "source": "ui.card, ui.panel, ui.tile all bg-white",
          "note": "#FDFBF9 is the docs card token and does not apply here. Question closed."
        },
        "cardHover": {
          "value": "#FAFAFA",
          "confidence": "stated",
          "source": "--home-surface-hover, ui.card hover:bg-neutral-50"
        },
        "surfaceMuted": {
          "value": "#F5F5F5",
          "confidence": "stated",
          "source": "--home-surface-muted"
        },
        "hairline": {
          "value": "rgba(0, 0, 0, .08)",
          "confidence": "stated",
          "source": "border-black/[0.08] throughout ui.ts",
          "note": "The warm hairline rgba(25,18,7,.08) recorded in the previous compile is --leaf-border, a docs-side value. Marketing hairlines are neutral black at 8%."
        },
        "textPrimary": {
          "value": "#0A0A0A",
          "confidence": "stated",
          "source": "--home-fg, ui.title text-neutral-950",
          "conflict": "hero-title-colour"
        },
        "textSecondary": {
          "value": "#737373",
          "confidence": "stated",
          "source": "--home-muted, ui.subtitle text-neutral-500",
          "note": "4.59:1 on page, 4.74:1 on card. Passes AA for body text, with no margin."
        },
        "codeMuted": {
          "value": "#A3A3A3",
          "confidence": "stated",
          "source": "--home-code-muted",
          "fails": "2.31:1 on codeSurface #F5F5F5. Well below AA at any size."
        },
        "accent": {
          "value": "#D4652E",
          "confidence": "stated",
          "role": "flame, the one loud colour",
          "fails": "3.56:1 as eyebrow text on page, at 11px. Below AA for text that size."
        },
        "accentHover": {
          "value": "#D7662F",
          "confidence": "stated",
          "source": "Michael, review 2026-08-03. The #BE4A1F token in index.css is stale and should be updated.",
          "conflict": "accent-hover"
        },
        "accentWarm": {
          "value": "#F5B731",
          "confidence": "stated"
        },
        "accentTint": {
          "value": "rgba(212, 101, 46, .07)",
          "confidence": "stated",
          "source": "--leaf-tint",
          "note": "Exists in the shared sheet. The ghost button does NOT use it on hover; it uses neutral-50."
        },
        "accentTintBorder": {
          "value": "rgba(212, 101, 46, .16)",
          "confidence": "stated",
          "source": "--leaf-tint-border"
        },
        "onAccent": {
          "value": "#FFFFFF",
          "confidence": "stated",
          "fails": "3.68:1 against accent. Below AA for text under 18.66px bold. The primary button is 14px medium."
        },
        "codeSurface": {
          "value": "#F5F5F5",
          "confidence": "stated",
          "source": "--home-code-bg",
          "note": "Marketing code is LIGHT. The warm-dark #1E1714 in the previous compile is the docs code block, harvested across surfaces — the same mistake as the text trio."
        },
        "codeText": {
          "value": "#171717",
          "confidence": "stated",
          "source": "--home-code-fg"
        },
        "terminalSurface": {
          "value": "#FAFAFA",
          "confidence": "stated",
          "source": "--home-terminal-bg"
        },
        "terminalHeader": {
          "value": "#F5F5F5",
          "confidence": "stated",
          "source": "--home-terminal-header"
        }
      }
    },
    "marketingDark": {
      "description": "The landing at night. Stated in the same files, one block below the light values.",
      "appliesTo": [
        "leafphp.dev/",
        "*.leafphp.dev/"
      ],
      "activatedBy": [
        "html.dark"
      ],
      "roles": {
        "page": {
          "value": "#110E0B",
          "confidence": "stated",
          "source": "index.css html.dark --vp-c-bg"
        },
        "pageAlt": {
          "value": "#0A0807",
          "confidence": "stated"
        },
        "textPrimary": {
          "value": "#FAFAFA",
          "confidence": "stated",
          "source": "--home-fg dark"
        },
        "accentOnDark": {
          "value": "#D4652E",
          "confidence": "stated",
          "source": "Michael, review 2026-08-03: the accent matches the primary on dark surfaces. 5.43:1 on terminalSurface, 5.22:1 on page — passes. The invented #4FBF8B is retired."
        },
        "textSecondary": {
          "value": "#A3A3A3",
          "confidence": "stated",
          "source": "--home-muted dark",
          "note": "7.63:1 on page. Passes."
        },
        "codeText": {
          "value": "#E5E5E5",
          "confidence": "stated"
        },
        "codeMuted": {
          "value": "#737373",
          "confidence": "stated"
        },
        "terminalSurface": {
          "value": "#0A0807",
          "confidence": "stated"
        },
        "terminalHeader": {
          "value": "#110E0B",
          "confidence": "stated"
        },
        "hairline": {
          "value": "rgba(255, 255, 255, .08)",
          "confidence": "stated",
          "source": "border-white/[0.08] throughout ui.ts"
        }
      }
    },
    "docs": {
      "description": "The vitepress documentation theme. Present in the repo, and NOT a source for any other surface.",
      "appliesTo": [
        "docs/**",
        "leaf-docs/**"
      ],
      "roles": {},
      "note": "Deliberately empty. The previous compile harvested three values from here and called them marketing tokens: the text trio (#3C3C43/#67676C/#929295), the warm hairline rgba(25,18,7,.08), and the dark code block #1E1714. All three are corrected in this compile. Do not harvest from this surface."
    }
  },
  "type": {
    "pairing": {
      "display": "Bricolage Grotesque",
      "text": "Bricolage Grotesque",
      "mono": "ui-monospace, Menlo, Monaco, Consolas",
      "confidence": "measured",
      "note": "One family for display and body, measured on the live landing. Where this pairing is written down as a decision was not found in the repo. See unspecified/type-pairing-provenance."
    },
    "eyebrow": {
      "family": "mono",
      "size": "0.6875rem",
      "transform": "uppercase",
      "tracking": "0.2em",
      "textColour": "accent",
      "prefix": "// ",
      "prefixColour": "#A3A3A3 light / #525252 dark",
      "confidence": "stated",
      "source": "ui.eyebrow",
      "note": "This inverts the previous compile on three counts: eyebrows ARE uppercase, the text is accent-coloured, and the // prefix is the muted part. The prior 'prefix carries the emphasis' reading was a page-level invention. Question eyebrow-case closed."
    },
    "ramp": {
      "heroH1": {
        "base": "2.25rem/36px",
        "sm640": "3rem/48px",
        "lg1024": "3.75rem/60px",
        "xl1280": "6rem/96px",
        "confidence": "stated",
        "source": "Hero.vue text-4xl sm:text-5xl lg:text-6xl xl:text-8xl",
        "measured": {
          "390": "36px",
          "900": "48px",
          "1280": "96px"
        }
      },
      "sectionTitle": {
        "value": "clamp(1.875rem, 4vw, 2.75rem)",
        "confidence": "stated",
        "source": "ui.title"
      },
      "displayLarge": {
        "value": "clamp(2.25rem, 5.5vw, 4.5rem)",
        "confidence": "stated",
        "source": "home.css"
      },
      "subtitle": {
        "value": "1.0625rem",
        "confidence": "stated",
        "source": "ui.subtitle"
      },
      "heroSubtitle": {
        "base": "1.125rem",
        "md768": "1.25rem",
        "confidence": "stated",
        "source": "ui.heroSubtitle"
      },
      "note": "Question mobile-everything closed. The ramp is stated in source and was verified at 390, 900 and 1280."
    }
  },
  "space": {
    "scale": [
      4,
      8,
      12,
      16,
      20,
      24,
      32,
      40,
      48,
      64,
      80,
      96,
      128
    ],
    "basis": "Tailwind default scale, stated through utility classes across every marketing component",
    "enforce": false,
    "confidence": "stated",
    "sectionRhythm": "py-24 lg:py-32 (96px, 128px at lg)",
    "container": "max-w-6xl (1152px), px-4 sm:px-6 lg:px-8 — measured 16/24/32 at 390/900/1280",
    "note": "The scale exists and is real. Whether off-scale values are a violation is not stated; arbitrary values appear for type sizes (text-[0.6875rem]) but not for spacing. See unspecified/spacing-enforce."
  },
  "composition": {
    "breakpoints": [
      {
        "name": "sm",
        "min": 640,
        "intent": "container padding steps up 16 to 24, hero type 36 to 48",
        "confidence": "stated",
        "source": "Tailwind defaults, used throughout"
      },
      {
        "name": "md",
        "min": 768,
        "intent": "hero subtitle steps up",
        "confidence": "stated"
      },
      {
        "name": "lg",
        "min": 1024,
        "intent": "two-column panels collapse below this. Hero editor/terminal pair verified stacking at 900.",
        "confidence": "stated"
      },
      {
        "name": "xl",
        "min": 1280,
        "intent": "hero display reaches full 96px",
        "confidence": "stated"
      }
    ],
    "grid": [
      {
        "id": "shared-tracks",
        "rule": "Stacked grids share column tracks and gaps. A section heading that sits above a list must use the same track definition as the list.",
        "why": "Two grids in the same column with different tracks read as two unrelated pages.",
        "check": "For each section, compare grid-template-columns and gap of the heading block against the content grid beneath it.",
        "checkable": "auto",
        "source": "stated in review, reference run round 2",
        "confidence": "stated"
      },
      {
        "id": "paired-panes-share-rows",
        "rule": "Side-by-side comparison panes share row tracks, so headings and footers across the pair sit on the same line.",
        "why": "Independently sized panes in a comparison undercut the comparison.",
        "check": "Paired panes use grid-template-rows: subgrid, or equivalent equal-height behaviour.",
        "checkable": "model",
        "source": "reference run round 1, human-flagged",
        "confidence": "inferred"
      },
      {
        "id": "stack-on-content",
        "rule": "A grid collapses at the width its content stops fitting, not at the shared breakpoint.",
        "why": "Dense columns need to stack earlier than sparse ones. One global breakpoint clips the dense case.",
        "check": "manual",
        "checkable": "manual",
        "source": "reference run, self-caught at 1020px",
        "confidence": "inferred"
      },
      {
        "id": "hairline-tile-grid",
        "rule": "Grids of tiles use a 1px gap over a hairline-coloured bed, not per-tile borders.",
        "why": "Shared hairlines read as one drawn grid. Doubled borders read as boxes that happen to touch.",
        "check": "Tile containers use gap-px with the bed background set to the hairline colour.",
        "checkable": "auto",
        "source": "ui.tilebed",
        "confidence": "stated"
      }
    ],
    "alignment": [
      {
        "id": "numeric-columns",
        "rule": "Stacked figure-and-label rows reserve a fixed width for the figure so labels start on one axis.",
        "check": "Figures in a repeated row set min-width.",
        "checkable": "auto",
        "source": "reference run round 1",
        "confidence": "inferred"
      },
      {
        "id": "balanced-display-lines",
        "rule": "Display type balances. Body ledes balance. No line ends with an orphan of one or two words.",
        "check": "text-wrap: balance on display and lede, plus a rendered check that no line holds under three words.",
        "checkable": "model",
        "source": "stated, prior sessions; Hero.vue h1 carries text-balance",
        "confidence": "stated",
        "note": "The reference run held this rule and violated it in two consecutive rounds. Distribution is not compliance."
      }
    ],
    "motion": [
      {
        "id": "buttons-change-colour-only",
        "rule": "Buttons transition colour only. They do not lift, scale or translate.",
        "check": "Button classes declare transition-colors and no transform on :hover.",
        "checkable": "auto",
        "source": "ui.btn transition-colors duration-150, verified in source",
        "confidence": "stated",
        "note": "Question hover-motion closed. One stated exception: arrow glyphs inside text links nudge 1px diagonal on hover (ui.link). The exception belongs to links, never to buttons."
      }
    ]
  },
  "patterns": {
    "chip": {
      "use": "A single piece of status attached to an object. Version, state, count.",
      "spec": {
        "shape": "pill",
        "bg": "card",
        "border": "hairline",
        "family": "mono",
        "size": "0.75rem",
        "text": "textSecondary",
        "dot": "6px round, accent"
      },
      "neverUse": [
        "a list of names",
        "tool or product wordmarks",
        "navigation",
        "anything the reader scans rather than reads"
      ],
      "instead": {
        "a list of names": "wordmarkRow"
      },
      "confidence": "stated",
      "source": "ui.badge; the neverUse half from the reference run review"
    },
    "wordmarkRow": {
      "use": "A row of product or tool names shown as plain text on the page background, generously spaced, no container.",
      "neverUse": [
        "a single item",
        "anything with state"
      ],
      "confidence": "stated",
      "source": "review, alchemy site convention"
    },
    "sectionNumber": {
      "use": "Small mono numeral above a heading, with a short accent rule beneath it.",
      "spec": {
        "family": "mono",
        "size": ".78rem",
        "rule": "40px x 4px, accent, 80% opacity"
      },
      "confidence": "measured"
    },
    "cornerMarker": {
      "use": "5px square accent markers on the corners of a bordered panel. All four corners, offset half outside the border.",
      "spec": {
        "size": "5px",
        "shape": "square",
        "colour": "accent",
        "corners": 4
      },
      "appliesTo": "ui.panel — used across ten of the eleven Home components",
      "neverUse": [
        "round dots (that is the badge dot, a different element)",
        "a subset of corners"
      ],
      "confidence": "stated",
      "source": "ui.marker + markerTL/TR/BL/BR",
      "note": "Question corner-tick-scope closed. The previous compile conflated this with the 6px round badge dot and the reference run shipped 2-corner round dots — wrong shape, size and count."
    },
    "primaryButton": {
      "use": "The one loud action. Accent fill, white text, square corners, 40px tall.",
      "spec": {
        "height": "40px",
        "padding": "0 16px",
        "size": "0.875rem",
        "radius": 0,
        "shadow": "0 16px 34px -24px rgba(232,117,58,.8)"
      },
      "confidence": "stated",
      "source": "ui.btn + ui.btnPrimary",
      "conflict": "shadow-policy",
      "note": "The stated shadow contradicts the observed no-shadows prohibition. Recorded as a conflict, not resolved here."
    },
    "ghostButton": {
      "use": "Secondary action beside a primary. Hairline border, primary text, square.",
      "spec": {
        "border": "hairline",
        "text": "textPrimary",
        "hover": "border-neutral-300 + bg-neutral-50"
      },
      "confidence": "stated",
      "source": "ui.btnGhost",
      "note": "Question secondary-action closed. It exists, and its hover is neutral, not accent-tinted. The reference run's tint-fill hover was an invention."
    },
    "terminal": {
      "use": "Command output in a bordered block with a header strip. Light neutral surfaces in light mode, near-black warm in dark.",
      "spec": {
        "bg": "terminalSurface",
        "header": "terminalHeader",
        "body": "mono 0.8125rem / 1.75",
        "radius": 0
      },
      "confidence": "stated",
      "source": "ui.terminal*"
    },
    "stripes": {
      "use": "Diagonal hairline stripes as a filler texture inside empty or decorative panel areas.",
      "spec": "repeating-linear-gradient 315deg, 1px lines at 5% black (5.5% white dark), 9px period",
      "confidence": "stated",
      "source": "ui.stripes"
    }
  },
  "prohibitions": [
    {
      "id": "no-traffic-lights",
      "rule": "No fake window chrome. No traffic lights, no title bars, no browser frames around anything that is not a browser.",
      "source": "stated",
      "evidence": "design notes; the shipped terminal header carries a label only, no dots",
      "checkable": "auto"
    },
    {
      "id": "gradient-is-frontline-only",
      "rule": "The brand gradient on display type belongs to Leaf and Hanabira, the frontline runners, and must never transfer to any other product. A satellite or derived product uses plain accent colour on display type.",
      "source": "stated",
      "evidence": "Michael, review 2026-08-03, resolving conflict gradient-policy",
      "checkable": "auto",
      "note": "This replaces the blanket no-gradient-titles note, which was true for satellites and wrong for the frontline brands."
    },
    {
      "id": "no-shadows",
      "rule": "Elevation is a hairline border, never a shadow. One discretionary exception: the primary button's accent glow may be applied where it fits the design and background in use.",
      "source": "stated",
      "evidence": "observed across all surfaces; exception stated by Michael, review 2026-08-03",
      "checkable": "model",
      "note": "The exception is a judgement call by design, so the check downgraded from auto to model."
    },
    {
      "id": "no-emoji-icons",
      "rule": "Icons are drawn, never typed. No emoji anywhere in the interface.",
      "source": "stated",
      "evidence": "design notes",
      "checkable": "auto"
    },
    {
      "id": "no-sparkle",
      "rule": "No four-point sparkle in any form. It reads as a machine-made badge.",
      "source": "stated",
      "evidence": "design notes",
      "checkable": "auto"
    },
    {
      "id": "no-rounded-components",
      "rule": "Buttons, cards, panels, tiles and terminals are square. rounded-none is written on every one of them. The pill badge is the single exception.",
      "source": "stated",
      "evidence": "ui.ts",
      "checkable": "auto"
    }
  ],
  "conflicts": [
    {
      "id": "paper-value",
      "claim": {
        "value": "#FAF7F2",
        "source": "design notes"
      },
      "observed": {
        "value": "#FDFBF7",
        "source": "index.css:1075, stated in code and measured live"
      },
      "resolution": "#FAF7F2. Michael, review 2026-08-03. Production ships #FDFBF7 and should migrate to the note value.",
      "blocking": false
    },
    {
      "id": "gradient-policy",
      "claim": {
        "value": "no gradient titles",
        "source": "design notes"
      },
      "observed": {
        "value": "four-stop gradient on the hero display line, stated in source",
        "source": "Hero.vue:46 — linear-gradient(135deg, #F5B731, #E8753A, #D4542B, #C0392B) with bg-clip-text"
      },
      "resolution": "Gradient display is Leaf and Hanabira brand identity, prohibited for every other product. Michael, review 2026-08-03. Encoded as prohibition gradient-is-frontline-only.",
      "blocking": false,
      "note": "Now confirmed in code, not just on the rendered page. The exact stops are written in the component. A compiler must not pick between the note and the shipped hero."
    },
    {
      "id": "accent-hover",
      "claim": {
        "value": "#BE4A1F",
        "source": "index.css --vp-button-brand-hover-bg"
      },
      "observed": {
        "value": "#D7662F",
        "source": "ui.ts btnPrimary hover:bg-[#d7662f]"
      },
      "resolution": "#D7662F. Michael, review 2026-08-03. The index.css token is stale.",
      "blocking": false,
      "note": "Two stated hover colours for the same primary button, one darker than rest, one lighter. Both ship."
    },
    {
      "id": "shadow-policy",
      "claim": {
        "value": "no shadows anywhere (observed across all surfaces)",
        "source": "live inspection"
      },
      "observed": {
        "value": "stated accent glow on the primary button: shadow-[0_16px_34px_-24px_rgba(232,117,58,0.8)]",
        "source": "ui.ts btnPrimary"
      },
      "resolution": "Conditional: the glow applies only where it fits the design and background in use. Michael, review 2026-08-03. No-shadows remains the default elsewhere.",
      "blocking": false,
      "note": "Note the measured live button showed no shadow — the class is stated but did not render on the inspected instance. Both facts recorded."
    },
    {
      "id": "hero-title-colour",
      "claim": {
        "value": "#0A0A0A (neutral-950), the stated title colour",
        "source": "ui.title, --home-fg"
      },
      "observed": {
        "value": "#3C3C43 on the shipped hero h1, inherited from the vitepress default --vp-c-text-1, which Leaf never overrode",
        "source": "live inspection at 1280"
      },
      "resolution": "Not the vitepress default. Use Tailwind neutrals or brand variables (neutral-950 per ui.title). Michael, review 2026-08-03 — production hero should be fixed.",
      "blocking": false,
      "note": "The hero headline is rendering in a docs-theme default, most likely unintentionally. This is the one place the docs theme leaks into marketing in production."
    }
  ],
  "unspecified": [
    {
      "id": "contrast-policy",
      "question": "Four stated pairs now sit below AA (the 4.5:1 minimum for body text, 3:1 for large text): white-on-accent buttons 3.68:1, accent eyebrows 3.56:1 at 11px, code comments 2.31:1, and muted body text 4.44:1 on the newly decided #FAF7F2 paper. Which must be fixed and which are exempt as decorative?",
      "assumed": "Shipped as stated.",
      "raisedBy": "compile",
      "severity": "high",
      "status": "open",
      "note": "AA was explained in review 2026-08-03; the decision itself is still pending."
    },
    {
      "id": "theme-default",
      "question": "Does a satellite product page default to light or dark? Both are fully stated.",
      "assumed": "Light.",
      "raisedBy": "compile",
      "severity": "medium",
      "status": "closed",
      "closedBy": "Michael, review 2026-08-03: follow system settings (prefers-color-scheme). Neither mode is the default; the OS decides."
    },
    {
      "id": "accent-on-dark",
      "question": "Which accent survives on the dark terminal surface #0A0807? The reference run invented #4FBF8B and nothing in source answers it.",
      "assumed": "#4FBF8B, invented.",
      "raisedBy": "compile",
      "severity": "medium",
      "status": "closed",
      "closedBy": "Michael, review 2026-08-03: the accent matches the primary, #D4652E. 5.43:1 on the dark terminal — passes. #4FBF8B retired."
    },
    {
      "id": "spacing-enforce",
      "question": "The Tailwind scale is real, but is an off-scale value a violation? Arbitrary values already appear for type sizes.",
      "assumed": "Not enforced.",
      "raisedBy": "compile",
      "severity": "low",
      "status": "open"
    },
    {
      "id": "eyebrow-variants",
      "question": "ui.eyebrow tracks at 0.2em, ui.codeLabel at 0.08em, and one live instance measured 0.12em. One eyebrow with drift, or three intentional variants?",
      "assumed": "Two components, some drift.",
      "raisedBy": "compile",
      "severity": "low",
      "status": "open"
    },
    {
      "id": "type-pairing-provenance",
      "question": "Bricolage Grotesque for both display and body is measured everywhere but stated nowhere found. Intentional identity or interim?",
      "assumed": "Intentional.",
      "raisedBy": "compile",
      "severity": "low",
      "status": "open"
    },
    {
      "id": "mobile-everything",
      "question": "Breakpoints, mobile type ramp, mobile spacing and control sizing.",
      "raisedBy": "review",
      "severity": "high",
      "status": "closed",
      "closedBy": "This compile. The ramp and breakpoints are stated in source (Tailwind sm/md/lg/xl plus stated clamps) and were measured at 390, 900 and 1280."
    },
    {
      "id": "surface-text-colours",
      "question": "What are the marketing surface's own text colours?",
      "raisedBy": "compile",
      "severity": "high",
      "status": "closed",
      "closedBy": "home.css --home-fg/--home-muted and ui.ts neutrals: #0A0A0A / #737373 / #A3A3A3. The docs trio is expunged. Residue recorded as conflict hero-title-colour."
    },
    {
      "id": "spacing-scale",
      "question": "What is the spacing scale?",
      "raisedBy": "compile",
      "severity": "high",
      "status": "closed",
      "closedBy": "Tailwind default scale, stated via classes. Enforcement remains open as spacing-enforce."
    },
    {
      "id": "card-background",
      "question": "Card background is #FFFFFF, #FAFAFA or #FDFBF9 depending on where you look.",
      "raisedBy": "compile",
      "severity": "low",
      "status": "closed",
      "closedBy": "ui.ts: cards are #FFFFFF, #FAFAFA is the hover state, #FDFBF9 is docs-only."
    },
    {
      "id": "secondary-action",
      "question": "Is there a ghost button?",
      "raisedBy": "compile",
      "severity": "medium",
      "status": "closed",
      "closedBy": "ui.btnGhost. Hairline border, neutral hover, no accent tint."
    },
    {
      "id": "corner-tick-scope",
      "question": "Do corner ticks belong to hero panels, or to any bordered surface?",
      "raisedBy": "compile",
      "severity": "low",
      "status": "closed",
      "closedBy": "ui.marker: 5px squares, four corners, on ui.panel, used across ten Home components."
    },
    {
      "id": "eyebrow-case",
      "question": "Is dropping the uppercase transform on eyebrows correct?",
      "raisedBy": "compile",
      "severity": "low",
      "status": "closed",
      "closedBy": "No. ui.eyebrow is uppercase, 0.2em tracking, accent text with a muted // prefix. The previous reading was inverted."
    },
    {
      "id": "hover-motion",
      "question": "Confirmed that buttons never move on hover?",
      "raisedBy": "compile",
      "severity": "low",
      "status": "closed",
      "closedBy": "ui.btn declares transition-colors only. Link arrow glyphs nudge 1px; buttons never move."
    },
    {
      "id": "text-tertiary-contrast",
      "question": "Original phrasing of the contrast question, superseded.",
      "raisedBy": "review",
      "severity": "high",
      "status": "closed",
      "closedBy": "Reframed as contrast-policy with the corrected stated values. The 3.0:1 tertiary it referenced was a docs-theme value that no longer exists in this file."
    }
  ]
}
