# Changelog

Copy for the website changelog. One record, newest first. Reckon has had two foundations:
versions 0.3 to 0.6 were built from one registry, and 0.7 replaced that layer wholesale
with the `cosscom/coss` source. The name, the version line and the rules carried across
unchanged — nothing forked.

| | |
|---|---|
| **Current** | 1.0.0 — the first complete system: the rules, all 54 component families, and nine products built against them. Released 1 September 2026, **internal only** — three items in `NOTICE.md` still block a public release. |
| **Rules** | `AGENTS.md` — read before any screen is generated; it overrides generic defaults |
| **Cadence** | When it is ready. No release train; nothing ships to hit a date |
| **Source** | `cosscom/coss`, branch `main` — last synced 23 Aug 2026, recorded in `github.md` |

Breaking changes are named as such and never quiet. If a rule changes meaning it gets a
new name rather than a new definition, so a screen built against the old one keeps failing
loudly instead of drifting.

Relative dates below are placeholders — the only hard dates in the project record are the
20 Aug 2026 registry sync and the 23 Aug 2026 sync with the current source. Fill the rest
in from the release log.

---

## 01 · What is coming

Unshipped, in the order it blocks other work.

- **The licence answer — settled.** Reckon is **AGPL-3.0-or-later**: the token layer derives
  from `packages/ui/`, which carries the upstream default, and no MIT copy of those 207
  values exists anywhere in the repository. `LICENSE.md`, `NOTICE.md` and
  `licenses/AGPL-3.0.txt` are in the project. What still blocks a **public** release is
  narrower than the licence: the two font binaries' own terms, trademark permission for the
  wordmarks, and the consent status of the photography. Internal releases proceed.
- **The download page.** One self-contained page with live specimens and the package zip.
  This changelog is written to drop into it.
- **A getting-started opening.** The readme opens with product context, which is right for
  a designer and wrong for someone who has just cloned.
- **Booking Desk.** A ninth product — a guest booking places to stay, top-nav shell, real
  map. In the project but not finalised, so not part of 1.0 and not documented here.
- **Finance Desk's approval limits.** Editable in Settings, but payouts do not check them
  yet. A known gap, named here so a demo does not find it first.
- **Deliberately unbuilt.** Focus trapping, portalling, collision-aware positioning,
  virtualised lists and the full keyboard contracts of the upstream primitives. These are
  cosmetic recreations; production work uses the real package.

---

## 02 · Shipped

### 1.0.0 — The system, complete · 1 September 2026 · **Current**

Re-cut 1 September 2026 with the licence settled and the two site recreations removed; the
version did not move because nothing in the rules, the tokens or the component inventory
changed. **Internal only**: the Cal Sans and Paper Mono binaries, trademark permission for
the wordmarks, and the consent status of the photography are unresolved in `NOTICE.md`.

Three layers finished together, because none of them is evidence on its own. The rules had
been stated for a while; the component set closed at 0.8; a product is the only thing that
proves the two produce screens rather than describing them. 1.0 is eight products a person
can tell apart, built from one inventory.

**The products.** Each is a `templates/<slug>/` folder with its own `.dc.html` entry,
shell, screens and fixtures — and its own `enums.js` and `nav.js`, importing nothing from a
sibling, so deleting a folder deletes the product with nothing orphaned.

- **AI Tool** — sidebar shell for a chat workspace: a conversation with its context rail
  and a composer that really streams, projects carrying instructions and files, a prompt
  library, the workspace file index with its failures, usage derived turn by turn.
- **Claims Desk** — top-nav cargo claims desk: a deadline burn-down queue, liability-cap
  reconciliation, an evidence gate, decision with sign-off, payments, customer responses
  and recovery.
- **Finance Desk** — sidebar shell for payment operations: dashboard, payments, the payout
  approval queue, card expenses and their review policy, disputes as list-detail,
  customers, people, the balance and what claims it, chart-led reports, staged settings and
  six auth screens including 2FA.
- **Hearth (residence desk)** — a house run properly for the five people in it: ten
  destinations over two groups, a labelled sidebar on a neutral plane where every region is
  a card, and five derived chains — preferences to heating, usage and tariff to money,
  entries and darkness to whether the house is shut, machine hours to a job falling due,
  tariff and charge to what the battery should do.
- **Hospital Desk** — double-sidebar hospital management: a rail of six categories beside a
  panel of the destinations inside it, twenty destinations from the shift-start board
  through theatres, wards, medication and the rota to invoices, payer contracts, credit
  control and cost per episode.
- **Marketing Desk** — inset-pane sidebar over twelve destinations in three groups, drawn
  as a tile grid on uneven spans: journeys, broadcasts and approvals, audiences with the
  rule each one counts, a contact directory, an inbox of owed @mentions, deliverability as
  a DNS matrix, seven settings screens.
