# SUDX Changelog

## 6.0.0 - 2026-10-14

- The SUDX X is redrawn as two crossing routes: an Ink route passing over a
  Clay route that breaks where they meet. It replaces the four-wedge quadrant
  X, which read as aggressive and top-heavy.
- The mark's parts are now `.sudx-mark__ink` and `.sudx-mark__clay`, replacing
  `.sudx-mark__wedges` and `.sudx-mark__core`. A consumer that copies the new
  `recipes.css` must replace its inline mark too, or the mark loses its colours.
  This is the contract break the major bump names.
- `sudx-x.svg`, `sudx-wordmark.svg`, and `sudx-lockup.svg` carry the new
  geometry. In both drawn forms the X now stands at the height of the letters
  instead of below it.
- `.sudx-wordmark` has no gap: the mark's own margin spaces it like the fourth
  letter.
- 1X clearspace is now the width of one route, where the quadrant X measured it
  from its centre diamond.

## 5.1.0 - 2026-08-18

- The public Design Portal now opens with a finished Dither Signal Trace
  exhibit, then explains the problem, compares Expressive, Compact, and Clean
  treatments, and keeps the complete technical reference secondary.
- One catalog sample owns the exact domain, selected and context values, W4
  gap, provenance, disclosure, and variant guidance used by the page, SVG
  fallback, Canvas renderer, accessible tables, and agent guide.
- Catalog records now declare whether they are curated, technical reference,
  or retired. Dither is the first curated exhibit, Motion ticker is retained as
  an auditable retirement, and the other records remain searchable technical
  guidance.
- `/assets/dither.js` is now a portable manifest-listed asset. It renders
  Expressive and Compact texture while Clean preserves the same exact lines
  and missing-data rule without loading texture.
- `/design/agent-guide.md` is generated from the catalog. Its compact Dither
  decision index names the communication job, use and avoid guidance, three
  variants, public-safe provenance, stable page anchors, and verified asset
  paths.
- Tree, Gallery, Release routing, duplicate specimens, drawers, tabs, and the
  arrival ribbon are removed. The current manifest-backed distribution remains
  intact inside Technical Reference, with no frozen snapshot.

## 5.0.0 — 2026-08-17

- Frozen release snapshots are removed. `design/releases/<version>/` no longer
  exists and its 24 published directories are deleted. A consumer that pinned
  one of those URLs must move to `/design/assets/`, which is now the only
  distribution surface. This is the contract break the major bump names.
- `/design/assets/manifest.json` carries a sha256 for every published file and
  is what a consumer records after copying. It replaces the per-release
  manifest and `SHA256SUMS`.
- Nothing under `/design/` is served immutable any more. Every file is
  revalidated, because every file is now rewritten in place by a deploy.
- The publishing ceremony is gone with the snapshots. `meta.version` in
  `tokens.json` is the only version left: `catalog.json` no longer mirrors it,
  catalog nodes no longer carry one, and the law documents no longer stamp one
  into their headings, where it went stale unnoticed.
- The 4.7.0 DRIFT and CMA Tracker consumer proofs move to
  `design-system/compatibility/shadcn-proofs.json`, unaltered and still bound to
  the foundation hashes they were taken against. They lived only in the frozen
  4.7.0 snapshot, and deleting that snapshot would have deleted the evidence.
- The design system's contents are otherwise unchanged: tokens, laws, recipes,
  and the compatibility profile all carry over from 4.8.0 exactly.

## 4.8.0 — 2026-08-17

- The dark theme is now a true-black ground with white type. Every dark
  neutral moved from warm graphite to untinted grey: ground `#000000`, panel
  `#121212`, sidebar `#0A0A0A`, hairline `#262626`, strong hairline `#3A3A3A`,
  active inset `#333333`, text `#FFFFFF`, muted `#A3A3A3`, tertiary `#8A8A8A`.
- Dark Clay brightens from `#E0946B` to `#FC9154`. It stays the single accent
  in both themes and keeps its hue exactly (OKLCH 48.8°); what moved is chroma,
  0.108 to 0.15, with lightness 0.734 to 0.76. The old value was mixed to hold
  its own against a warm graphite ground. Against true black that same colour
  reads washed out, because the ground no longer lends it any warmth.
