# Changelog The binding policy for what each kind of version bump means and what the changelog has to carry is in [`SPEC.md` §20](./SPEC.md). The practical recipe downstream deployments follow when reading this file is in [`docs/DEPLOYMENTS.md`](./docs/DEPLOYMENTS.md). The canonical version is the `VERSION` file at the repo root; `frontend/package.json#version` mirrors it. Deployments pin to a specific framework version in their own `.rfc-app-version` file (per §20.5). While the framework is pre-1.0, minor-version bumps may introduce breaking changes; the entry below each such bump documents the upgrade steps a deployment must apply. Upgrade-steps blocks use the [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119) / [RFC 8174](https://www.rfc-editor.org/rfc/rfc8174) normative- language convention per `SPEC.md` §20.4. **MUST** / **SHALL** steps are required; **SHOULD** steps are recommended (the framework's default and tested path); **MAY** steps are optional. Upgrades that skip versions are the composition of each intervening adjacent release's steps in order — no A-to-B path is pre-computed beyond that. ## 0.31.3 — 2026-05-30 **Patch — admin Users tab: "Last seen" reads "Never" for unclaimed invites. Visual/logic only in `Admin.jsx`. A plain frontend rebuild applies it.** An admin-created invite row showed a real-looking "Last seen" timestamp identical to "Signed up," implying the invitee had visited when they hadn't. Cause: `users.last_seen_at` is `NOT NULL DEFAULT (datetime('now'))` (`migrations/001_users_and_audit.sql`) and the invite INSERT (`invites.py`) sets neither timestamp, so both default to the row-creation instant; `last_seen_at` only advances on a real authentication. Since an unclaimed invite has provably never authenticated (that unclaimed state is exactly what drives the "PENDING INVITE" badge), the Users tab now renders **"Never"** for the Last-seen cell of a pending-invite row instead of the misleading default. Signed-up (the invite-created date) is unchanged. Upgrade steps: none. **SHOULD** deploy as a normal code deploy. ## 0.31.2 — 2026-05-29 **Patch — landing (`/`) welcome panel spacing. Visual only: CSS in `App.css` (`.welcome`). A plain frontend rebuild applies it.** The welcome read-view was jammed against the catalog divider with no top offset and loose, uneven paragraph spacing. Root cause: `.main-pane` carries a bare `.main-pane { padding: 0; display: flex }` override (the §8 three-column RFC shell) that shadows the earlier padded read-view rule, so the pane provides no padding — and `.welcome` (just `max-width`) never compensated. The welcome surface now owns its own breathing room: 56px top / 48px side gutters, a capped 680px measure, a stronger `text-3xl` "Welcome." hero, and even `--space-8` paragraph rhythm at `--leading-relaxed`. Applies to both the signed-out and signed-in welcome (same `.welcome` class). Upgrade steps: none. **SHOULD** deploy as a normal code deploy. ## 0.31.1 — 2026-05-29 **Patch — admin Users tab + header UX polish. Visual only: CSS plus markup/structure in `Admin.jsx` (no API, schema, config, overlay, or secret change). A plain frontend rebuild applies it.** Two latent CSS defects fixed: - **`.invite-badge` had no rule.** The "(pending invite)" marker on admin-created-but-unclaimed user rows rendered as bare parenthetical text. It's now a quiet amber pill, consistent with the other status badges. - **`.btn-link-quiet` never reset native button chrome.** Used as a bare link-style `