fix: regenerate favicon.ico with a transparent ground; tick Pouya's read-through

public/favicon.ico shipped with no transparency: all three frames declared a
32-bit alpha channel and then carried alpha=255 on every one of their 256/1024/
2304 pixels, ground opaque cream rgba(250,247,242,255). Pouya's read-through
finding, confirmed by parsing the ICO container directly.

The render source carries true alpha (2,272,386 transparent px, 20,795 partial),
so this is an export, not a mask derived from the cream ground — R13's harder
branch did not fire and R13 is unchanged on its own terms.

New scripts/icons.mjs + npm run icons re-derives the icon from the committed
master: asserts the source is still the documented crop (R14), verifies a
candidate file and renames on success so a rejected build cannot replace a good
favicon, and runs a boundary-colour halo test. Composition is unchanged —
ink bbox and pixel count identical at all three sizes.

apple-touch-icon.png is byte-identical and stays opaque cream deliberately; the
reason lives in docs/reference/brand-assets.md §The icon set, with the bar and a
pointer in BaseLayout.astro, docs/06 and R13.

docs/06: the read-through is ticked, and the cutover callout drops to ONE
blocker — Q60's waiting period.

Two adversarial review rounds, 15 findings, all resolved, none declined; stopped
at two per D19. claims-auditor correctly deferred to cutover per D20. Gates on
the committed bytes, exit status read: check 0, build 0 (23 pages),
check:claims 0, check:intake 0, og:proof 0, lint 0, lighthouse 0 (worst of 23
99/100/100/100). Nothing deployed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Md3GndFqWPzK78xAoebsg5
This commit is contained in:
Pouya Lajevardi
2026-09-02 16:14:35 -04:00
co-authored by Claude Opus 5
parent 4735989f0b
commit 67847d94fa
8 changed files with 891 additions and 22 deletions
+27 -1
View File
@@ -140,6 +140,7 @@ npm run check:intake # the form's field table vs the Lambda's — they are two
npm run og:proof # every og:image resolves; every card headline IS its page's <h1>
npm run lighthouse # the performance budget. LOCAL ONLY — needs Chrome, not in CI
npm run bio:pdf # re-renders the committed one-page PDF from /bio/. LOCAL ONLY
npm run icons # re-derives public/favicon.ico from the brand master. REGENERATOR
npm run lint # eslint + prettier check
npm run format # prettier — rewrite files in place
npm run deploy # build + deploy from this machine (see docs/06)
@@ -153,6 +154,17 @@ checklist, and **they are deliberately not wired into `npm run build` or either
deploy path.** Do not describe either as gating a deploy: a check described as
running where it cannot is the defect `AGENTS.md` Q22 turned out to be.
**`bio:pdf` and `icons` are REGENERATORS, not gates** — they rewrite committed
artefacts (`public/pouya-lajevardi-bio.pdf`, `public/favicon.ico`) rather than
checking anything, so they are run deliberately and their output is committed.
⚠️ **`LOCAL ONLY` above means a different thing for each, so do not read the two
labels as one.** `bio:pdf` **cannot** run in CI — it drives a browser. `icons`
is pure Node and **could**; it is out of the build because a build should not
silently rewrite an artefact a human approved, which is why it is labelled
`REGENERATOR` rather than `LOCAL ONLY`. It regenerates the favicon **only** — the touch icon
is hand-made and must stay opaque cream (`docs/reference/brand-assets.md`
§The icon set).
**`og:proof` and `check:intake` exist because two facts in this repo are
deliberately duplicated**, and a duplicated fact needs a mechanism rather than a
comment. `og:proof` compares each generated OG card's headline against its page's
@@ -363,7 +375,7 @@ an operator to delete the three records that authenticate outbound mail —
under the heading "Never delete".
**A measurement is a claim about your instrument until you check the
instrument.** This has now cost six times, and the shape is identical every
instrument.** This has now cost eight times, and the shape is identical every
time: a number that looks like a finding, from a probe nobody validated.
- `timeout 60 ls "$DRIVE"`**the command never ran.** `timeout` is not
@@ -391,6 +403,20 @@ time: a number that looks like a finding, from a probe nobody validated.
from the list. **A `grep -o` window count is not an enumeration** — to count
occurrences of a string, iterate every match position, or `grep -o` the bare
string with no context window.
- **An ink bounding box of `48x48` filling the whole 48 px favicon** — which
reads as *the regeneration blew the mark up to the full square*. The probe
identified ink as "differs from cream", which is **correct on a matted icon and
meaningless on a transparent one**, because `alpha = 0` pixels still carry RGB
`(0,0,0)`. **Nothing about the probe changed — the class of input did**, and a
probe cannot tell you that. Composite over a known ground first, so both things
compared are the kind of thing the instrument was built for.
- **A contrast ratio of `14.02:1` for the mark's darkest ink** — computed from a
raw channel value **without asking what alpha it is painted at**. Exactly one
pixel carried that colour and its alpha was 251; a `>= 250` filter let it
through and the ratio was then taken as if it were opaque. **It is a number
about a colour that is never painted.** Composite against the actual ground
before measuring contrast, and take "the ink colour" only from fully opaque
pixels.
So before acting on a number: say what it is a number *of*; confirm the command
actually ran and read its exit status; and check it against a second method that