- Light Clay is untouched at `#C56A4A`. The two themes have never shared an
  accent value and still do not.
- The semantic colors are untouched. Cost direction, warning, and projected
  keep their dark values, because they state facts rather than decorate
  chrome, and a white cost-down would say nothing.
- The light theme is untouched.
- Consumers copying the foundation take the new dark values with the release.
  A consumer that hardcoded a dark neutral instead of reading the token will
  not move with it and should be checked against this list.
- The shadcn and Tailwind v4 compatibility profile returns to `pending`, and no
  family is claimed verified for 4.8.0. A consumer proof is bound to the exact
  foundation bytes it was taken against; changing the dark tokens changed
  `sudx-tokens.css` and its normative hash, so the DRIFT and CMA Tracker proofs
  recorded in 4.7.0 prove that release and not this one. Carrying them forward
  would assert that two consumers rendered bytes they never saw. Both proofs
  remain unaltered and addressable in the frozen release at
  `design/releases/4.7.0/assets/compatibility/shadcn-evidence.json`.
- Restoring `candidate-proved` is follow-up work in the consumers, not here:
  re-render DRIFT and CMA Tracker against the 4.8.0 foundation, regenerate each
  consumer-owned evidence file, and record the new proof commits and hashes.

## 4.7.0 — 2026-08-16

- SUDX now publishes a framework-neutral shadcn and Tailwind v4 compatibility
  profile. It separates required foundation, six optional behavior families,
  and product-owned expression so future products can copy only what they need
  without becoming visual clones.
- The first compatibility release is bound to exact, remotely reachable DRIFT
  and CMA Tracker proof commits. Each record includes copied candidate hashes,
  lockfile-resolved environment, component-source hashes, a complete
  state/theme/motion matrix, rendered QA, local additions and deviations, and
  the SHA-256 of the consumer-owned evidence file.
- Compatibility remains a copy-and-own contract, not a React component package
  or runtime dependency. DRIFT keeps freight-rate and carrier expression; CMA
  keeps allocation, heatmap, route-map, density, and operations semantics.
- The generator fails closed when a candidate-proved record omits its durable
  proof pull request or exact evidence-file hash. Consumer proof is recorded as
  candidate-proved only; merge, deployment, and named-release binding remain
  separate later receipts.
- The required shadcn CSS now publishes `--radius: var(--sudx-radius)`, the
  profile distinguishes portable recipe assets from contract-only families,
  and validation fails closed on incomplete foundation, family, pending-note,
  and family-scoped deviation records.

## 4.6.0 — 2026-08-07

- Every deviation record now states the action that follows from its status.
  The register carried what departed, a status, and an owner's name, which
  together read as a demand with no instruction: an owner arriving at their own
  name beside `OPEN` had nothing telling them what was being asked. The record
  gains a required `action`, printed under `TO CLOSE`, `NO ACTION`, or
  `CLOSED BY` depending on the status it explains, and the generator refuses a
  record that omits it. This is what makes the release a minor rather than a
  patch — a consumer keeping its own register has a new field to fill.
- `--sudx-warning-light` is legible as small text. It measured 3.44:1 on Paper
  while `cost-up` and `cost-down` both sat near 5.26:1, so warning was the one
  semantic colour the system shipped without a step meaningful text could use —
  and it was already painting the 11px deviation status and the tab badge that
  announced the problem. It darkens to `#7F6523`, which measures 5.26:1 on
  Paper, 4.77:1 on Ivory, and 5.54:1 on Panel: the same step as its cost
  siblings, on the same hue. No second warning token; the system still ships
  one, and it now clears AA everywhere it was already being used.
- A test holds every light semantic colour to AA on Paper, Ivory, and Panel, so
  the step cannot be eyedroppered back to something decorative.
- The colour node's warning deviation is closed. The ticker node's landing
  deviation is accepted rather than open: no production surface runs the
  ticker, and the node is held Stable on purpose so a later surface can adopt
  it unchanged. Nothing about the node's contract changed.
