marketing/facebook: the phone check ran after all — the cover IS cut on phones (R-919)
gates / gates (push) Successful in 4m31s

Your suggestion to use DevTools device mode was right; "cannot be checked" was
too quick a conclusion. On an emulated Pixel 9 (412x924, mobile UA, with a
reload so Facebook serves the mobile bundle) the Page's mobile header renders
412x274 = 1.504:1. Facebook keeps the cover's full height and shows only the
centre 938 px of its 1640 px width -- 351 px off each side. build.py's safe
area leaves 306 px clear per side, 45 px too few, and the light text in
cover-c.png runs x333..x997 against a left crop edge of x351, so 18 px are lost:
the headline reads "aját szabályaid" and the wordmark "elhom.eu" on every phone.

Nothing re-cropped on Facebook (the task's fence). The fix is build.py's safe
area (<=938 px, ~900 for margin) plus the measured 172 px centred phone profile
circle, then a hand re-upload. R-919 opened; R-918 closed and moved to
CLOSED-ITEMS with the recipe that made the check possible.

Meta's help page is wrong about Meta's own rendering: it states 2.4:1 for the
mobile cover where the header measures 1.504:1, so this session's first-pass
arithmetic -- explicitly labelled arithmetic, not a check -- under-predicted the
crop about fivefold. That is recorded rather than quietly deleted.

Also: the evidence secret scan needed --exclude=README.md, because that README
quotes the search strings and was matching itself (4 false EAA hits, 1 false
access_token); with the exclusion, control 1 -> 0 and no real hit. And the
Business & legal section header was already miscounted before this session
(said 9/P2 4, actually held 10/P2 5) -- corrected; five other section headers
drift too and are named in the report, left for a session that owns the register.
This commit is contained in:
2026-10-08 21:50:57 +02:00
parent 6a2670101a
commit a76207945e
10 changed files with 148 additions and 46 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@@ -20,7 +20,11 @@ Baseline `felhom.eu` `main` = `1d692734` (clean on both working trees before the
| `B5-username-after.jpg` | „Oldal általános beállításai" showing the saved username |
| `C1-page-computer-1435px.jpg` | the Page at a 1435 px viewport (the Phase C computer check) |
| `C1-page-computer-2067px.jpg` | the same at 2067 px — the cover container is capped at 1250 px, so both show the identical cover |
| `C2-page-phone-pixel9-412px.jpg` | the Page on an emulated Pixel 9 (412 × 924, mobile user agent) — the Phase C phone check |
| `C2-phone-cover-cut.png` | the phone header at native size: the cover's left edge is cut |
| `C2-phone-headline-cut-closeup.png` | the close-up: „**aját szabályaid**" and „**elhom.eu**" — one letter gone from each |
| `C3-narrow-window-horizontal-scroll.jpg` | the proof that narrowing the window does NOT give the phone layout (see below) |
| `D-ci-run-846-green.jpg` | the CI run for the first commit of this work |
| `probe-before/` | `fb_probe.py read` before the edits — `C1-page.json` holds the OLD `about` |
| `probe/` | `fb_probe.py read` after the edits — `C1-page.json` holds the NEW `about`; `run.log` is the run transcript |
@@ -47,7 +51,31 @@ saját szabályaid" and „felhom.eu" are whole. The profile circle renders 168
**16–17 px below the cover's bottom edge** — it does not overlap the cover at all at this width, so it
covers no cover text. Zoomed on the circle, the logo is whole: nothing is cut by the circular crop.
**Phone width (390 px): NOT performed.** What was tried, in order:
**Phone width: MEASURED on a Pixel 9, and it FAILS — the cover is cut.** See
`C2-page-phone-pixel9-412px.jpg`, `C2-phone-cover-cut.png` and
`C2-phone-headline-cut-closeup.png`.
The mobile Page header renders **412 × 274 CSS px = 1,504:1**. Our cover is 2,628:1, so Facebook keeps its
full height and shows only the **centre 938 px of its 1640 px width (57,2 %)** — **351 px cut from each
side**. `marketing/facebook/build.py` builds to a safe area of the centre 1028 × 544, which leaves 306 px
clear of each edge: **45 px per side wider than the phone actually shows**. Measured on the shipped file,
the light text in `out/cover-c.png` runs from x 333 to x 997 and the left crop edge is x 351, so the first
**18 px of the text are cut**. On screen the headline reads „**aját szabályaid**" and the wordmark reads
„**elhom.eu**". Filed as **R-919**; nothing was re-cropped on Facebook, per the task's fence.
The mobile profile circle is also much bigger than the README assumed: **172 px, centred**, overlapping the
bottom **112 px** of the 274 px cover — in source coordinates it hides x 637–1030 × y 369–624. It covers
part of the dashboard picture, no text.
**Two things this contradicts.** Meta's own help page says the mobile cover is **2,4:1**; the Page header
measures **1,504:1**, so Meta is wrong about its own rendering. And the arithmetic this file carried before
the measurement — „a 2,4:1 crop loses ~71 px a side, and the safe area is 306 px clear, so the headline
should survive" — was right in method and **wrong in conclusion**, because it trusted Meta's ratio. The
real crop is five times deeper. It is left recorded here as the reason not to report arithmetic as a check.
### How to get Facebook's phone layout at all (this took several wrong turns)
What does **not** work — narrowing the browser window:
1. `resize_window` to 1440 × 900 and to 390 × 844 while the Chrome window was maximised — the tool
reported success each time and `window.innerWidth` never moved (2133).
@@ -55,32 +83,40 @@ covers no cover text. Zoomed on the circle, the logo is whole: nothing is cut by
state change took effect — several later calls reported success and changed nothing.
3. With the window narrowed to about 500 px (`C3-narrow-window-horizontal-scroll.jpg`), **`www.facebook.com`
kept the desktop layout and grew a horizontal scrollbar**: `window.innerWidth` stayed pinned at 1105
and `document.documentElement.scrollWidth` at 2051. The desktop site has a minimum width and never
switches to the phone layout.
and `document.documentElement.scrollWidth` at 2051. The desktop site has a minimum width.
4. `https://m.facebook.com/felhom.eu` redirected to `https://www.facebook.com/felhom.eu?_rdr`.
So narrowing a desktop browser cannot produce Facebook's phone rendering — it needs a mobile user agent
(Chrome DevTools device toolbar, Ctrl+Shift+M) or a real phone. Filed as **R-918**.
What **does** work — Chrome DevTools device mode, which also sets the user agent:
**What the numbers predict for the phone, as arithmetic and not as a measurement.** Meta's page says the
mobile cover is 2,4:1 and the profile circle overlaps it by about 40 px. Our cover is 1640 × 624 =
2,628:1. Reaching 2,4:1 at full height keeps 624 × 2,4 = 1497,6 px of the 1640 px width, so about 71 px
would be cut from each side. Our safe area is the centre 1028 × 544, which is 306 px clear of each edge —
comfortably inside that crop. This says the headline should survive; it does not show that it does.
5. F12 → Ctrl+Shift+M → pick **Pixel 9** (412 × 924, dpr 2,625, Android UA). Set this on the tab the
browser tools drive: emulation is per-tab and cannot be switched on from the page.
6. **Reload afterwards.** Without the reload Facebook keeps serving the already-booted desktop bundle and
the content stays 901 px wide inside the 412 px viewport (`clientWidth` 412, `scrollWidth` 901). After
it, `clientWidth == scrollWidth == 412` — no overflow, the real mobile layout.
7. `www.facebook.com/felhom.eu` then hung on the Facebook splash (14 divs, no images, `readyState`
complete). `m.facebook.com/felhom.eu` loaded properly — the redirect in step 4 only happened because the
user agent was still a desktop one.
8. Set DevTools' device-mode zoom to 100 %, or screenshots come back at the scaled size (118 × 264 at 29 %).
`getImageData` on a Facebook CDN image throws `SecurityError` (tainted canvas), so the cover cannot be
analysed in the page — read it off the screenshot.
## Secret scan
Run over this whole directory, with a planted control:
Run over this whole directory, with a planted control. **`--exclude=README.md` is load-bearing: this file
quotes the search strings verbatim, so without it the scan finds itself** (4 false `EAA` hits and 1 false
`"access_token"`) and stops being able to tell a real hit from its own documentation.
```
printf 'EAAfakeprobe\n' > decoy-control.txt
grep -r -o -a 'EAA' . -> 1 (the control, so the search works)
grep -r -o -a --exclude=README.md 'EAA' . -> 1 (the control, so the search works)
rm decoy-control.txt
grep -r -o -a 'EAA' . -> 0
grep -r -o -a '"access_token"' . -> 0
grep -r -o -a -iE 'jelszo|jelszó|password' . -> 0
grep -r -o -a --exclude=README.md 'EAA' . -> 0
grep -r -o -a --exclude=README.md '"access_token"' . -> 0
grep -r -o -a --exclude=README.md -iE 'jelszo|jelszó|password' . -> 0
```
The exclusion is safe because this file is written by hand and holds no captured output.
The first pass found **1** real hit: `probe/run.log` line 1, the probe's own
`key FACEBOOK_API: <n> chars, starts EAA` line. That is token metadata, not a token, but it was redacted
in place before committing and the line says so. No token, no password and no personal data is in this