diff --git a/REPORT-facebook-cover-r919.md b/REPORT-facebook-cover-r919.md index d366c3cc..c56de85e 100644 --- a/REPORT-facebook-cover-r919.md +++ b/REPORT-facebook-cover-r919.md @@ -288,6 +288,34 @@ not the commit. **What is NOT claimed:** that CI passed. It did not run. This commit re-triggers it, and the next run's verdict is the one to read. +## 14. The Facebook app, measured — and cover C to the operator's layout (2026-10-09) + +**The app is no longer the unmeasured view.** The operator opened the live Page in **Facebook Lite** and in +Chrome on his phone. Both screenshots were solved the same way as before, against the laptop frame whose +position in the file is known: + +| view | cover band | visible window | profile circle | +|---|---|---|---| +| Chrome on the phone | 1.510 : 1 | **x 349 .. 1291** | x 645..1021, top y **451** | +| **Facebook Lite app** | 1.508 : 1 | **x 349 .. 1290** | x 645..1021, top y **453** | + +**The app crops exactly like signed-in mobile web**, and both agree with R-919's emulator (351..1289). Their +circle sits *lower* than the emulator's y 369, so that figure was pessimistic, not wrong — the margin it +bought was real. Five views are measured now, and the **signed-out** one is still the binding constraint. + +**Cover C now follows the operator's draft:** the wordmark big on top (88 px, was 44), a small gap, then the +catchphrase. One thing had to give, and it is written down rather than quietly decided: + +- Drawn as he sketched it — big wordmark **and** two catchphrase lines — the block measured **392 sampled + text pixels behind the signed-out circle**: „saját szabályaid" read „saját szab" in that view. That is + the R-919 defect itself, so it was not shipped. +- Sizing the two lines to fit above y 232 instead works out at a **25 px capital** — exactly the legibility + floor, and a big step down from the 43 px the cover had. +- **One line keeps all three things**: the wordmark big (88 px), the capital at 34 px, and **0 text pixels + behind any circle in any of the five views**. The laptop moved right and shrank to 540 px to free the + width; 64 % of it is cropped or covered somewhere, which is what the decor layer is for and what the + build reports. + ## 10. Teardown Nothing on any host, the hub or Facebook. The work ran in the two git working trees only; the throwaway diff --git a/documentation/backlog/OPEN-ITEMS.md b/documentation/backlog/OPEN-ITEMS.md index b8c0e1a8..454a8833 100644 --- a/documentation/backlog/OPEN-ITEMS.md +++ b/documentation/backlog/OPEN-ITEMS.md @@ -272,7 +272,7 @@ stopping line that lies. | **R-915** | Business & legal | P4 | **The Meta app `felhom.eu` is in development mode, so posts it makes are seen only by people with a role on the app.** READ 2026-10-08 (Meta docs, cited in the spike); not measured. MEASURED: development mode does not refuse posting (both test writes HTTP 200). Live needs display name, contact e-mail, a Terms of Service URL, an app icon, a category and the app purpose (privacy-policy and data-deletion URLs listed beside them). The robot's Page assignment, missing at first, was done by the operator the same day. | **WAITING-ON-OPERATOR** | R-813 (the Terms of Service URL) | Before real public posts: switch the app to Live in the Meta developer page. If nothing is done: posts stay invisible to the public. After Live: CC adds the Page link to the website footer (not before — a link to a Page nobody can read is worse than none) | operator | | **R-916** | Business & legal | P4 | **The logo has no usable vector master: `website/assets/logo.svg` sets „felhom.eu" as live text in the fonts „M+ 2c" and „Vremena Grotesk", which DooPlex does not have, so every renderer here draws other letters.** SEEN 2026-10-08 (Facebook pictures task): librsvg drew the lettering in DejaVu; `fc-match` resolves the family to DejaVu Sans. The PNG (645 x 408) is the only faithful copy, which caps every picture made from it at about that size (`marketing/facebook/README.md`). | **WAITING-ON-OPERATOR** | the machine with the fonts | In Inkscape on that machine: select the lettering → Path → Object to Path → save as `website/assets/logo-master.svg`; then `marketing/facebook/build.py` can use it. If nothing is done: the PNG stays the master; larger prints will be soft | operator | | **R-917** | Business & legal | P4 | **`COPY.md` §2, the Page's longer description (867 characters), has nowhere to go: Facebook's current Pages experience has no long-description field at all.** FOUND 2026-10-08 (Page setup task, `audits/facebook-page-setup-2026-10-08/`). Looked in four places, all on the live Page as its admin: the Page's „Névjegy" tab (Rövid áttekintés / Személyes adatok / Részletek — only a 255-character „Bemutatkozás" and the pinned category), Business Suite's „Oldal módosítása" dialog (profile picture, cover, Bemutatkozás, category, phone, e-mail, address, website, social links — and nothing else), Facebook settings → „Oldal adatai" (redirects to the same Névjegy tab) and settings → „Oldal beállítása" (name, access, type, history, status, recommendation, messaging, data sharing). MEASURED by Graph with the Page token: `description`, `general_info` and `bio` all read `null`. Writing `description` by API would need `pages_manage_metadata`; the robot key's scopes are `read_insights, pages_show_list, business_management, pages_read_engagement, pages_read_user_content, pages_manage_posts, pages_manage_engagement, public_profile`, and the task's fences forbid adding a permission. So §2 is written, reviewed and unplaceable. **Options for the operator:** (a) leave §2 unused and let the 99-character intro plus the website carry it; (b) shorten §2 to ≤ 255 characters and make it the „Bemutatkozás" instead of §1 — but §1 was written for exactly that slot, so this is really „rewrite one of the two"; (c) publish §2 as the Page's first pinned post once the app is Live (R-915), which is where a long text actually gets read; (d) ask Meta support whether the field still exists for this Page type. Recommended (c) — the text reads like a post already. | **WAITING-ON-OPERATOR** | the choice a/b/c/d; (c) also waits on R-915 | Pick a/b/c/d. If nothing is done: §2 stays in `COPY.md` unused and the Page carries only the 99-character intro | operator | -| **R-919** | Business & legal | P3 | **On a phone the Facebook Page cuts the left edge of the cover: the „s” of „saját szabályaid” and the „f” of „felhom.eu” are gone.** MEASURED 2026-10-08 on the live Page in Chrome DevTools device mode, Pixel 9 (412 × 924, mobile user agent, after a reload so Facebook serves the mobile bundle): `audits/facebook-page-setup-2026-10-08/C2-phone-headline-cut-closeup.png`. The mobile Page header is **412 × 274 = 1,504:1**, so Facebook keeps our cover's 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** (306 px clear of each edge), which is **45 px wider per side than the phone actually shows**; 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. Covers A and B are built from the same safe area and will have the same edge. Two further facts this measurement establishes: **Meta's own help page is wrong about its own rendering** — it states the mobile cover is 2,4:1 where the Page header measures 1,504:1 — and the mobile profile circle is far bigger than assumed (172 px, centred, overlapping the bottom 112 px of the 274 px cover, i.e. source x 637–1030 × y 369–624 is hidden). Not re-cropped on Facebook, per the task's fence. **-- 2026-10-09, FIXED in the build:** `marketing/facebook/build.py` now takes the phone view from the measurement (`PHONE_HDR = (412, 274)` -> the centre 938 px), so SAFE is (391, 40)-(1249, 584) and the phone profile circle is the measured CENTRED box (637, 369, 393) rather than a left-anchored one. Every cover is drawn in a derived `BAND` (408, 48)-(1249, 340), and a `cap` check holds each headline's capital at >= 4 % of the cover height. The red-proof runs on EVERY build (`control_old_window`): it draws the headline where the old 640 x 360 assumption put it, x 328, and the check must reject it -- the phone's crop edge is x 351, so 23 px were cut. Against the three covers as committed at `a76207945e` the new check convicted 3 of 3 (A 23/22 px over the left/right edges, B 63/58 px plus 1017 content pixels under the phone circle, C 63/82 px plus 1778). The profile pictures are untouched -- sha256 identical before and after. **-- 2026-10-09 (operator refinements, same day):** the profile picture now carries the logo MARK only (the lettering was unreadable at 176 px; the mark grew 69 % -> 76 % of the circle, canvas 932 -> 648), and the covers set the headline the way `site.css` sets `.page-index .hero-text h1` (Bold 700, letter-spacing -0.03em, not ExtraBold 800 untracked) with „felhom.eu” drawn from the logo's OWN lettering instead of typed. No geometry changed; every R-919 check and the red-proof stand. **-- 2026-10-09 (second measurement):** a phone has TWO views and they disagree. SIGNED IN the sides are cut (confirmed on the operator's REAL phone, Chrome/Android: the window solves to x 351..1298 against the emulator's 351..1289 - the left edge to the pixel). SIGNED OUT the FULL width is shown but the cover is top-anchored and only the top 525 px survives (the bottom 99 px is cut; the file's blue top rule is still visible, which is how the side was established), with a much bigger, higher circle at x 486..1150 from y 232. `build.py` now carries both views, models the circles as DISCS rather than rectangles running to the bottom, and splits the artwork into a READ layer (must survive every view) and a DECOR layer (may be cropped or covered; the build reports the cost - B 39 %, C 62 %). The two-view geometry convicted all three then-current covers before the redraw (A 908 px under a circle, B 1715, C 1962). Covers redrawn: C is the operator's laptop idea with the dashboard at 640 px (was 370), B's motif grown to match. | **VERIFY -- rebuilt on `main` 2026-10-09; three views measured, the Facebook APP still is not.** The three measured views disagree with each other and with Meta's help page, so the app is the one that decides. | — | Operator: upload the rebuilt cover (and the profile picture) by hand, then open the Page in the Facebook APP on a phone and say whether the headline and „felhom.eu” are whole. Close on that word. If the app crops differently again, send a screenshot - the last two were solved straight out of the picture - and move `PHONE_IN_X` / `PHONE_OUT_Y` / `PHONE_CIRCLES`; the designs follow them | CC | +| **R-919** | Business & legal | P3 | **On a phone the Facebook Page cuts the left edge of the cover: the „s” of „saját szabályaid” and the „f” of „felhom.eu” are gone.** MEASURED 2026-10-08 on the live Page in Chrome DevTools device mode, Pixel 9 (412 × 924, mobile user agent, after a reload so Facebook serves the mobile bundle): `audits/facebook-page-setup-2026-10-08/C2-phone-headline-cut-closeup.png`. The mobile Page header is **412 × 274 = 1,504:1**, so Facebook keeps our cover's 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** (306 px clear of each edge), which is **45 px wider per side than the phone actually shows**; 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. Covers A and B are built from the same safe area and will have the same edge. Two further facts this measurement establishes: **Meta's own help page is wrong about its own rendering** — it states the mobile cover is 2,4:1 where the Page header measures 1,504:1 — and the mobile profile circle is far bigger than assumed (172 px, centred, overlapping the bottom 112 px of the 274 px cover, i.e. source x 637–1030 × y 369–624 is hidden). Not re-cropped on Facebook, per the task's fence. **-- 2026-10-09, FIXED in the build:** `marketing/facebook/build.py` now takes the phone view from the measurement (`PHONE_HDR = (412, 274)` -> the centre 938 px), so SAFE is (391, 40)-(1249, 584) and the phone profile circle is the measured CENTRED box (637, 369, 393) rather than a left-anchored one. Every cover is drawn in a derived `BAND` (408, 48)-(1249, 340), and a `cap` check holds each headline's capital at >= 4 % of the cover height. The red-proof runs on EVERY build (`control_old_window`): it draws the headline where the old 640 x 360 assumption put it, x 328, and the check must reject it -- the phone's crop edge is x 351, so 23 px were cut. Against the three covers as committed at `a76207945e` the new check convicted 3 of 3 (A 23/22 px over the left/right edges, B 63/58 px plus 1017 content pixels under the phone circle, C 63/82 px plus 1778). The profile pictures are untouched -- sha256 identical before and after. **-- 2026-10-09 (operator refinements, same day):** the profile picture now carries the logo MARK only (the lettering was unreadable at 176 px; the mark grew 69 % -> 76 % of the circle, canvas 932 -> 648), and the covers set the headline the way `site.css` sets `.page-index .hero-text h1` (Bold 700, letter-spacing -0.03em, not ExtraBold 800 untracked) with „felhom.eu” drawn from the logo's OWN lettering instead of typed. No geometry changed; every R-919 check and the red-proof stand. **-- 2026-10-09 (second measurement):** a phone has TWO views and they disagree. SIGNED IN the sides are cut (confirmed on the operator's REAL phone, Chrome/Android: the window solves to x 351..1298 against the emulator's 351..1289 - the left edge to the pixel). SIGNED OUT the FULL width is shown but the cover is top-anchored and only the top 525 px survives (the bottom 99 px is cut; the file's blue top rule is still visible, which is how the side was established), with a much bigger, higher circle at x 486..1150 from y 232. `build.py` now carries both views, models the circles as DISCS rather than rectangles running to the bottom, and splits the artwork into a READ layer (must survive every view) and a DECOR layer (may be cropped or covered; the build reports the cost - B 39 %, C 62 %). The two-view geometry convicted all three then-current covers before the redraw (A 908 px under a circle, B 1715, C 1962). Covers redrawn: C is the operator's laptop idea with the dashboard at 640 px (was 370), B's motif grown to match. **-- 2026-10-09 (the APP measured):** the operator checked the live Page in Facebook Lite and in Chrome on his phone. Solved against the laptop frame, both give a visible window of x 349..1290 / 349..1291 - the LITE APP CROPS EXACTLY LIKE SIGNED-IN MOBILE WEB, and both agree with the emulator's 351..1289. Their circle is at x 645..1021 from y 451, LOWER than the emulator's 369, so that figure was pessimistic rather than wrong. Five views measured; the signed-out one stays the binding constraint. Cover C redrawn to the operator's layout (wordmark 88 px on top, gap, catchphrase) - one line, not his two, because two measured 392 text pixels behind the signed-out circle („saját szabályaid” read „saját szab”) and sizing them to fit drops the capital to the 25 px floor. | **VERIFY -- rebuilt on `main` 2026-10-09. The app IS now measured and the cover renders correctly there; what is left is the operator's look at the NEW cover in the app after uploading it.** | — | Operator: upload the rebuilt cover-c (and the profile picture if not already), then confirm in the Facebook app that the wordmark and the catchphrase are whole. Close on that word | CC | ## Process & tooling — 23 rows (P3 3, P4 20) diff --git a/marketing/CHANGELOG.md b/marketing/CHANGELOG.md index 90f9511b..4fc4e9df 100644 --- a/marketing/CHANGELOG.md +++ b/marketing/CHANGELOG.md @@ -1,5 +1,25 @@ # marketing — CHANGELOG +## facebook — the Facebook APP measured at last; cover C to the operator's layout (2026-10-09) + +- **The app view is no longer unmeasured.** The operator checked the live Page in **Facebook Lite** and in + Chrome on his phone. Solved against the laptop frame, both give a visible window of **x 349..1290** and + **x 349..1291** — the Lite app crops exactly like signed-in mobile web, and both agree with R-919's + emulator (351..1289). Their profile circle sits at **x 645..1021 from y 451**, i.e. LOWER than the + emulator's y 369, so the emulated figure was pessimistic and the build's margin was real. **Five views + are now measured and the signed-out one remains the binding constraint** (circle top y 232, bottom cut + at 525). +- **Cover C now follows the operator's draft:** the wordmark **big on top** (88 px, was 44), a small gap, + then the catchphrase. The catchphrase is **one line**, not the two he drew, and the measurement forces + that: with the signed-out circle starting at y 232, a wordmark that size plus two catchphrase lines + cannot both sit above it. Drawn as two lines it measured **392 sampled text pixels behind that circle** + — „saját szabályaid" read „saját szab" there, which is exactly the R-919 defect. Shrinking the two lines + to fit instead drops the capital to 25 px, the legibility floor. One line keeps the wordmark big, the + capital at 34 px and **every measured view clean (0 text pixels behind any circle)**. +- The laptop moved right and down to 540 px to make room for the one-line catchphrase; 64 % of it is + cropped or covered in some view, which the build reports and which is what decor is for. + + ## facebook — a phone has TWO views of the cover, not one; the covers fill the frame again (2026-10-09) The operator saw the cover UNCROPPED on a signed-out phone and asked why, after R-919 had said the sides diff --git a/marketing/facebook/build.py b/marketing/facebook/build.py index 23adc8f2..7aae9f59 100644 --- a/marketing/facebook/build.py +++ b/marketing/facebook/build.py @@ -413,20 +413,27 @@ def content_c(): c = Image.new("RGBA", (CW, CH), (0, 0, 0, 0)) d = ImageDraw.Draw(c) tx = BAND[0] + 12 - size = headline_fit(L2, 400, 58) - headline(c, tx, 104, L1, size, TEXT1) - headline(c, tx, 104 + size + 12, L2, size, BLUE_BRIGHT) - wordmark(c, tx, 104 + size + 26, round(size * 0.80)) + # The operator's layout (2026-10-09): the wordmark BIG on top, a small gap, then the catchphrase. + # The catchphrase is ONE line, not the two he drew, and that is forced by the measurement: the + # SIGNED-OUT circle starts at y 232, and a wordmark this size plus two catchphrase lines cannot + # both sit above it. Drawn as two lines it measured 392 sampled text pixels behind that circle - + # „saj\u00e1t szab\u00e1lyaid" read „saj\u00e1t szab" there, which is the very defect R-919 is about. Sizing the + # two lines to fit instead pushes the catchphrase to a 25 px capital, the legibility floor. One + # line keeps the wordmark big, the catchphrase readable and every measured view clean. + wordmark(c, tx, 50, 88) + size = headline_fit(SLOGAN, 580, 48) + x = headline(c, tx, 190, L1 + " ", size, TEXT1) + headline(c, x, 190, L2, size, BLUE_BRIGHT) # DECOR: the dashboard, now big enough to read, running off the right edge and under the circles dec = Image.new("RGBA", (CW, CH), (0, 0, 0, 0)) d = ImageDraw.Draw(dec) shot = Image.open(SHOT).convert("RGBA") # The domain chip next to the title names the demo box; covered with the page colour (copy only, source unchanged). ImageDraw.Draw(shot).rectangle((684, 32, 826, 70), fill=hexc("#0B1322")) - sw = 640 - sh = int(round(sw * shot.height / shot.width)) + sw = 540 # smaller than before: the one-line catchphrase + sh = int(round(sw * shot.height / shot.width)) # needs the width, so the laptop moves right shot = shot.resize((sw, sh), Image.LANCZOS) - fx, fy, b = 880, 46, 24 # frame left/top, bezel + fx, fy, b = 1055, 46, 24 # frame left/top, bezel d.rectangle((fx, fy, fx + sw + 2 * b, fy + sh + 2 * b), fill=BG2, outline=LINE, width=3) dec.alpha_composite(shot, (fx + b, fy + b)) base_y = fy + sh + 2 * b diff --git a/marketing/facebook/out/cover-c.png b/marketing/facebook/out/cover-c.png index 5327629e..72f4e8b6 100644 Binary files a/marketing/facebook/out/cover-c.png and b/marketing/facebook/out/cover-c.png differ diff --git a/marketing/facebook/out/preview.html b/marketing/facebook/out/preview.html index d5e9b2e7..34e2f0e0 100644 --- a/marketing/facebook/out/preview.html +++ b/marketing/facebook/out/preview.html @@ -29,5 +29,5 @@ mark grew to 76 % of the circle. BOTH backgrounds now read at 40 px, which was n there: dark matches the covers and the Page as it stands, white separates the circle from the dark cover. The covers below show the dark one.
Computer — the whole picture, and the profile circle sits BELOW it. Dashed = the safe area (preview only).
Computer — the whole picture, and the profile circle sits BELOW it. Dashed = the safe area (preview only).
Computer — the whole picture, and the profile circle sits BELOW it. Dashed = the safe area (preview only).
Computer — the whole picture, and the profile circle sits BELOW it. Dashed = the safe area (preview only).
Computer — the whole picture, and the profile circle sits BELOW it. Dashed = the safe area (preview only).
Computer — the whole picture, and the profile circle sits BELOW it. Dashed = the safe area (preview only).