- Only an open record flags its panel now. A settled register wore the same
  warning border as an unanswered one, which teaches an owner to ignore the
  border on the day it means something. A panel with nothing open states
  `NONE OPEN` and keeps the ordinary hairline.
- The tab ribbon reads `SHOWING · DEVIATIONS` rather than `OPEN · DEVIATIONS`.
  On that one tab the old wording sat inches from a deviation whose status is
  `OPEN` and meant nothing alike.
- A deviation row stacks on narrow viewports instead of scrolling sideways. The
  token table scrolls because its columns are aligned data; a deviation row is
  prose, and prose read through a sideways scroll is not read.

## 4.5.1 — 2026-08-07

- The dither field carries ink again. It painted only the cells the Bayer
  matrix lit, all at one flat alpha, so at most 40% of the field held colour
  and the rest showed the page straight through — roughly an eighth of full
  ink, a haze on Paper and hollow on Graphite, on the node whose whole purpose
  is showing a trend through texture density. Every cell is painted now and
  only the alpha varies: an unlit cell keeps the series colour at `OFF_TIER` of
  a lit one, and both tiers ramp with depth. Coverage still stops at
  `MAX_COVERAGE`, so the texture never closes into a solid and the data
  language is unchanged — what moved is how an unlit cell is drawn, not how
  many are lit.
- The field stays attached to the line it describes. Coverage ramped to zero at
  the value line and the first cell row started below it, so the fill parted
  from its own line and read as an unrelated block underneath. `FIELD_FLOOR`
  holds ink at the line and the first row now straddles it.
- A missing period states itself. The gap was drawn as nothing at all, which
  reads as a stretch of chart nobody finished. Each unobserved period takes a
  dashed rule in the colour of the series missing it — in the series colour
  rather than the hairline, which was invisible on Graphite, the theme where
  the gap most needed stating.
- Context series are told apart by more than colour. The node promised line
  style distinguished context from selection and only alpha ever did; context
  takes a dash now, and enough weight to hold where it crosses behind the
  selected field.
- The dither specimen demonstrates the language it documents. Five points with
  a gap at the third left two stub fills over an empty middle. Nine weeks, a
  context series that runs through the gap, and a peak landing exactly on the
  declared domain maximum now show the field, the split, the context line, and
  preserved endpoints in one reading.
- A gallery tile draws its chart. The specimen is reproduced in the gallery
  under a namespaced id and the initializer looked the canvas up by the node's
  id alone, so the tile for the charting node was the one that drew nothing.
- No token value changed and no rule changed meaning, so this publishes as a
  patch and every earlier release stays frozen at its own path.

## 4.5.0 — 2026-08-07

- The release publishes the component layer it was already asking consumers to
  reproduce. `recipes.css` now carries the panel, alert, chip, eyebrow, data
  label, page wrap, header, footer, navigation, wordmark, quadrant mark, and
  skip link, alongside the button, field, directory, toolbar, and theme toggle
  it already shipped. Until now those rules existed only in the website, so
  every consumer either invented its own or copied ours by hand, which is the
  silent fork the agent guide's last rule exists to prevent.
- The published button and theme toggle carry the control transition the motion
  law requires, the pointer cursor, and the inline-flex box every consumer was
  adding back. The theme toggle also publishes its square icon presentation:
  the hidden label and the half-moon that turns to face the theme it switches
  to. Shipping the states without the behaviour made the recipe incomplete.
- Reduced motion is honoured by the published recipes themselves rather than
  left to each consumer.
- Rule 5 of the agent guide, and the matching foundation principle, no longer
  forbid a runtime link outright. A consumer copies the release so its pages
  render when SUDX is unreachable, and may link the published sheets after that
  copy so a new release reaches what already shipped. Rendering only while
  sudx.io answers is still a dependency and still forbidden.
- No token value changed and no existing rule changed meaning, so this
  publishes as a minor and every earlier release stays frozen at its own path.

## 4.4.0 — 2026-08-07

