From e3741ae493db7f8c1cdbe50834fbd906a7325db7 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Fri, 9 Oct 2026 15:14:55 +0200 Subject: [PATCH] facebook: the first post SCHEDULED for 2026-10-12 19:00 (R-917 -> VERIFY) Not public. It sits in Planner until Monday evening and can still be changed or deleted there. THE POST. Operator chose version 6.2 (kozepes), Hungarian only, 638 Unicode characters, 0 emoji, 0 hashtags. He chose Monday over today on the reasoning offered: it was Friday 15:08, the weakest evening of the week for a first post, and three days in Planner is review time. post id 1360018983863273_122096547315511222 due 2026-10-12 19:00 Europe/Budapest = epoch 1791824400 = 17:00 UTC link https://felhom.eu/ READ BACK, and the hex check recomputed OUTSIDE the probe so it is not the same instrument twice: is_published False; scheduled time sent == read; message sha256 887514383eff997c on both sides (COPY.md 6.2 and what Facebook returned). Present in GET /{page}/scheduled_posts. And from a DIFFERENT CHANNEL than the API: Planner shows it on H 12 at 19:00 with the link card. SCENARIO A, the dry check that had to come first. A throwaway scheduled post WITH THE LINK was accepted -- so `link` is not refused on a scheduled post, which was the open question. Read back hex-equal and unpublished, seen PRESENT in the scheduled list, deleted, seen ABSENT in the same list. The removal proof comes from the LIST, not from an error after DELETE, which is what R-914 asked for. CHECKED RATHER THAN COPIED. The post repeats the website's "56 alkalmazas". The apps page carries 57
while saying 56 -- which reads as an off-by-one until you read the category line, "6 alkalmazas + 1 beepitett". The 57th card is FileBrowser, built into every box and deliberately not counted; index.html says "56 telepitheto alkalmazas" too. NOT-A-FINDING, and a "fix" would have made a live public page wrong. R-917 -> VERIFY (close when the operator confirms it published and is pinned). R-914 noted, NOT closed: schedule-post covers text + link only; the photo path stays unbuilt because the spike could not prove a scheduled PHOTO stays hidden, and the pin, comment moderation and post-insight read-back are still missing. Secret scan on the committed evidence: planted EAA decoy 1 -> 0 after deletion, 0 access_token, no run.log. --- REPORT-facebook-first-post.md | 165 ++++++++++++++++++ .../A1-planner-monday-19-00.jpg | Bin 0 -> 39636 bytes .../probe/A1-debug-token.json | 63 +++++++ .../probe/B1-me.json | 25 +++ .../probe/B2-me-accounts.json | 44 +++++ .../probe/B3-debug-page-token.json | 64 +++++++ .../probe/F1-headers.json | 7 + .../probe/P1-create.json | 27 +++ .../probe/P2-readback.json | 29 +++ .../probe/P3-list.json | 36 ++++ .../probe/P9-verdict.json | 14 ++ .../probe/S1-dry-create.json | 27 +++ .../probe/S2-dry-readback.json | 28 +++ .../probe/S3-list-before.json | 36 ++++ .../probe/S4-dry-delete.json | 22 +++ .../probe/S5-list-after.json | 25 +++ .../probe/S9-dry-verdict.json | 15 ++ documentation/backlog/OPEN-ITEMS.md | 4 +- marketing/CHANGELOG.md | 30 ++++ 19 files changed, 659 insertions(+), 2 deletions(-) create mode 100644 REPORT-facebook-first-post.md create mode 100644 documentation/audits/facebook-first-post-2026-10-09/A1-planner-monday-19-00.jpg create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/A1-debug-token.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/B1-me.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/B2-me-accounts.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/B3-debug-page-token.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/F1-headers.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/P1-create.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/P2-readback.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/P3-list.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/P9-verdict.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/S1-dry-create.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/S2-dry-readback.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/S3-list-before.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/S4-dry-delete.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/S5-list-after.json create mode 100644 documentation/audits/facebook-first-post-2026-10-09/probe/S9-dry-verdict.json diff --git a/REPORT-facebook-first-post.md b/REPORT-facebook-first-post.md new file mode 100644 index 00000000..0df033fd --- /dev/null +++ b/REPORT-facebook-first-post.md @@ -0,0 +1,165 @@ +# Facebook — the Page's first post, drafted and scheduled + +2026-10-09 · Page `1360018983863273` · evidence `documentation/audits/facebook-first-post-2026-10-09/` + +Own file on purpose: the shared `REPORT.md` belongs to whoever else is in this clone. + +--- + +## In plain words + +The Page's first post is **written, approved by the operator, and scheduled for Monday 2026-10-12 at +19:00** Budapest time. It is **not public yet** — it sits in Meta Business Suite → Tervező (Planner), +where it can still be changed or deleted. The robot cannot publish anything immediately; that is +enforced in the code, not left to care. + +One thing the operator should know: the post repeats the website's "56 alkalmazás" figure, and I +nearly changed it. The apps page carries **57** cards while saying 56 — which looks like an off-by-one +until you read the category line, *„6 alkalmazás + 1 beépített"*. The 57th card is FileBrowser, built +into every box and deliberately not counted. **56 is correct.** + +**The operator's one remaining click:** after the post goes out on Monday evening, pin it — +„…" → „Kiemelés". + +--- + +## 1. Baselines and commits + +| | | +|---|---| +| baseline | task named `fe80548144`; `main` was already at `96f68f1b44` when pulled (other sessions) | +| drafts + `schedule-post` | **`3a77ed73aa`** | +| records (this report) | see §9 | + +No architecture document covers marketing, and none should — it is a business tool, not part of the +product. The decision home is `CONTEXT.md` (2026-10-08 Facebook entry). + +## 2. Scenario A — the dry check + +A throwaway scheduled post, created **with the link**, read back, listed, deleted, listed again: + +| step | result | +|---|---| +| create with `link=https://felhom.eu/` | **accepted** — the open question in §3 of the brief is answered: `link` is not refused on a scheduled post | +| read-back | `is_published=False`, `scheduled_publish_time` equal to what was sent, message **hex-equal** | +| which list call answered | **`GET /{page}/scheduled_posts`** — the documented edge; the `feed?is_published=false` fallback was not needed | +| present before delete | **True** | +| after delete | **absent: True** | + +The removal proof comes from the **list**, not from an error after `DELETE` — which is what R-914 asks +for, and the reason `list_scheduled()` returns `None` rather than a guess when both routes are refused. + +`documentation/audits/facebook-first-post-2026-10-09/probe/S*.json`. + +## 3. The post + +| | | +|---|---| +| version | **6.2 Közepes** (operator's choice at the STOP) | +| length | **638 Unicode characters** | +| language | Hungarian only (operator declined an English paragraph) | +| emoji / hashtags | **0 / 0** — see below | +| link | `https://felhom.eu/` | +| scheduled | **2026-10-12 19:00 Europe/Budapest** = epoch `1791824400` = 17:00 UTC | +| post id | `1360018983863273_122096547315511222` | +| permalink (after it publishes) | `https://www.facebook.com/122096546283511222/posts/122096547315511222` | + +Zero emoji and zero hashtags although the brief allowed two of each: the Felhom design system uses no +emoji (the website gate holds it at 0), and two hashtags would have served no real search. + +The operator chose Monday over today on the reasoning offered: it was Friday 15:08, and a Friday +evening is the weakest slot of the week for a first post — three days in Planner is also review time. + +## 4. Read-back + +| check | result | +|---|---| +| `is_published` | **False** | +| `scheduled_publish_time` sent vs read | **equal** (`1791824400`) | +| message hex-equal to `COPY.md` §6.2 | **True** | +| sha256, recomputed **outside** the probe | COPY.md `887514383eff997c` = posted `887514383eff997c` | +| epoch → wall clock, checked with the tz database | `2026-10-12 19:00 CEST (Monday)` | +| in `scheduled_posts` | **True** | +| Planner, a different channel from the API | the card sits on **H 12 at 19:00** with the link preview attached (`A1-planner-monday-19-00.jpg`) | + +## 5. Published yet? + +**No — the time has not come.** Monday 19:00 Budapest is in the future at the time of writing. The +next session (or this one, if still open then) reads it back: `is_published` must become `true` and +the permalink must resolve. **If it did not publish, report it — do not post again.** + +## 6. The operator's next click + +After it goes out on Monday evening: open the post on the Page, „**…**" → „**Kiemelés**" to pin it to +the top. Not done by API: the pin endpoint is unproven and one click is enough. + +## 7. `schedule-post` — what it is and what it refuses + +A third sub-command on `fb_probe.py`, reusing its token loader (R-453), redaction, Bearer call and +evidence writer. The guards, each with a test: + +- **It cannot publish immediately.** `published` is always `"false"` and **no argument can change it** + — the test enumerates every keyword `schedule_form()` accepts and asserts none of them flips it. + The operator's review in Planner is the safety net, so an immediate post has to be *unreachable*, + not merely not-the-default. +- **The body is read from `COPY.md` by section name**, never passed through a shell or an argv string + (brief §9.6). The caller names `6.2`; the Hungarian stays in the file. +- **`check_when()` refuses** a time under Meta's 10-minute floor or over its 6-month ceiling, *before* + the call, so a bad time is a readable local refusal rather than a Graph error. +- **`budapest_to_epoch()` uses the real tz database** and **refuses** if `Europe/Budapest` is missing + rather than falling back to a hardcoded `+01:00`/`+02:00`. Guessing the offset is how a post goes + out an hour wrong across a DST boundary. +- **`list_scheduled()` records which route answered** and returns `None` when both are refused, so a + caller says "unproven" instead of claiming a removal it never saw. + +**Tests: 30.** On DooPlex **all 30 pass, none skipped**. On Windows 2 skip — this interpreter ships no +tz database; the command runs on the Linux host, which has the system zoneinfo. + +**Red-proof of the guard that matters**, as the brief requires. `schedule_form` was given a +`published=...` argument, `ScheduleForm` was run, and the test failed: + +``` +AssertionError: 'true' != 'false' : published changed published +``` + +Guard restored, all 30 green again. + +## 8. Secret scan + +``` +plant EAAfakeprobe → grep -rl EAA --exclude=README.md = 1 +delete → grep -rl EAA --exclude=README.md = 0 +access_token in evidence = 0 +run.log in evidence = 0 +``` + +The token comes only from the credentials file on DooPlex, is never printed and never appears in a +logged URL. No `run.log` is committed — the probe's stdout carries the key's length and prefix. + +## 9. Register + +- **R-917 → VERIFY.** The text is scheduled; close when the operator confirms it published and is + pinned. Post id and time recorded in the row. +- **R-914 → noted**, not closed: `schedule-post` exists for **text + link only**. The full skill still + needs the photo path (the spike could not prove a scheduled photo stays hidden), the pin, comment + moderation, and the insight read-back after a post. +- Nothing closed, nothing else opened. + +## 10. Observations + +- **NOT-A-FINDING: the apps page says 56 while carrying 57 cards.** Deliberate — the category line + reads „6 alkalmazás + 1 beépített" and the extra card is FileBrowser, built into every box. + `index.html` says „56 telepíthető alkalmazás" too. Checked before copying the number into a public + post; a "fix" here would have made a live page wrong. +- **NOT-A-FINDING: the link preview on a scheduled post.** The brief's edge case asked what to do if + the preview card is empty. It is not: Planner shows the card with the og-image, and the Sharing + Debugger was re-scraped earlier today for this exact URL. +- **FILED earlier today, still open: R-887** — the lost-job CI flake bit this session's earlier + commits once (`#875`, "Set up job" 11m48s then every step 0s) and passed on re-run. + +## 11. Teardown + +The dry-check post was deleted and its removal proved from the scheduled-posts list. The real post is +**deliberately left in place** — that is the deliverable. Nothing on any box, the hub, or any other +Page. The DooPlex worktree used to run the command was removed; nothing was written into the shared +clone. The browser tab was closed. diff --git a/documentation/audits/facebook-first-post-2026-10-09/A1-planner-monday-19-00.jpg b/documentation/audits/facebook-first-post-2026-10-09/A1-planner-monday-19-00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f65f667bc48c09566de72c47773504b234411011 GIT binary patch literal 39636 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 (`website/adatkezeles.html`) and (`website/feltetelek.html`), Hungarian only, version „Zárt teszt — 1.0 verzió, hatályos: 2026. október 9.” Text of record: `documentation/legal/{adatkezelesi-tajekoztato,feltetelek}-1.0.md`, **derived from the published HTML** so it cannot drift from the page. All 18 pages carry the operator, `info@felhom.eu` and both links in the footer (counted: 18 found = 18 with both links = 18 structurally valid); the English footers say the legal texts are Hungarian, and `site_gates.py` `NO_TWIN` holds the two pages deliberately — an unreviewed English legal text would be worse than an honest pointer. The contact form's consent text was replaced in both languages: the old one claimed „az adatokat harmadik félnek nem adjuk ki” while Resend, Cloudflare and Google carry the message. **Operator rulings 2026-10-09:** no company yet, so the operator is named as a PRIVATE PERSON (Nagyfenyvesi Viktor) with **no postal address and no phone**; publish before the lawyer, because the site was collecting data with no notice at all; and keep three retentions honestly open-ended (website statistics, web server logs, contact messages) rather than promise a date nothing enforces. Four load-bearing claims were MEASURED, not copied from a vendor or a README: zero cookies and no local storage (browser check with a positive control, after the tracker fired; no `Set-Cookie` on any response); the Umami beacon's exact payload (site id, screen, language, title, url, referrer — no visitor identifier); Cloudflare is DNS only (the public A record 37.191.56.193 is not a Cloudflare address); `fsn1` = Falkenstein, Germany. Also measured: `felhom-ep0-copy-gc.timer` is installed and ran successfully (2026-10-09 08:00, exit 0), so the „deleted within 30 days” line is now true where on 2026-10-08 it was written but not switched on. **WHAT REMAINS, which is why this is narrowed and not closed:** the full ÁSZF and the impresszum are still unpublished (they need company data that does not exist); there is no English translation of either legal text; and **no lawyer has reviewed any of it** (R-802). Owner stays operator. | — | **(a) DONE 2026-10-09** — the two URLs are in the Meta app's Basic settings and the app is **Live** (R-915 closed). **(b)** when the company exists, commission the lawyer's review (R-802) and the full ÁSZF + impresszum. If nothing is done: the closed-test set stands as published and unreviewed | operator | | **R-89** | Business & legal | P4 | Retention as a per-customer **commercial** policy on the hub | READY (increment 2) | — | Policy object + reconciler → ep0 prune job; keep box tokens write-only | CC | | **R-794** | Business & legal | P4 | **[P3-LOW] redis 7.4 (RSALv2 / SSPL, not OSI) runs as a private cache in seven apps: dawarich, docmost, immich, nextcloud, outline, paperless-ngx, romm.** READ 2026-10-02 (`audits/licences-2026-10-02/TABLE.md`). Read as permitted (a private cache only its app uses is not Redis offered as a service — inferred). Valkey (BSD-3) or redis 8 (AGPL option) removes the question. **Needs:** a ladder step per app to valkey or redis 8, through the harness — no hurry. | **READY — rank P3-LOW; owner: CC** **Re-ranked 2026-10-03: P3→P4: the row itself says no hurry; usage read as permitted.** | — | — | CC | -| **R-914** | Business & legal | P4 | **Write the Felhom Facebook Page skill from the spike's findings.** Spike 2026-10-08 (`audits/SPIKE-facebook-page-api-2026-10-08.md`): key valid, never expires; the Page (`1360018983863273`) is reached with CREATE_CONTENT/MODERATE/ANALYZE; a scheduled text post and a scheduled photo were created, read back byte-equal and deleted (removal proven). Probe `scripts/facebook/fb_probe.py`. Gap to close in the skill: a scheduled photo's publish state was not read (no `post_id` returned). **2026-10-08 (Page pictures task) — two more for the skill:** (1) **the removal proof was not a proof**: the text post's after-DELETE answer was (#10) „does not exist, cannot be loaded due to missing permission…" — that message also means a permission gap. The skill proves removal by listing the Page's scheduled posts before and after the delete (present, then absent); the operator's Planner view on 2026-10-08 showed nothing on 15 October (a different channel, by eye). (2) **pictures by API** (READ, developers.facebook.com/docs/graph-api/reference/page/picture and …/reference/page/): `POST /{page}/picture` needs the `MANAGE` task, which the robot does not have (measured task list); the cover is `POST /{page}` `cover=`, „only by the Page Admin or Page Editor with `EDIT_PROFILE`" + `business_management`. Neither names `pages_manage_metadata`. Today the pictures are uploaded by hand (`marketing/facebook/README.md`). | **READY — owner: CC** | — | Write the skill (drafts scheduled for operator review by default); read a scheduled photo back through the Page's scheduled-post listing | CC | +| **R-914** | Business & legal | P4 | **Write the Felhom Facebook Page skill from the spike's findings.** Spike 2026-10-08 (`audits/SPIKE-facebook-page-api-2026-10-08.md`): key valid, never expires; the Page (`1360018983863273`) is reached with CREATE_CONTENT/MODERATE/ANALYZE; a scheduled text post and a scheduled photo were created, read back byte-equal and deleted (removal proven). Probe `scripts/facebook/fb_probe.py`. Gap to close in the skill: a scheduled photo's publish state was not read (no `post_id` returned). **2026-10-08 (Page pictures task) — two more for the skill:** (1) **the removal proof was not a proof**: the text post's after-DELETE answer was (#10) „does not exist, cannot be loaded due to missing permission…" — that message also means a permission gap. The skill proves removal by listing the Page's scheduled posts before and after the delete (present, then absent); the operator's Planner view on 2026-10-08 showed nothing on 15 October (a different channel, by eye). (2) **pictures by API** (READ, developers.facebook.com/docs/graph-api/reference/page/picture and …/reference/page/): `POST /{page}/picture` needs the `MANAGE` task, which the robot does not have (measured task list); the cover is `POST /{page}` `cover=`, „only by the Page Admin or Page Editor with `EDIT_PROFILE`" + `business_management`. Neither names `pages_manage_metadata`. Today the pictures are uploaded by hand (`marketing/facebook/README.md`). **-- 2026-10-09: the first slice exists.** `scripts/facebook/fb_probe.py` gained a **`schedule-post`** sub-command (text + link, scheduled only) reusing the probe's token loader, redaction, Bearer call and evidence writer. Guards, each with a test (30 tests; all 30 pass on DooPlex, 2 skip on Windows for want of a tz database): **it cannot publish immediately** — `published` is always `false` and the test enumerates every keyword `schedule_form()` takes to prove none flips it (RED-PROOFED: the guard was removed and the test seen failing, `'true' != 'false'`); the body is **read from `COPY.md` by section**, never through a shell; `check_when()` refuses a time outside Meta's 10-minute..6-month window before the call; `budapest_to_epoch()` uses the real tz database and **refuses** rather than guessing a DST offset; `list_scheduled()` records which route answered and returns `None` when both are refused, so a caller cannot claim a removal it never saw. **What the full skill still needs:** the photo path (the spike could not prove a scheduled PHOTO stays hidden — deliberately not reused), the pin, comment moderation, and the insight read-back after a post. | **READY — owner: CC** | — | Write the skill (drafts scheduled for operator review by default); read a scheduled photo back through the Page's scheduled-post listing | CC | | **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`). **-- MEASURED 2026-10-09, and the premise is WRONG for the file as it stands today:** the lettering in `website/assets/logo.svg` is **already converted to outlines**. All five wordmark elements are `` with real `d=` geometry (`path1 path3 path5 path7 path8`), and **no `` element has any content** — the two that exist are empty leftovers. The `font-family:'M+ 2c'` / `'Vremena Grotesk'` strings that this row cites are Inkscape METADATA left behind on converted paths (`-inkscape-font-specification`), not live text; a grep for `font-family` finds them and reads as live text, which is the likeliest way the original diagnosis went wrong. **Proof from a renderer that does NOT have those fonts:** Chrome draws `logo.svg`'s „felhom.eu” identical to `logo.png`'s, side by side (2026-10-09). **NOT re-tested:** librsvg specifically — DooPlex has no `rsvg-convert`, `inkscape` or `cairosvg` installed today, so the original librsvg/DejaVu observation could not be reproduced either way. It does not change the structural fact: there is no font to substitute. **Consequence:** the 645 x 408 PNG is NOT the only faithful copy and does not cap picture size; `logo.svg` can be rendered at any size, and `website/assets/logo-mark.svg` was cut from it this day (defs + path6 + g2) to fix the website header. | **READY — re-check before doing any work: this may need nothing from the operator at all.** The row asked for an Inkscape pass on „the machine with the fonts”; the measurement above says the file is already outlined and the operator may have nothing to do | nothing — the dependency on „the machine with the fonts” appears to be void (see the measurement) | CC or operator: confirm the outlines render correctly at a large size in one renderer that is not a browser, then CLOSE this row — or, if something really is still live text, say which element. If nothing is done: an operator task sits on the list that probably does not exist | 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. | **DEFERRED — operator chose (c) on 2026-10-09:** park the text and publish it as a post once posting starts. Not a defect, and not waiting on CC | nothing — **UNBLOCKED 2026-10-09**: R-915 is closed, the app is Live, so posting can start whenever the operator wants | When posting starts: publish `COPY.md` §2 (the longer description) as the first pinned post. If nothing is done: the text stays in `COPY.md` unused, which the operator has accepted | 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. **-- SCHEDULED 2026-10-09, option (c) carried out.** The text was shortened from §2 into `COPY.md` §6 (two versions; the operator chose **6.2 Közepes**, 638 Unicode characters, Hungarian only, 0 emoji, 0 hashtags). Scheduled through the robot, **not published**: post `1360018983863273_122096547315511222`, due **2026-10-12 19:00 Europe/Budapest** (epoch 1791824400 = 17:00 UTC, checked against the tz database). Read back: `is_published` **False**, scheduled time sent == read, message **hex-equal** to `COPY.md` §6.2 — and the sha256 recomputed OUTSIDE the probe agrees (`887514383eff997c`). Present in `GET /{page}/scheduled_posts`, and visible in Planner on H 12 at 19:00 with the link card attached (a different channel from the API). It can still be changed or deleted there. The number in the post was checked, not copied: the apps page carries 57 cards while saying 56, which is DELIBERATE — „6 alkalmazás + 1 beépített”, the 57th being FileBrowser, built into every box; `index.html` says „56 telepíthető alkalmazás” too. | **VERIFY -- scheduled on `main` 2026-10-09, due 2026-10-12 19:00. Not public yet; the operator reviews it in Planner and confirms after it goes out** | the scheduled time passing, then the operator's look | Operator: after it publishes on Monday evening, pin it — „…” → „Kiemelés”. Close on that word. CC (next session): read the post back — `is_published` must be **true** and the permalink must resolve; **if it did not publish, report it and do NOT post again**. If nothing is done: the post goes out anyway at 19:00 and simply is not pinned | 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. **-- 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 | | **R-920** | Business & legal | P4 | **The Messenger „Gyakori kérdések" automation does not exist for this Page, so `COPY.md` §5 — four questions with answers condensed from `gyik.html` — has nowhere to go.** FOUND 2026-10-09 (Page details task, `audits/facebook-page-details-2026-10-09/`). SEARCHED, not assumed absent: the create-automation catalogue („Az összes automatizálás") holds exactly THREE templates — Automatikus válasz, Távolléti üzenet, A megválaszolatlan üzenetek azonosítása (`B5-no-faq-template-all-three.jpg`); the template search for „kérdés" answers **„Nincs a keresésnek megfelelő automatizálási sablon."** while the POSITIVE CONTROL „üzenet" returns two, so the search works and the term genuinely misses; the existing instant-reply automation carries only channel, message and media — no FAQ and no quick replies; and the business-portfolio settings have no messaging/FAQ entry. The copy is written, sourced line by line to `gyik.html` and committed as `marketing/facebook/COPY.md` §5, ready to paste unchanged the day the feature appears. **Same shape as R-917** (§2 has nowhere to go), and the same cause: Meta removed a Page field this project had planned copy for. **Options for the operator:** (a) leave §5 unused until Meta brings the feature back; (b) fold the four answers into the Messenger welcome message (§3) — it holds 500 characters and today uses 120, so one or two would fit, not four; (c) publish them as a pinned FAQ post once the app is Live (R-915); (d) ask Meta support whether the FAQ automation still exists for this Page type. Recommended (a) with (c) later — the welcome message stays short, and the website's own `gyik.html` already answers these. | **DEFERRED — operator chose (c) on 2026-10-09:** park the text and publish it as a post once posting starts. Not a defect, and not waiting on CC | nothing — **UNBLOCKED 2026-10-09**: R-915 is closed, the app is Live, so posting can start whenever the operator wants | When posting starts: publish `COPY.md` §5 (the four Messenger FAQ answers) as one later post. If nothing is done: the text stays in `COPY.md` unused, which the operator has accepted | operator | diff --git a/marketing/CHANGELOG.md b/marketing/CHANGELOG.md index b01ecfeb..e757989e 100644 --- a/marketing/CHANGELOG.md +++ b/marketing/CHANGELOG.md @@ -1,5 +1,35 @@ # marketing — CHANGELOG +## facebook — the Page's first post, drafted and SCHEDULED (2026-10-09) + +R-917 option (c) carried out. The post is **not public**: it sits in Planner until Monday. + +- **`COPY.md` §6** — two versions shortened from §2, Hungarian, tegező, no price. 6.1 = 347 + characters, 6.2 = 638 (Unicode characters, counted). Every claim carries a source comment naming the + line of `website/index.html` it rests on; the first line of each carries the point alone, because + Facebook cuts after about three lines. **Zero emoji, zero hashtags** though two of each were allowed + — the design system uses no emoji and two hashtags would serve no real search. +- **The operator chose 6.2**, Hungarian only, for **2026-10-12 19:00** (over today: it was Friday + 15:08, the weakest evening of the week for a first post, and three days in Planner is review time). +- **Scheduled**: post `1360018983863273_122096547315511222`, epoch 1791824400. Read back + `is_published` **False**, scheduled time sent == read, message **hex-equal** to `COPY.md` §6.2 — and + the sha256 recomputed **outside** the probe agrees. Visible in Planner on H 12 at 19:00 with the link + card, which is a different channel from the API. +- **`fb_probe.py schedule-post`** — text + link, scheduled only. **It cannot publish immediately**: + `published` is always `false` and no argument can change it, because the operator's review in Planner + is the safety net. The body is read from `COPY.md` by section, never through a shell. Time outside + Meta's 10-minute..6-month window is refused locally. `budapest_to_epoch()` uses the real tz database + and **refuses** rather than guessing a DST offset. +- **Scenario A, the dry check**: a throwaway scheduled post **with the link** was accepted (so `link` + is not refused on a scheduled post — the open question), read back hex-equal and unpublished, seen + **present** in `GET /{page}/scheduled_posts`, deleted, and seen **absent** in the same list. The + removal proof comes from the list, not from an error after DELETE. +- **30 tests**, all passing on DooPlex (2 skip on Windows for want of a tz database). The + cannot-publish guard was **red-proofed**: removed, test seen failing `'true' != 'false'`, restored. +- **Checked, not copied:** the post repeats „56 alkalmazás". The apps page carries **57** cards while + saying 56 — deliberate: „6 alkalmazás + 1 beépített", the 57th being FileBrowser, built into every + box. `index.html` says „56 telepíthető alkalmazás" too. A „fix" here would have made a live page wrong. + ## facebook — the Meta app is LIVE; the Page can post in public (2026-10-09) R-915 is closed. What it had waited on for a day was R-813's Terms of Service URL, which did not