From a7480172ab214cae805f0d89278dd4dee041259a Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Sun, 11 Oct 2026 18:08:13 +0200 Subject: [PATCH] gates: site gate 22 - the media-aware CSS leak check the phone bug needed The two defects the operator found on his own phone are fixed and live since 5aeb36b5; this is what pins them so they cannot come back silently. site_gates.py gate 22 parses site.css and shell.css into (media context, selector, declarations) and fails on any property site.css declares on a selector shell.css also styles that nothing overrides - neither shell.css itself nor a `.shell ...`-scoped reset. site.css loads first, so "later wins" is per PROPERTY, not per rule. Today: 689 site rules vs 119 shell rules, 9 shared selectors, 0 leaks. .hamburger-box / .hamburger-line are an explicit allow-list with the reason beside them. It is media-aware precisely because the check it replaces was not. The STOP-1 leak diff excluded @media blocks and reported "exactly six" leaking declarations; the real number is forty, and the worst of them (@media (max-width: 900px) .nav-links { position: fixed; right: -100% }) parked the drawer's menu off-canvas and shipped. Two decoys in test_gate_decoys.py, both the exact shape that went live, both seen to convict: site/shell-css-leak-in-media the body:not(.shell) scope taken back off that one rule - the gate names the media query, the selector and `right: -280px` site/footer-outside-main
closed early on gyik.html - gate 3b's line They plant and restore BYTES, with the anchor translated to the file's own line ending: these files are CRLF in a Windows worktree and LF in a Linux one, and replace_in's text-mode round trip would have rewritten a whole file on one side. Also: CHANGELOG entries for both areas, the M3 report corrected where it quoted its own wrong "exactly six", and one plain-language STATUS line. --- REPORT-m3-2026-10-11.md | 35 ++++++++++-- STATUS.md | 6 +++ scripts/CHANGELOG.md | 20 +++++++ scripts/site_gates.py | 105 +++++++++++++++++++++++++++++++++++- scripts/test_gate_decoys.py | 51 +++++++++++++++++- website/CHANGELOG.md | 28 +++++++++- 6 files changed, 239 insertions(+), 6 deletions(-) diff --git a/REPORT-m3-2026-10-11.md b/REPORT-m3-2026-10-11.md index b5790c87..3907a597 100644 --- a/REPORT-m3-2026-10-11.md +++ b/REPORT-m3-2026-10-11.md @@ -75,7 +75,8 @@ deliberately not built** (your brief) — the shell should settle first. paragraph. Found by a word-level diff. 4. **The sidebar rendered as a horizontal row** across the content column, because „later wins" is per property and the controller's `.nav-links` never declares `display`. Diffing the two files' - declaration sets found six such leaks; only this one was visible. + declaration sets found six such leaks; only this one was visible. **That diff was wrong, and the + section below says how** — the real number was forty. 5. **The contact pages' header slid under the sidebar** (content column at x=642 instead of 240, form at two-thirds width) because those pages keep their header outside `
`. @@ -87,6 +88,32 @@ deliberately not built** (your brief) — the shell should settle first. *controller's* `.btn-primary`, which the shell imports; it measured 4.01:1 again. Your existing remedy applied. `.nav-group-label` was 3.14:1 and moved to `--text-2`. +## Two defects a real phone found, after the switch + +Reported by you, from your own phone, hours after it went live. Both were mine. Fixed, live as +`?v=23`, and read back on all 20 pages at 390 / 860 / 1440 px. + +1. **The phone menu was empty.** The drawer slid open correctly and had nothing in it. `site.css`'s + old mobile nav still reached the shell's sidebar: under `@media (max-width: 900px)` it sets + `.nav-links { position: fixed; right: -100% }`, which parked the menu off-canvas *inside* the open + drawer. Every old-chrome selector (29 occurrences) is now scoped `body:not(.shell)` — scoped, not + deleted, so a page without the shell still works. +2. **The footer rendered as a second column** at the top right of 16 pages. `body` is a flex row on a + shell page, and my insert moved the footer inside `
` only on pages that *ended* with + `
`; a page with a `