- The tree answers the words a practitioner types. Search indexed only the
  branch label, the node title, and the purpose, so `button`, `chip`, `badge`,
  `dropdown`, and `checkbox` each emptied the whole tree while the node
  documenting buttons sat there named Actions. Every node now carries an
  `aliases` array, indexed alongside its state and token names, so `disabled`
  and `--sudx-accent` are answerable too. `aliases` is a required node field:
  a node cannot ship unsearchable. Searching for something the system does not
  have still returns nothing — there is no modal node — and the empty state
  names real nodes instead of restating that the search failed.
- Filtering announces its result. The match count reaches a live region, and
  the visible empty message is `aria-hidden` so it is not spoken twice.
- The quadrant mark and the formal lockup take `currentColor` for their ink.
  Every specimen embedded them as `<img>`, which cannot inherit the page's text
  colour, so in dark mode the wedges sat at `#1F1E1D` on a `#181818` ground and
  the mark vanished — on the node whose own token row promises the wedges are
  in text ink so the mark themes with the page. The four specimens that show a
  mark now inline the canonical file, so the specimen is the shipped asset
  rather than a copy that can drift, and the mark is never redrawn. Their
  recipes carry the inline SVG a consumer should paste, not the `<img>` that
  caused this. The clay diamond stays literal: it is the single brand accent
  and does not theme. A consumer embedding the raw file keeps a mark that reads
  correctly on any ground it inherits its colour from.
- The tree dropped the `Stable` badge beside every node. Lab left the catalog
  in 4.0.0 and the tests forbid its return, so all 28 nodes are Stable and the
  badge repeated a constant. It was also the page's worst type: 10px dimmed to
  75% opacity, below the `0.75rem` this system publishes as its Label voice. A
  node's status still appears once in its metadata record, where it is read as
  provenance rather than repeated as decoration.
- The portal shell fits one screen with the arrival ribbon raised. The app was
  sized against the header alone, so a claim ribbon pushed the shell down by
  its own height, cut off the header, and left part of both panes below a fold
  the reader could not scroll to. The shell is a column now: the header and the
  ribbon take their height and the app takes what is left.
- Removed the `.design-status` rules and the Lab tree styling, both dead since
  the catalog reduction, and both quarantining a semantic colour into a
  non-semantic meaning.

## 4.3.0 — 2026-08-06

- The analysis toolbar is a shipped component. The node had described a control
  region since 3.0.0 while its specimen drew a browser-default select, two
  buttons the tree styled itself, and a loose chip — nothing a product could
  copy, and nothing that showed the four jobs the purpose claimed. `sudx-toolbar`
  now carries the view switch, the range, the comparison, the applied filters,
  and the primary view action, and ships as `recipes/toolbar.html`.
- The toolbar states the scope it holds. Under the controls, one mono line
  resolves the range to dates, names the span, counts the applied filters, gives
  the comparison period, and stamps the observation cutoff — announced once
  through `aria-live="polite"`. Scope that lives only inside control chrome is
  scope the reader has to reconstruct from four separate widgets.
- The view switch is a native radio group under segment chrome, so arrow keys,
  the accessibility tree, and the submitted value survive the styling. Selection
  fills the segment and marks it with an inset accent rule, which costs no
  layout.
- The range and the comparison reuse the field slot, so each keeps its period
  inside its own boundary: the range rail reads the span, and the comparison
  rail resolves `Prior period` to the weeks it actually means. The select drops
  browser chrome for the system's own caret, and the focus ring belongs to the
  whole slot.
- An applied filter takes the accent well and carries its own removal with a
  named object; a coarse pointer gets the full target. `--sudx-accent-well` now
  names that use.
- The node dropped `role="toolbar"`. It had declared native tab order and the
  toolbar role at once, which promises arrow-key navigation the pattern never
  implemented. It is a named group until that behavior exists.

## 4.2.1 — 2026-08-06

- The navigation specimen now runs the shipped header instead of a drawing of
  one. It had its own `design-mini-nav` styling, which gave every route link a
  border, a panel fill, and the browser's underline — a bar of buttons that no
  SUDX route has ever rendered. The links are muted text resolving through Ink
  and a quiet tonal ground, which is what the component does.