- **Recruitment Desk** — a foldable sidebar for a team that reviews whole applications: the
  same seven-step stepper wherever an application appears, panel scorecards, references and
  checks, offers priced against the requisition's band, and the thread where the desk
  actually talks.
- **Talent Desk** — top-nav shell for a creator talent agency: an editorial roster book,
  brief triage, fit-and-exclusivity matching, the deal sheet, deliverables in flight,
  performance against promise and the facing money ledgers.

**What the products are made to prove.**

- **Removed** — the two site recreations. They demonstrated the system in situ and were not
  products built against the rules; the cards and the nine templates carry that job.
- **Added** — three shell modes over one component inventory: sidebar (labelled groups, and
  a variant that folds to an icon rail on a button in its footer), top-nav, and rail +
  panel, where a category is a tablist over the panel rather than a route. One navigation
  owner in every case, verified at 1440, 1024, 768 and 375px, losing nothing on the way
  down.
- **Added** — two content frames, so the same inventory reads as two products: a neutral
  plane where every region is a card, with the gap as the only separator; and a flush
  column on the page colour, separated by full-bleed hairline rules and the gutter. Four
  card variants and no fifth — default, flush, tint, fill.
- **Added** — a form register, one row per product across six axes, and a named primary
  display axis with a minimum of two distinct displays per product. This is the answer to
  the defect 0.6.1 diagnosed.
- **Changed** — nothing summable is stored anywhere. A total is the sum of its lines, what
  something has been paid is the sum of its **cleared** payments, and status follows that
  arithmetic. A figure that cannot name the array it comes from is wrong.
- **Added** — derived gates rather than statuses: consent before a procedure, an evidence
  gate before a decision, a service level answered against the stage a record is in, an
  owed @mention until the person named writes on that record. One predicate, read by the
  nav badge, the section count and the record's own alert.
- **Added** — settings that bite. Bed counts and nursing establishments are the denominator
  of every occupancy figure; a role matrix writes into the capability maps every transition
  reads; a heating setback moves the zone dials; a tariff re-prices fourteen days; a feed
  switched off is not offered in the import dialog.
- **Added** — permissions as maps, not copy. Where the signed-in user may not act, the
  action is disabled with the reason named — a ward manager cannot verify a medication
  order, and the product's maps decide that.
- **Added** — irreversible actions get a confirm dialog naming the consequence; everything
  else applies with an undo toast. Three reversibility tiers, one commit model per screen.
- **Added** — photographs as load-bearing data: patient rows, notes, staff records and
  account menus carry one, a record created in-session has none and says so, and two
  products take a real drag-and-drop upload with type and size validated.
- **Added** — hostile fixtures throughout: long names, missing dates, denied permissions, a
  slow leak visible only as water moving while the house is asleep, twelve import rows
  nothing could place.
- **Added** — an `AGENTS-notes.md` inside the template folders that need one, recording the
  data model a reader would otherwise reconstruct from fixtures.
- **Known** — Finance Desk's approval limits are editable but not enforced at payout.

### 0.9 — The rules layer, rewritten · two months ago · **Breaking**

The rules survived the change of source; their wording did not. `AGENTS.md` was rewritten
against the new component set and the new shells, and it is still not a style guide —
styling is the tokens' job.

- **Breaking** — one data state per screen. Loading, empty, no results, error and populated
  are mutually exclusive branches of one conditional, never neighbours.
- **Breaking** — actions derive from record state. A fixed action set on a detail view is a
  defect; disabling to avoid deciding is another.
- **Changed** — derivation restated in the form it now takes: every figure names the array it
  comes from, and if the array cannot be named the number is wrong.
- **Added** — control contracts: one commit model per screen, three reversibility tiers,
  switch versus checkbox, and destructive styling that is subtle everywhere except inside
  its own confirm dialog.
- **Added** — two product shells and an auth shell with its full route set, each verified at
  1440, 1024, 768 and 375px, losing nothing on the way down.
- **Changed** — verbs, time formats and status vocabulary fixed product-wide, one table
  each. Enums hold stored state only; derived flags compute at render.

### 0.8 — Inventory completion · four months ago · Minor

The component set closed against the new source, and the two shipped sites were recreated
so the system could be read in situ rather than as a specimen sheet.

- **Added** — all 54 component families, 177 exported names with compound parts, across
  actions, forms, data, feedback, overlays and navigation.
- **Added** — 78 cards across 15 groups, 22 of them specimens for colour, type, spacing,
  elevation, motion and brand.
- **Added** — the two site recreations: the docs and gallery site with its ⌘K palette, and
  the marketing letter page with its container hairlines and nodes.
