commit a969d63a40cc004efb2bd6a9e67ca92651e32566
parent 0c68f82cd6512599cde6d96887fe6352f0377600
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Sun, 27 Sep 2026 14:58:32 -0400
plans: slice MC as shipped — the mark's dims at 3:1 (#6b5d47 3.09, #586977 3.06), lit ≥ 2:1 over them, the chart validated after the Violet/Blue swap (every adjacent pair passes); brand-and-themes' icon palettes updated with a dated note
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Diffstat:
2 files changed, 105 insertions(+), 3 deletions(-)
diff --git a/plans/brand-and-themes.md b/plans/brand-and-themes.md
@@ -49,10 +49,19 @@ Everything is in a 512 viewBox. The shapes, back to front:
| line 4 | rect x112 y380 w152 h44 rx22 | dim |
Icon palettes:
-- **Child site:** ground `#0c0a08`, dim `#3b3327`, lit = the site accent's on-dark value.
-- **Archilyzer** (homepage, hub, editor): ground `#151b20`, dim `#3f4c56`, lit `#e7edf1`
+- **Child site:** ground `#0c0a08`, dim `#6b5d47`, lit = the site accent's on-dark value.
+- **Archilyzer** (homepage, hub, editor): ground `#151b20`, dim `#586977`, lit `#e7edf1`
(bone). The parent mark is achromatic.
+The dims were raised on 2026-09-27 (release 10, slice MC; `release-10.md`), from `#3b3327` (1.59:1
+on ink) and `#3f4c56` (1.97:1 on slate), which the operator found too faint: on the dark base the
+ink tile merges into the page and the mark read as one lit line. Two rules now hold every icon
+palette (`brand.ts`, enforced in `brand.test.ts`): **a dim reaches 3:1 on its ground** (WCAG
+1.4.11) and **every named lit value stands 2:1 above its dim**. The new dims keep the old hue and
+saturation and sit just over 3:1 (3.09, 3.06), because the two rules multiply to lit-on-ground and
+the darkest lit values leave little room: Vermilion is 2.28:1 over the child dim, and Signal on
+the Media slate 2.05:1.
+
Icon variants:
- `any`: `rx=112`.
- `maskable`: full-bleed ground, the mark scaled 0.8 about (256,256).
@@ -1271,7 +1280,7 @@ S4 ships after release 10's cut and is **not part of the site rollout**: it touc
### Decisions (operator, 2026-09-26)
- **Mark M2 · Signal.** The parent mark's geometry, lit in Signal: ground `#151b20`, dim `#3f4c56`,
- lit `#5fa8a0`. The avatar uses the maskable variant (scale 0.8 on full-bleed ground).
+ lit `#5fa8a0`. (Dim `#586977` since 2026-09-27, with the parent mark's; see "The design".) The avatar uses the maskable variant (scale 0.8 on full-bleed ground).
- **Lockup "flush · caps matched".** The `Archi|lyzer` wordmark sits over `MEDIA`:
- Both are Archivo at wdth 118. The wordmark is 720 / 380 at -0.01em; MEDIA is 700, in Signal.
- MEDIA's size is **1.035×** the wordmark's, and it is letter-spaced to exactly the wordmark's
diff --git a/plans/release-10.md b/plans/release-10.md
@@ -1983,6 +1983,99 @@ one colour.
its chart colour, as today. Rollout: every export site and the hub rebuilt for the hint; the
homepage and the hub rebuilt after the accents are set.
+### Slice MC, as shipped — mark contrast (2026-09-27)
+
+The operator's asks (2026-09-27): **"the line details inside have too little contrast with the
+background"** — the Found-line mark's three dim lines were 1.59:1 on the child ink tile (`#3b3327`
+on `#0c0a08`) and 1.97:1 on the Archilyzer slate (`#3f4c56` on `#151b20`); on the dark base the
+header's ink tile merges into the ink page and the mark read as a lone lit line. And the accents
+were swapped through the site form (the parent): **hasanalyzer = Violet, bonnellyzer = Blue**, so the
+homepage chart is re-validated. Branch `r10/mark-contrast` off `main` `51c5b562`, worktree
+`/home/user/Projects/r10-mark-contrast`, one Opus implementer. Scratch files `mc-*` in the job's
+`tmp/brand`.
+
+**The values.** Each new dim keeps its old hue and saturation (warm ink h36 s20; slate h206 s15) and
+sits just over 3:1, because the two rules below multiply to lit-on-ground: with the dim at 3:1 the
+darkest lit values (Vermilion 7.03:1 on ink, Signal 6.28:1 on the slate — darker than Blue, 8.19)
+cannot sit more than ~2.3 and ~2.1 above any dim.
+
+| palette | dim before → after | on its ground | tightest lit over the dim |
+|---|---|---|---|
+| child (ink `#0c0a08`) | `#3b3327` → **`#6b5d47`** | 1.59 → **3.09** | Vermilion 2.28, Signal 2.31, Blue 2.65, Violet 2.74, Sakura 2.81, Green 3.04, Brass 3.26 |
+| Archilyzer (slate `#151b20`) | `#3f4c56` → **`#586977`** | 1.97 → **3.06** | bone 4.80; Signal (the Media mark) 2.05 |
+
+The rules, in `brand.ts` beside `ICON_PALETTES` and enforced on every icon palette:
+`MIN_MARK_DIM_CONTRAST = 3` (WCAG 1.4.11, a graphic that must be seen) and
+`MIN_MARK_LIT_OVER_DIM = 2` (the lit line at least double the dim's luminance: the most both
+palettes can hold with the dim at 3:1). A custom accent is fitted only to the 4.5:1 ground rule, so
+one at that floor sits ~1.5:1 over the dim (the e2e fixture's `#cc3366` → `#d14574`: 1.47:1); its
+hue carries it. Rendered at 16, 32, 56 and 128 px on the ink and light pages before choosing
+(`mc-sheet-{ink,light}.png`).
+
+**The chart after the swap: every adjacent pair passes** (`mc-palette.md`, `mc-layers.log`: Slice
+AC's script with the new mapping, `siteChartColors` → each base's `--chart-N` → the dataviz
+validator against `--chart-surface`):
+
+| order | layers | adjacent, light / sepia / dark | all pairs |
+|---|---|---|---|
+| today (Jer, Ani, Bon, Has, Rek) | amber · magenta · blue · violet · green | PASS; CVD 13.1 / 11.1 / 11.0, normal 17.7 / 15.3 / 16.7 | CVD WARN 6.2 / 6.1 / 6.9, normal ≥ 15.3 |
+| Has and Rek swapped | amber · magenta · blue · green · violet | PASS; CVD 13.1 / 13.4 / 11.0, normal 19.6 / 19.7 / 21.7 | the same set |
+
+The all-pairs WARN is `--chart-1..5`'s own 6–8 floor band, the same pairs as AC's (Green–Amber,
+Green–Magenta on dark). The tightest adjacent pair is Violet–Blue on sepia (normal 15.3), which AC
+also had adjacent in the other order. No chart change is owed.
+
+**What shipped**
+- `ICON_PALETTES` child dim `#6b5d47`, Archilyzer dim `#586977`; the two rules as exported constants.
+- `MEDIA_PALETTE` takes ground and dim from `ICON_PALETTES.archilyzer` instead of a copy; the
+ banner's field (`#1e262d`) stays under the mark's dim (a test holds it).
+- Regenerated from the code, not by hand: `editor/app/icon.svg` (`markSvg`, parity test green) and
+ umtool's `brands/archilyzer-media.json` (`brand-media.ts --video-kit`). The header `BrandMark`s,
+ the export/hub/homepage icon routes and the favicon read the palette, so nothing else changed.
+- Tests: `brand.test.ts` holds both rules on all seven accents over the child dim and bone over the
+ slate, and pins every ratio; `brandMedia.test.ts` holds them on mark M2. The export, hub and
+ homepage `brand.spec`s pin the new computed fills (`rgb(107, 93, 71)`, `rgb(88, 105, 119)`).
+- The YouTube channel assets are regenerated at `~/reports/archilyzer-media/brand/` (avatar,
+ watermark, banner, `INDEX.html`); the previous set is kept in `mc-media-before/`
+ (`mc-avatar-compare.png`, `mc-banner-compare.png`).
+
+| sha | what |
+|---|---|
+| `c05e6daf` | `common:` the dims, the two rules, `MEDIA_PALETTE` from `ICON_PALETTES`, 3 unit tests, `icon.svg` + the video kit regenerated, three e2e fills |
+| `79d687c9` | `changelogs:` a new `[Unreleased]` above `[0.9.2]` in export and editor; a bullet in the homepage's |
+| _this_ | `plans:` this record; `brand-and-themes.md`'s icon palettes, with a dated note |
+
+**Gates** (logs `mc-*.log`):
+- **tsc** clean (65 s) on the code tree of `c05e6daf`; the later commits are Markdown only.
+- **common 2,034/2,034** (2,031 + 3), editor unit **85/85**, `test:scripts` **174 + 1 skipped** (the
+ report-to-video tests among them), mcp **269/269**, homepage unit **2/2**.
+- **They bite:** with the old dims, 9 of the 23 `brand`/`brandMedia` tests fail, both new rules among
+ them (`child: dim #3b3327 on #0c0a08 is 1.59:1`); with a too-bright child dim `#807055` the 2:1
+ rule fails (`child · signal … 1.74:1`).
+- **Builds:** editor ok (35 s; the built `icon.svg` carries `#586977`); export site ok (22 s;
+ `out/icons/icon.svg` 3× `#6b5d47`); export hub ok (24 s; 3× `#586977`, `out/ask` present);
+ homepage ok (14 s; 3× `#586977`). The primary's `export/public` byte-identical before and after
+ the builds and the e2e.
+- **e2e** (no queue wait, nothing failed, so no re-runs): export `brand` + `pwa` + `site-branding`
+ **15 passed** (29 s); `e2e:hub` **25 passed** (1.0 min); homepage full **28 passed** (44 s); editor
+ `branding.spec` **3 passed** (23 s).
+- **Visual** (`mc-header-compare.png`): the live Jeralyzer (Brass) and Bonnellyzer (reader accent Blue)
+ headers at 2× DPR on dark and light, as served and with only the dim set to `#6b5d47` — the value
+ the build now inlines; plus the favicon at 32 px (1:1 and 4×) and 16 px, before and after, for
+ Brass, Blue and the parent bone, rendered by `renderIconPng` (the "before" 32 px render is
+ byte-identical to live Jeralyzer's `/icons/icon-32.png`). After: four lines on both bases; the lit
+ line is still the found line.
+
+**Found and left**
+- **On the dark base the ink tile still merges into the ink page** (both `#0c0a08`): the mark now reads
+ as four lines, but not as a tile. A hairline ring or a lifted tile on dark would fix it; not asked,
+ and it changes the mark's silhouette, so it is the operator's call.
+- **The live sites carry none of this until rebuilt:** every export site and the hub (the site mark and
+ icons), the homepage (the parent mark), and the editor on its next restart (`icon.svg`, sidebar).
+ Bonnellyzer still serves Violet and Hasanalyzer Blue until they, the homepage and the hub are
+ rebuilt for the swap. The regenerated YouTube picture, watermark and banner are the operator's to
+ upload in Studio (`INDEX.html` has the steps).
+
## Rollout
Nothing is rolled out, except that **Jeralyzer is already on the brand, in Signal** (a build-deploy