- The specimen typeset the quadrant mark as a letter X. Brand law forbids
  redrawing, typesetting, or approximating it, so the node documenting the
  shell was breaking the law it sits beside. It draws the canonical mark now,
  and the node carries that prohibition in its own rules.
- The specimen showed `aria-current="page"` in markup and nothing on screen,
  while the node's purpose named current location as one of its four jobs. It
  now runs the shell on two routes with the current marker in place, so what
  stays fixed across routes and what changes is the thing being shown.
- Route names in the specimen and the recipe were invented — Overview, Data,
  `/data`. They are the real ones: `design/` and `sign-in/`.
- Because the specimen is now the component, it collapses at the mobile
  breakpoint the way the routes do: the landing keeps both essential routes at
  full target size, the portal drops its one route and keeps sign-out. The
  node has declared a collapsed mobile state since 3.0.0 and never showed it.

## 4.2.0 — 2026-08-06

- Gave the theme control its own Primitives node. It has shipped in every route
  header since 3.0.0 while the tree described it only as one clause inside the
  navigation shell, so its inversion rule — the half-moon shows the theme the
  press delivers, not the theme in force — was written down nowhere a consumer
  would look. The node carries a live control and both resting forms at once,
  which a header can never do. Navigation now keeps the control reachable and
  defers the behaviour here.
- Completed the theme-toggle recipe. The portable markup had lost the glyph and
  the accessible name, and the portable CSS carried neither the square width,
  the visually hidden label, nor the rotation, so a consumer copying it got a
  control that could not show its own state.

## 4.1.0 — 2026-08-06

- Gave form controls a unit rail. A field that holds an observed value now
  carries its unit or period inside the control boundary behind one hairline,
  and sets the value itself in Geist Mono with tabular figures.
- Added the missing field state. A value that was never observed keeps the
  dashed strong hairline reserved for unproven work instead of rendering as an
  ordinary empty box.
- Replaced the browser's default radio and checkbox with the quadrant marks.
  A single choice resolves to the clay diamond at the centre of the SUDX X, an
  included series fills its cell as a clay square, and partial coverage gets
  its own bar rather than falling back to unchecked. The native input is
  restyled, not replaced, so it stays in the accessibility tree.
- Rebuilt both specimens to show every state each node declares, including the
  indeterminate and group-error states neither had ever demonstrated.

## 4.0.1 — 2026-08-05

- Redrew the spacing specimen as a ruler: each step keeps its true pixel
  height and its number sits below a shared baseline, so the 4px and 8px
  bars no longer clip their labels.

## 4.0.0 — 2026-08-04

- Reduced the public Design Tree to Identity, Motion, Foundation, Primitives,
  Patterns, and Data language: 27 Stable nodes across six branches.
- Removed Start, Adoption, Portable assets, and Lab from the catalog rather
  than hiding them in navigation.
- Removed the public release log and duplicate command-palette search. The
  sidebar now carries the one search field, empty until the reader types.
- Portable versioned release files remain published for consumers; only their
  public browsing view was removed.

## 3.6.3 — 2026-07-27

- The motion law now describes the motion this project runs. Three of its
  sections described work that no surface performed, which made the document
  unreliable as a whole: a reader had no way to tell which parts were the
  record and which were an intention.
- Removed the radar contact population from the law and from the sweep node.
  Contacts were specified in detail — resting presence, ping on the sweep's
  bearing, drift in bearing and range, replacement on leaving the field — and
  were never implemented on any surface. The node's purpose, states, rules,
  tokens, and accessibility notes carried them too, and the `Clay contact
  square` glossary entry described a mark nothing drew.
- Removed the landing rate trajectory section. It described a hero figure
  alternating two views on a five-second cycle with a cross-fade and caption
  controls. 3.5.0 deleted that figure and no node has described it since.
- Renamed `Landing ticker` to `Ticker`. The ticker node is still published and
  still governed; it was the landing framing that stopped being true in 3.5.0.
- Added the two radar rules the implementation actually depends on: the field
  is sized from the drawn ring so the arm crosses it by a fixed margin, and the
  tail takes its step count from its arc so its density does not change with
  the size of the field.
- The sweep node's landing deviation is closed. It recorded the landing running
  the arm without contacts; with contacts gone from the node, there is nothing
  left to diverge from.
