@@ -6,6 +6,65 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66
77## [ Unreleased]
88
9+ ### Changed
10+
11+ - ** Single design-token source.** ` brand.json ` gained a ` colors ` block (full dark +
12+ light palettes) as the one source of the visual palette, plus ` fonts ` and ` site ` .
13+ ` src/brand.js ` exposes it via ` cssVars(scheme) ` + ` rootTokensCss() ` pure helpers;
14+ the generated status page (` scripts/build-pages.mjs ` ) now injects tokens from that
15+ one source (and gains light mode), and ` test/pages.test.js ` enforces full-palette
16+ parity — every dark and light hex in ` brand.json ` must appear on both public pages,
17+ so the landing page and status page can no longer fork into two palettes claiming
18+ to be one.
19+ - ** Landing page redesign.** Rebuilt ` landing/index.html ` on a Stat-Led structure:
20+ the real shipped hero diagram is now embedded (inlined so it resolves in local
21+ preview and at the deployed site root), the fake terminal chrome, placeholder
22+ digit/glyph icons, and faux-live pulse dot are gone, capabilities use real inline
23+ SVG icons in a hairline-divided layout instead of a uniform card grid, and the
24+ sticky-nav blur is compositor-light. Light-mode accents are darkened to meet AA
25+ contrast on the light paper.
26+ - ** Accessibility + design-system hygiene.** All accent/supplementary-text pairs on
27+ both themes are now verified ≥4.5:1 (bumped ` --faint ` in dark + light, and light
28+ ` --brand ` /` --ok ` , at the single brand.json source). Border-radii are collapsed onto
29+ a deliberate 3-level scale (` --radius-sm ` / ` --radius ` / pill), so `forge uicheck
30+ design` passes spacing-scale, radius-levels, and shadow-levels with a healthy
31+ slop-distance. Focus rings appear instantly (no animated outline), motion is
32+ transform/opacity-only under ` prefers-reduced-motion ` .
33+
34+ ### Added
35+
36+ - ** Social + icon metadata on both public pages.** The landing and generated status
37+ pages now ship ` og:image ` / ` twitter:image ` (a 1200×630 brand card,
38+ ` docs/assets/og.png ` , rasterized once via Chromium — an author artifact, not a
39+ runtime dep), a favicon + apple-touch-icon (` docs/assets/favicon.svg ` /
40+ ` apple-touch-icon.png ` ), and consistent ` canonical ` == ` og:url ` . The status page
41+ gained a full Open Graph / Twitter / ` SoftwareApplication ` JSON-LD head; the deploy
42+ workflow copies the brand assets to the Pages root so the absolute URLs resolve.
43+ - ** Brand-aligned status line.** ` global/statusline.sh ` now renders the exact brand
44+ tokens (ember ` #f26430 ` , warm-taupe greys) in 24-bit truecolor from a named palette
45+ block, with a 256-color fallback when the terminal can't do truecolor. New
46+ ` test/statusline.test.js ` smoke-tests the segments, the exact truecolor hexes, the
47+ fallback, and graceful degradation on minimal input.
48+ - ** Mermaid theme-value guard.** ` forge docs check ` 's ` checkDiagrams ` now verifies each
49+ ` %%{init ` block carries the brand's actual color values (ember + warm-black from
50+ ` brand.json ` ), not just that a theme directive is present — a diagram can no longer
51+ declare a theme and still render off-brand. README leads with a ` Start in 60 seconds `
52+ block, and ` ARCHITECTURE.md ` documents ` brand.json ` as the single color source.
53+
54+ ### Fixed
55+
56+ - ** Status-page metrics were silently stale.** The ` impact ` and ` saved ` regexes in
57+ ` scripts/build-pages.mjs ` no longer matched the current README, so those
58+ "repo-sourced" numbers were really hardcoded fallbacks. Regexes fixed to parse the
59+ README, and a non-match is now a hard build error (` mustMatch ` ) instead of a silent
60+ fallback; the dead ` claim ` field is removed.
61+ - ** Generated status page no longer ships stale/leaky.** ` public/index.html ` is a
62+ build artifact (regenerated at deploy), so it is now gitignored and dropped from
63+ the npm ` files ` list — a stale committed copy (old version + a dev-branch name
64+ leaked into a visible chip) can no longer be published in the tarball.
65+ - ** Landing → status link** now points at the absolute Pages URL, so it resolves in
66+ local file preview instead of 404-ing on ` ./status/ ` .
67+
968## [ 0.17.0] - 2026-07-15
1069
1170### Added
@@ -25,7 +84,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
2584### Added
2685
2786- ** Playwright interaction loop** — ` forge uicheck interact <file-or-url> ` drives the
28- page headless under ` prefers-reduced-motion ` and checks what it * does *
87+ page headless under ` prefers-reduced-motion ` and checks what it _ does _
2988 (console-clean, keyboard-reachable, focus-visible, reduced-motion), where
3089 ` uicheck visual ` only fingerprints what it paints. The verdict is recorded through
3190 the ledger's cross-family-gated ` behavioral ` oracle (advisory by default;
@@ -55,7 +114,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
55114 MAE. Advisory by default — routing keeps the rubric until a promotion is adopted
56115 (` calibratedComplexity ` mirrors ` predictor.riskFor ` ). Zero deps, fully unit-tested.
57116- ** Legacy-store retirement (` FORGE_LEDGER_ONLY ` )** — the PCM ledger can now be the
58- * only * store. Since P1 it has been the convergent write store (dual-write) with a
117+ _ only _ store. Since P1 it has been the convergent write store (dual-write) with a
59118 merged read (` ledger_read ` ); with ` FORGE_LEDGER_ONLY=1 ` the legacy files
60119 (` .forge/lessons/*.md ` , recall/brain fact files) stop being written and every read
61120 materializes from the ledger — cortex confirm/create/distill dedup against
0 commit comments