- **Changed** — every family ships a `.d.ts` props contract and a `.prompt.md` usage note
  beside its `.jsx`, so a consumer reads the contract instead of the implementation.
- **Fixed** — controls stayed at their desktop heights on touch widths; the `--*-touch`
  tokens had been declared and never consumed.

### 0.7 — New source · five months ago · **Breaking**

The foundation was replaced. Everything above the token layer stayed; every value below it
changed, which is a break in the only sense that matters — a screen built at 0.6 does not
render at 0.7. Reckon keeps its name; what it is recreated from is now `cosscom/coss`.

- **Breaking** — tokens re-resolved from `cosscom/coss` rather than the previous registry:
  207 custom properties across seven files, palette, semantic aliases and a `.dark`
  re-resolution, so dark mode costs one class and no component changes.
- **Breaking** — the generated brand ramp was removed. There is no `--brand-hue` knob and no
  rebrand-from-one-line promise; Reckon is near-monochrome from here and saturated colour
  is a signal, never decoration.
- **Breaking** — Geist and Geist Mono replaced by Cal Sans and Paper Mono, the real webfonts,
  with the wordmark's own axis settings.
- **Added** — hairline elevation: a 1px inset highlight over a 5% black shadow, lighting the
  top edge in light mode and the bottom edge in dark. No gradients, no glows, no coloured
  left borders.
- **Added** — `--radius: 10px` deriving 4 / 6 / 8 / 10 / 14 / 16, alpha borders at 8% and
  10% so lines compose over any surface, and five semantic hues used only as state.
- **Changed** — the icon set moved to Lucide at 16px, 2px stroke, 80% opacity, matching the
  source rather than approximating it.
- **Unchanged** — content fundamentals: sentence case, buttons that name their object, no
  gradients, no emoji, tabular figures on money and counts.

### 0.6.1 — The reset · seven months ago · **Breaking**

Five of nine worked templates deleted on purpose. They had proved the rules ran; then they
proved something worse — nine products that were visually distinguishable and structurally
identical, every one a dense record table with a rail of property pairs and a hairline
figure strip. Correctness was checked; form was merely invited, so form got defaulted.

- **Breaking** — five templates removed. With them gone the evidence for a shared kit went
  too, which is why absorbing the converged local helpers was deferred rather than shipped.
- **Added** — a named primary display axis with a ten-item menu and a minimum of two
  distinct displays per product; checkability widened from the rows beside a figure to
  three legal forms.
- **Changed** — variant economics fixed so the default pairing stopped being what silence
  buys, and a second question added to the correction-cost standard: could a person tell
  two products from this system apart?
- **Added** — a form register, one row per product across six axes, and the first two
  products generated against it.

### 0.6 — The audit pass · eight months ago · Minor

The checked layer arrived. Rules that could only be stated before could now be run against
a screen and reported on, which is the difference between guidance and a test.

- **Added** — an audit pass that reads a generated screen and reports which rules it breaks,
  by name.
- **Added** — four worked products, each carried end to end with its hostile fixtures.
- **Changed** — derivation moved from a stated rule to a compiled one; totals can no longer
  be passed in.
- **Fixed** — status enums that allowed an unlisted value when the source data disagreed.

### 0.5 — Shells stopped being templates · nine months ago · **Breaking**

Each shell now has to name three expressive choices and give a reason for each, which is
what keeps two products built on it from looking identical.

- **Changed** — shells rewritten as recipes; the four archetypes replaced the previous page
  templates.
- **Added** — fixtures carrying the awkward cases: long names, missing dates, denied
  permissions.
- **Changed** — token names settled on their final scale; the old aliases were removed
  rather than kept.

### 0.4 — Coverage · eleven months ago · Minor

The component set grew to cover what business screens actually need, and every state that
never makes a mockup was drawn.

- **Added** — loading, empty, error and permission-denied states on every component.
- **Added** — tokens for surface, accent, radius and type, all pointable at a brand.
- **Added** — 21 further primitives from the registry (20 Aug 2026 sync), taking the set
  past forty, plus new navigation and layout families and overlays as their own group.
- **Fixed** — tabular figures that did not align in table footers at certain weights.

### 0.3 — The stated layer · last year · Minor

The first rules file a model would follow for more than four screens.

- **Added** — the stated layer: rules the model reads before it draws anything.
- **Added** — thirty observed failures published with their corrections, ordered by the rule
  each one proves.
- **Added** — Claude Design setup, so the layer loads without anything to install.

---

Versions before 0.3 were private. Nothing from them is documented here because nothing from
them survived. The one thing that has survived every version, including the change of
source at 0.7, is the argument: the component layer was never what failed, and the rules
above it are the product.