- Carried both new radar rules into the sweep node, not only into the law. The
  catalog is what a consumer reads to implement a node, so a rule that lives
  only in the prose is a rule that gets implemented by whoever happens to read
  the prose.
- Gave the ticker node the hidden-document pause its law already required. The
  law asked for a pause while inspected and while the document is hidden; the
  node carried only the first, so a consumer following the catalog alone would
  keep a background tab animating.
- Corrected what `--sudx-radius-chip` says it is for. The glossary claimed it
  covered chips, badges, and inputs, "so a field never inherits the card
  shape". Chips and badges do take it; no input ever has, on this site or in
  the published form-control recipe, both of which use `--sudx-radius`. The
  description now names the two uses that are real. Whether inputs should take
  the tighter radius is a design question this does not settle — it removes a
  claim that was not true rather than answering it.
- This is a correction rather than a contract break. It removes descriptions of
  behavior that no release ever shipped in code, so no adopter can have been
  relying on it. 3.6.2 and every release before it stay published and
  unmodified at their own paths, contacts included.

## 3.6.2 — 2026-07-27

- The radar sweep runs on a production surface again. The landing field turns
  the arm and its Bayer tail around the mark at the centre of its range rings,
  which is where 3.5.0 left a static picture when the hero became the claim
  page.
- The sweep node's consumer list names the website again, and its open
  deviation now records what the landing actually diverges from: it runs the
  arm without the contact population the node describes. The claim cards carry
  the argument those contacts used to illustrate, so the arm returns as
  identity rather than as a read.
- No token values, law prose, or recipes changed; the law documents carry only
  their stamped release heading. This is a correction to what the catalog says
  a node's consumers and deviations are, so it publishes as a patch and leaves
  3.6.1 frozen at its own path.
- Corrected the foundation's publication date, which still read 2026-07-26
  after 3.6.1 published on the 27th. The heading and the token contract now
  agree on when the release went out.

## 3.6.1 — 2026-07-27

- Corrected the S in the distributed wordmark and formal lockup. Both drew the
  letter mirrored — the stroke descended through the upper bowl on the right
  and the lower bowl on the left, which reads as a 2, so the assets spelled
  `2UDX`. The verticals are now the right way round.
- The defect was invisible on the site, which typesets the letters in Space
  Grotesk beside the mark and never loads these files. It was visible only to
  someone downloading the brand assets from the Design Portal.
- Releases 3.0.0 through 3.6.0 carry the mirrored letter and stay published and
  unmodified at their own paths. Anyone holding a copy from one of those
  snapshots should take the wordmark and lockup again from 3.6.1.
- Brand law now states that the wordmark exists in two forms that must agree —
  typeset in the interface, drawn as stroked paths in the distributed asset —
  and that the drawn form is checked by rendering it rather than by reading a
  page, which is what let the mirrored letter survive seven releases.

## 3.6.0 — 2026-07-26

- Every node's token list now carries a written description, and a value where
  the entry names a real custom property. The descriptions live once in
  `design-system/token-glossary.json` and are joined in at build time, so a
  token means the same thing on every node that cites it. The generator fails
  if a node names an entry the glossary does not describe.
- Added a deviations register to every node. Most record nothing, which the
  portal states and counts rather than leaving blank — the rule the data
  language applies to a missing period applies to the register too. Three are
  recorded: `--sudx-warning-light` measures 3.44:1 on paper and is held to
  bordered badges and gap markers, and the radar sweep and shipping ticker were
  retired from the landing in 3.5.0.
- Corrected the radar sweep and shipping ticker consumer lists. Both named the
  SUDX Website after the landing stopped running them; both now name the Design
  Portal specimen, which is what actually remains.
- Superseded 3.5.0, which stays published and unmodified at its own path.

## 3.5.0 — 2026-07-26

- Added `--sudx-border-strong` (`#C9C5B9` light, `#3D3A36` dark) for the dashed
  and emphasised hairlines that separate an unproven or empty surface from a
  ruled one. The existing `--sudx-border` stays the default rule; this is the
  heavier step, not a replacement.
- Added `--sudx-accent-well` (`#FBF3EF` light, `#241A16` dark), the tinted
  accent ground used behind an arrival ribbon or any accent-bordered notice.
  It is a background only and carries no text contrast guarantee of its own.
- Superseded 3.4.2, which stays published and unmodified at its own path.

## 3.4.2 — 2026-07-25

- Restored the canonical casing of the unquoted font-family identifiers in the
  type tokens. CSS matches these names case-insensitively, so nothing renders
  differently, but `BlinkMacSystemFont`, `Geist`, `Consolas`, `Georgia`, and
  `Avenir` are the spellings consumers expect to copy. 3.4.1 lowercased them to
  satisfy a lint rule; the rule should exempt font names instead.
- Superseded 3.4.1, which stays published and unmodified at its own path.

## 3.4.1 — 2026-07-24

- Stacked the product-directory recipe's product name and purpose so they no
  longer run together, and gave the new-tab link a visually-hidden "opens in a
  new tab" cue for screen readers.
- Added the missing hover treatment to the button and theme-toggle recipe CSS,
  matching the rest, active, disabled, and focus-visible states already defined.
- Added a doctype to the published recipe fragment files.
- Lowercased the unquoted font-family identifiers in the type tokens; the stacks
  render identically and keep their quoted family names.
- Corrected the Design Portal's static inspector so its default metadata matches
  the initially selected Principles node instead of the release version.
- Superseded 3.4.0, which stays published and unmodified at its own path.

## 3.4.0 — 2026-07-24

- Added the landing rate trajectory: the hero figure now alternates the route
  radar with a self-drawing, scrolling freight-rate dither chart on a
  five-second cycle, with manual controls and a reduced-motion static fallback.
- Documented the rate trajectory in the motion law.
- Superseded 3.3.0, which stays published and unmodified at its own path.

## 3.3.0 — 2026-07-24

- Added `--sudx-transition-control` (120ms ease-out): controls now resolve
  between rest, hover, focus, and active instead of snapping. Reduced motion
  neutralizes it.
- Implemented the Loading state for Actions as a sweeping band of the SUDX 4x4
  Bayer field, built from a CSS mask so it inherits the control color and
  themes with it. No image, no WebGL. The label stays readable.
- Implemented the Error state for Form controls: the invalid input carries its
  own state and the message is encoded with a triangle as well as color.
- Gave the directory row a resolved hover and keyboard-focus state: the mono
  index takes the accent, a Clay edge-marker grows, and the open affordance
  resolves from a dimmed rest.
- Gave the theme toggle a flipping half-moon that turns to match the theme it
  switches to.
- Superseded 3.2.0, which stays published and unmodified at its own path.

## 3.2.0 — 2026-07-24

- Sized the wordmark letters to the mark and spaced the mark as a fourth
  letter, shared by every route header.
- Evened the optical nav gap between text links and the first bordered
  control, on the landing and portal headers.
- Added `--sudx-shadow-active`, theme-mapped, as the hairline control shadow:
  pressable controls carry it at rest and drop it while pressed. Surfaces
  still take no resting shadow.
- Superseded 3.1.0, which stays published and unmodified at its own path.

## 3.1.0 — 2026-07-23

- Ratified radar contacts: a drifting population the sweep reveals, resting
  faint and brightening as it passes, held inside the drawn ring.
- Recorded that contacts are illustrative and carry no product data.
- Superseded 3.0.0, which stays published and unmodified at its own path.
- Retired the tokens.json hash gate. The generated CSS and tokens are checked
  in, so a token change now shows as a reviewable diff rather than a hash
  mismatch that names nothing.

## 3.0.0 — 2026-07-23

- Restored the canonical quadrant X and complete favicon ecosystem.
- Recovered formal lockup, construction, clearspace, minimum-size, application,
  and technical-document rules.
- Restored the landing radar, ticker, rotating headline, and responsive mark.
- Added motion law, agent guide, adoption guide, release manifest, and immutable
  distribution.
- Kept the product-derived Paper/Ink/Clay foundation and chart law.
- Moved legacy identity experiments to Lab history.
