diff --git a/REPORT-facebook-page-details.md b/REPORT-facebook-page-details.md new file mode 100644 index 00000000..b78c5f5e --- /dev/null +++ b/REPORT-facebook-page-details.md @@ -0,0 +1,216 @@ +# Facebook Page details — contact, place, categories, hours, Messenger FAQ, link preview + +2026-10-09 · operator's Windows workstation, his own Chrome · Page `1360018983863273`, +`facebook.com/felhom.eu` · evidence `documentation/audits/facebook-page-details-2026-10-09/` + +Own file on purpose: the shared `REPORT.md` belongs to whoever else is in this clone. + +--- + +## In plain words + +Two of the five edits were **already done** when I arrived — the operator had set the contact e-mail +and phone himself, and the place was already city-only Budapest, exactly as he chose. One edit I +made: the Page now carries **three categories** instead of one. Two could not be made at all, and +neither is a failure of nerve — Facebook will not let them happen: + +- **Opening hours need a street address.** The fences forbid entering one. That turns out not to + matter: with no hours set the Page shows no „Zárva" at all, which was the whole point of the edit. +- **The Messenger FAQ feature does not exist for this Page any more.** The copy is written and + committed; it waits, exactly like the long description does. + +The link preview was checked and is correct in both languages. Nothing was posted, nothing was paid +for, nothing on the website changed. + +**The one thing to decide:** R-920 — where the four FAQ answers go, now that Messenger has no FAQ box. + +--- + +## 1. Baseline and commit + +| | | +|---|---| +| baseline | `9a55f0bbc7`, clean tree, `HEAD == origin/main` | +| pushed | see §9 | +| repos touched | `felhom.eu` only — `marketing/`, `scripts/facebook/`, `documentation/` | + +## 2. The edits, each read back from another channel + +Meta's toasts are not proof: on 2026-10-08 „A módosítás nincs mentve" arrived **with** a partial +save. So every edit below was read back from a channel other than the one that made it — the Graph +probe runs on DooPlex under a system-user token, the UI runs in the operator's Chrome. + +| # | edit | outcome | read-back, and from where | +|---|---|---|---| +| **B1** | contact e-mail / phone | **ALREADY SET — not by this run** | Graph: `emails = ["info@felhom.eu"]`, `phone = "+36702378499"`. Page UI „Elérhetőségek" shows both. Hex-equal trivially (ASCII); the address is the one in `website/kapcsolat.html` | +| **B2** | place | **ALREADY AS CHOSEN** (city only, no street). Service area **REFUSED** | Graph: `location = {city: Budapest, country: Hungary}`, `single_line_address = "Budapest, Hungary"` | +| **B3** | categories | **DONE** — two added | Graph: `Information Technology Company`, `Internet Company`, `Software Company` | +| **B4** | hours | **CANNOT BE SET — and does not need to be** | rendered page, measured with controls (§4) | +| **B5** | Messenger FAQ | **REFUSED — the feature is gone** | the catalogue itself (§5) → **R-920** | + +The task's own baseline said „there is no contact e-mail". There is. I did not type it and I am not +claiming it: the operator set it between the task being written and this run, and I verified the +value is the right one rather than assuming. + +## 3. B3 — the two categories, and why these + +**Chosen: „Internetes cég" and „Szoftvercég".** „Informatikai vállalat" kept, and kept **first** — +Facebook shows only the first on the Page, which the editor states and the rendered page confirms +(neither new category appears there; that is correct, not a failed save). + +Facebook's Hungarian list has **no IT-support, no IT-consulting and no cloud category.** Eleven terms +searched: `informatikai`, `informatikai szolgáltatás`, `szoftver`, `internet`, `számítógép`, `felhő`, +`adat`, `adattárol`, `technológ`, `szolgáltatás`, `tanácsad`. What exists nearby: + +- **Számítógépszerviz** — the only true „computer support" match, and a repair counter. Fenced out. +- **Internetszolgáltató** — an ISP. Felhom is not one; it would be a false claim. +- **Üzleti szolgáltatás**, **Technológia** — accurate but so broad they help nobody searching. +- **Internetes cég** — an internet company. True, and the nearest thing to „internet / cloud service". +- **Szoftvercég** — true in the strict sense: Felhom writes the hub, the agent and the controller. + +Neither implies a shop or a repair counter. + +## 4. B4 — hours, and the measurement that made it a non-issue + +Facebook disables the row outright: + +> **„A nyitvatartási idő megadása előtt add meg előbb a vállalkozásod címét."** + +Hours require a street address; the fences forbid entering one. The task's fallback („pick the option +that shows no hours; if none exists, leave as is and report") applies — **no such option exists**, +because with no address there are no hours to label. The outcome the edit wanted is already true, and +I measured it rather than assuming: + +``` +POSITIVE CONTROLS Budapest 1 · Informatikai vállalat 1 · felhom.eu 1 +HOURS LABELS Zárva 0 · Nyitva 0 · Nyitvatartás 0 · nyitvatart 0 +``` + +The controls carry the argument. Four zeroes on their own are equally consistent with „no hours +shown" and „I was reading the wrong part of the page"; the three ones say the details box was in the +text being searched. **The Page will never show „Zárva".** + +**Service area, refused.** Facebook offers the field, but its picker returns neighbourhoods and +cities, never a country — „Magyarország" matches nothing. Control: „Szeged" → Szeged, Újszeged, +Kiskundorozsma, so the search works and the term genuinely misses. I left it **unset**. Setting +„Budapest" was available and I did not take it: it would narrow Felhom's stated coverage from +„Hungarian households" to one city, which is a change to a promise, not a form field. + +## 5. B5 — the Messenger FAQ is gone (R-920) + +Searched, not assumed absent — four observations, one of them a control: + +1. 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. +2. Template search „kérdés" → **„Nincs a keresésnek megfelelő automatizálási sablon."** +3. **Positive control:** the same search for „üzenet" → **two** templates. The search works. +4. The existing instant-reply automation has channel, message and media only — no FAQ, no quick + replies. Business-portfolio settings carry no messaging/FAQ entry either. + +**`COPY.md` §5 is written anyway** and committed: the four questions **verbatim** from `gyik.html`, +each answer condensed from *that question's own answer* with no new claim, each ending in +`https://felhom.eu/gyik.html`, each with its source line. The delicate one is „Ti hozzáfértek az +adataimhoz?" — the condensation keeps the admission that Felhom **does** hold remote access by +default, because dropping it to save characters would have turned a frank answer into a privacy +boast. It is three sentences: remote access exists; the backup key is yours alone; no profiling. + +Same shape as R-917: copy with nowhere to go, because Meta removed the field. + +## 6. Phase C — the link preview + +Both URLs scraped again, once each. + +| | `https://felhom.eu/` | `https://felhom.eu/en/` | +|---|---|---| +| title | Felhom.eu — Saját felhőd, saját szabályaid | Felhom.eu — Your own cloud, your own rules | +| description | „Otthoni szerver a te otthonodban… Most zárt teszt indul." | „A home server in your own home in Hungary… A closed test is starting now." | +| image | `assets/og-image.png` | `assets/og-image-en.png` | +| warnings | *The following required properties are missing: fb:app_id* | same, verbatim | +| response code | **206** | **206** | + +Both previews render correctly, image included. The `fb:app_id` warning is the **expected** one and +was deliberately **not** fixed — adding it would tie the public website to the Meta app for no gain +today. Nothing on the website was changed. + +**The 206 is worth a line.** `206 Partial Content` where a scraper would normally see 200. A plain +`curl` from DooPlex gets **200** on both URLs, so this is Facebook's own fetch (a Range request the +nginx in front of the site answers literally), not a site fault — and the preview it built is +complete, which is the observable that matters. Recorded rather than chased; nothing is broken. + +## 7. The probe change + +`scripts/facebook/fb_probe.py read` now also reports `emails, phone, category_list, location, +single_line_address, hours` — **one field per Graph call**, not one batched `fields=` list. Graph +fails the whole call when any single member is unreadable, so a batch would let one refused field +hide the other five; that is the same reason `INSIGHT_METRICS` was already called one at a time. A +refusal is logged with Meta's error **verbatim and not retried** — retrying would convert „Meta +refuses this field" into „the field is empty", which is a different fact. „Returned as `null`" and +„not returned at all" are logged apart. + +`hours` is in the third state: the call succeeds and **the field is simply not in the response**. +That is why B4's read-back had to come from the rendered page. + +## 8. Channels, and one I had to correct myself about + +| channel | proves | +|---|---| +| Business Suite / Page UI, signed in | makes the edits; shows admin-side state | +| Graph probe, DooPlex, system-user token | the stored field values | +| cookie-free `curl` from DooPlex | the logged-out server response — **with a real limit** | + +The cookie-free fetch needs browser-like headers: a bare user agent gets **HTTP 400**; with +`Accept`, `Accept-Language`, `Upgrade-Insecure-Requests` and the `Sec-Fetch-*` trio it returns **200** +and ~163 KB. + +**I first called two markers in it a positive control, and they are not.** `Budapest` matched an +`og:url` meta tag and `Information Technology` sits inside an embedded JSON blob +(`delegate_page.category_name`) — the visible details box is rendered by JavaScript and is absent +from that HTML altogether. So the absence of „Zárva" there proves nothing, and I did not use it for +B4. The limit is written into `logged-out/logged-out-before.txt` beside the data rather than dropped, +because the next session will otherwise read those zeroes as evidence. What the channel *can* still +show is the embedded `category_name` and the `og:*` tags, and it confirms only the first category is +exposed to a logged-out visitor. + +## 9. Gates, commit, CI + +See the final section of this file as pushed; run id and conclusion quoted there. + +## 10. Secret scan + +`FACEBOOK_API` was read on DooPlex by `read_credential.py`, never printed, never copied to Windows. +The probe strips `access_token` from the recorded response before writing it — verified in the +`me/accounts` evidence, which carries `id`, `name`, `tasks` and no token. + +The probe's **stdout** does print `key FACEBOOK_API: 201 chars, starts EAA`. That line is why the +2026-10-08 evidence needed redacting, so **no `run.log` is committed from this run** at all. + +``` +plant EAAfakeprobe → grep -r EAA --exclude=README.md = 1 file, 1 line +delete → grep -r EAA --exclude=README.md = 0 files, 0 lines +access_token in evidence = 0 +run.log in evidence = 0 +``` + +`--exclude=README.md` because the audit README quotes the search strings — the same self-match that +produced four false positives on 2026-10-08. + +## 11. Register + +- **R-920 opened** (Business & legal, P4) — the Messenger FAQ automation does not exist; `COPY.md` §5 + has nowhere to go. Options a/b/c/d for the operator, recommended (a) now and (c) later. +- **R-915, R-916, R-917 untouched**, as the task required. +- **One drifted header corrected in the section I touched.** „Business & legal" read *12 rows + (P2 5, P3 1, P4 6)* while the section held **11** rows (P2 4, P3 1, P4 6). With R-920 added it now + holds 12 (P2 4, P3 1, P4 7) and the header says so. I corrected only the section I edited; the five + other headers named as drifting in the previous session's report are still drifting and still + belong to a session that owns the register. + +## 12. Teardown + +Nothing posted — no post, story, reel, comment, reply, message sent, like, follow or invite. The +setup checklist's „invite friends" and „introduce yourself" were left alone. No money: no Boost, no +Ads Manager, no Meta Verified, no payment settings; Meta's ad suggestion card on the Page was not +clicked into. No change to the Meta app (still **development mode**), the business portfolio, Page +roles, tokens or permissions. No pixel, no Conversions API, no Facebook script on the website. The +website is unchanged. No password was typed. The throwaway DooPlex worktree used to run the probe was +removed; nothing was written into the shared clone. The browser tab was closed. diff --git a/documentation/audits/facebook-page-details-2026-10-09/A1-page-about-before.jpg b/documentation/audits/facebook-page-details-2026-10-09/A1-page-about-before.jpg new file mode 100644 index 00000000..9a258db5 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/A1-page-about-before.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/A2-contact-info-already-set.jpg b/documentation/audits/facebook-page-details-2026-10-09/A2-contact-info-already-set.jpg new file mode 100644 index 00000000..9272d996 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/A2-contact-info-already-set.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/B3-categories-after.jpg b/documentation/audits/facebook-page-details-2026-10-09/B3-categories-after.jpg new file mode 100644 index 00000000..39dbb9d8 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/B3-categories-after.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/B4-hours-needs-address.jpg b/documentation/audits/facebook-page-details-2026-10-09/B4-hours-needs-address.jpg new file mode 100644 index 00000000..1a97f785 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/B4-hours-needs-address.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/B5-no-faq-template-all-three.jpg b/documentation/audits/facebook-page-details-2026-10-09/B5-no-faq-template-all-three.jpg new file mode 100644 index 00000000..6127217e Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/B5-no-faq-template-all-three.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/C1-sharing-debugger-hu.jpg b/documentation/audits/facebook-page-details-2026-10-09/C1-sharing-debugger-hu.jpg new file mode 100644 index 00000000..1bd3c884 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/C1-sharing-debugger-hu.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/C2-sharing-debugger-en.jpg b/documentation/audits/facebook-page-details-2026-10-09/C2-sharing-debugger-en.jpg new file mode 100644 index 00000000..c4033a28 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/C2-sharing-debugger-en.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/D1-page-after-computer-1568px.jpg b/documentation/audits/facebook-page-details-2026-10-09/D1-page-after-computer-1568px.jpg new file mode 100644 index 00000000..ca006c74 Binary files /dev/null and b/documentation/audits/facebook-page-details-2026-10-09/D1-page-after-computer-1568px.jpg differ diff --git a/documentation/audits/facebook-page-details-2026-10-09/README.md b/documentation/audits/facebook-page-details-2026-10-09/README.md new file mode 100644 index 00000000..e5ce239b --- /dev/null +++ b/documentation/audits/facebook-page-details-2026-10-09/README.md @@ -0,0 +1,123 @@ +# Facebook Page details — contact, place, categories, hours, Messenger FAQ, link preview (2026-10-09) + +Operator's Windows workstation, his own Chrome (Claude in Chrome), plus a read-only Graph probe and a +cookie-free fetch, both run from DooPlex. Page `1360018983863273`, `facebook.com/felhom.eu`. +Baseline `9a55f0bbc7`. Full narrative: `REPORT-facebook-page-details.md` at the repo root. + +## The three channels, and what each can actually prove + +Meta's toasts are not proof (2026-10-08: „A módosítás nincs mentve" came with a partial save), so +every edit is read back from a channel other than the one that made it. + +| channel | where it runs | proves | +|---|---|---| +| **Business Suite / Page UI** | operator's Chrome, signed in | makes the edits; shows the admin-side state | +| **Graph probe** (`fb_probe.py read`) | DooPlex, system-user token | `emails`, `phone`, `category_list`, `location`, `single_line_address`; **`hours` is never returned** | +| **cookie-free HTML** | DooPlex, `curl`, no session | the logged-out server response — but see the limit below | + +**The cookie-free channel's limit, recorded because I first misread it.** A bare user agent gets +**HTTP 400**; the header set that earns a **200** is in the report. The markers I first took for a +positive control are *not* rendered page text — `Budapest` matched an `og:url` meta and +`Information Technology` sits inside an embedded JSON blob (`delegate_page.category_name`). The +visible details box is rendered by JavaScript and is **absent from this HTML altogether**, so the +absence of „Zárva"/„Nyitva" here proves nothing about the hours label. That is written out in +`logged-out/logged-out-before.txt` rather than quietly dropped. + +**So the hours read-back is the rendered page**, measured with controls — see below. + +## The probe change + +`scripts/facebook/fb_probe.py` now also asks for `emails, phone, category_list, location, +single_line_address, hours`, **one field per Graph call**. One per call on purpose: Graph fails a +whole `fields=` list when any single member is unreadable, so a batch would let one refused field +hide the other five (the same reason `INSIGHT_METRICS` is already called one at a time). A refusal is +recorded with Meta's error verbatim and never retried — a retry would turn „Meta refuses this field" +into „the field is empty", a different fact. `null` and „not returned" are logged apart. + +## What each edit did + +| # | outcome | read-back | +|---|---|---| +| B1 contact | **already correct before this run** — the operator had set both | Graph `emails`=`["info@felhom.eu"]`, `phone`=`"+36702378499"`; Page UI „Elérhetőségek" shows the same | +| B2 place | **already as chosen** (city only, no street). Service area **refused** | Graph `location`=`{city: Budapest, country: Hungary}` | +| B3 categories | **done** — added two | Graph `category_list` = IT Company, Internet Company, Software Company | +| B4 hours | **cannot be set, and does not need to be** | rendered page: zero hours labels, controls pass | +| B5 Messenger FAQ | **refused — the feature does not exist here** | template catalogue holds exactly three | + +## B4 — the hours measurement, with its controls + +Facebook greys the hours row out and says: **„A nyitvatartási idő megadása előtt add meg előbb a +vállalkozásod címét."** Hours need a street address; the fence forbids entering one. There is +therefore no „no hours" option to pick — and none is needed, because with no hours set Facebook +shows no hours label at all. Measured on the rendered Page rather than assumed: + +``` +POSITIVE CONTROLS Budapest 1 · Informatikai vállalat 1 · felhom.eu 1 <- the details box IS being read +HOURS LABELS Zárva 0 · Nyitva 0 · Nyitvatartás 0 · nyitvatart 0 +``` + +The controls are the point: an absent string is only evidence when something that *must* be present +is present in the same read. `B4-hours-needs-address.jpg` shows the disabled row. + +## B5 — why „Gyakori kérdések" is a refusal and not a miss + +Searched for, 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`). +- Template search for **„kérdés" → „Nincs a keresésnek megfelelő automatizálási sablon."** + **Positive control: „üzenet" → two templates.** So the search works and the term genuinely misses. +- The existing instant-reply automation has only channel, message and media — no FAQ, no quick replies. +- Business-portfolio settings carry no messaging/FAQ entry. + +The four questions and answers are written and committed as `marketing/facebook/COPY.md` §5, ready to +paste the day the feature appears. Same shape as R-917: copy with nowhere to go. + +## B3 — the categories, and why these two + +Facebook's Hungarian list has **no IT-support, IT-consulting or cloud category**. Eleven terms were +searched: `informatikai`, `informatikai szolgáltatás`, `szoftver`, `internet`, `számítógép`, `felhő`, +`adat`, `adattárol`, `technológ`, `szolgáltatás`, `tanácsad`. The only true IT-support match is +**Számítógépszerviz**, which the fence rules out (a repair counter). Chosen: **Internetes cég** and +**Szoftvercég** — the latter is accurate, Felhom writes the hub, the agent and the controller. +„Informatikai vállalat" stays **first**, which is the one Facebook shows; the other two are for +search only and correctly do not appear on the Page. + +## Phase C — the link preview + +Both pages scraped again once. Preview correct on both, the only warning the **expected** missing +`fb:app_id` (deliberately not added). **Response Code 206, not 200, on both** — noted in the report; +a plain `curl` from DooPlex gets 200, so it is Facebook's scraper, and the preview is complete. + +## Secret scan + +`FACEBOOK_API` is read on DooPlex by `read_credential.py` and never printed, never copied to Windows. +The probe strips `access_token` from the recorded response before writing it (verified: the +`me/accounts` evidence carries `id`, `name`, `tasks` and no token). The probe's **stdout** does print +`key FACEBOOK_API: 201 chars, starts EAA` — so **no `run.log` is committed from this run**; that line +was what had to be redacted in the 2026-10-08 evidence. + +Planted decoy, grepped, deleted, grepped again — `--exclude=README.md` because this file quotes the +search strings: + +``` +plant EAAfakeprobe -> grep -r EAA --exclude=README.md = 1 +delete -> grep -r EAA --exclude=README.md = 0 +``` + +Counts are in the report. + +## Files + +- `probe-before/`, `probe-after/` — 16 Graph call records each, one JSON per call. +- `logged-out/` — the cookie-free before and after extracts, each carrying its own limits. +- `A1` page before · `A2` contact already set · `B3` categories after · `B4` hours disabled · + `B5` the three templates · `C1`/`C2` sharing debugger HU/EN · `D1` page after, computer width. + +## Teardown + +Nothing posted, no story, no reel, no comment, no message sent, no invite. No money, no Boost, no +Ads Manager, no Meta Verified. No change to the Meta app (still development mode), the business +portfolio, Page roles, tokens or permissions. No pixel, no Conversions API, no Facebook script on +the website. The website itself is unchanged. The DooPlex worktree used for the probe was removed. diff --git a/documentation/audits/facebook-page-details-2026-10-09/logged-out/logged-out-after.txt b/documentation/audits/facebook-page-details-2026-10-09/logged-out/logged-out-after.txt new file mode 100644 index 00000000..7def03e7 --- /dev/null +++ b/documentation/audits/facebook-page-details-2026-10-09/logged-out/logged-out-after.txt @@ -0,0 +1,15 @@ +logged-out AFTER (curl from DooPlex, no cookies, browser-like headers) +bytes: 940227 +count Information Technology Company 1 +count Internet Company 0 +count Software Company 0 +count info@felhom.eu 0 +count +36702378499 0 +count Zárva 0 +count Nyitva 0 +count nyitvatart 0 + +Only the FIRST category is exposed to a logged-out visitor; the two added ones are not in +this HTML, which matches what Facebook says in the editor and what the rendered Page shows. +The hours strings are absent here too, but see logged-out-before.txt: this channel cannot +prove anything about the hours label. The hours read-back is the rendered-page measurement. \ No newline at end of file diff --git a/documentation/audits/facebook-page-details-2026-10-09/logged-out/logged-out-before.txt b/documentation/audits/facebook-page-details-2026-10-09/logged-out/logged-out-before.txt new file mode 100644 index 00000000..4f262fc9 --- /dev/null +++ b/documentation/audits/facebook-page-details-2026-10-09/logged-out/logged-out-before.txt @@ -0,0 +1,31 @@ +title: Felhom.eu | Budapest +bytes: 940284 +count info@felhom.eu 0 +count +36702378499 0 +count Budapest 11 +count Information Technology 1 +count Zárva 0 +count Nyitva 0 +count nyitvatart 0 +count Felhom.eu 28 + +context Budapest: + pp_store_id" content="284882215" /> 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. | **WAITING-ON-OPERATOR** | the choice a/b/c/d; (c) also waits on R-915 | Pick a/b/c/d. If nothing is done: §5 stays in `COPY.md` unused and Messenger answers with the welcome message alone | operator | ## Process & tooling — 23 rows (P3 3, P4 20) diff --git a/marketing/CHANGELOG.md b/marketing/CHANGELOG.md index 4fc4e9df..ca19ff22 100644 --- a/marketing/CHANGELOG.md +++ b/marketing/CHANGELOG.md @@ -1,5 +1,44 @@ # marketing — CHANGELOG +## facebook — Page details: categories added, contact already set, Messenger FAQ refused (2026-10-09) + +Second task of the day, after the cover work: the Page's details box, the Messenger FAQ and the link +preview. Settings changed by hand in the operator's Chrome; every edit read back from a channel other +than the one that made it, because Meta's toasts have lied here before. + +- **Contact was already done — by the operator, not by this run.** The task's baseline said there was + no contact e-mail; there is. Graph reads `emails = ["info@felhom.eu"]` (the address + `website/kapcsolat.html` uses) and `phone = "+36702378499"`, and the Page's „Elérhetőségek" tab shows + the same. Nothing was typed; the value was verified and left alone. +- **Two categories added**, so the Page is findable beyond its one label: + **Informatikai vállalat · Internetes cég · Szoftvercég**. „Informatikai vállalat" stays FIRST, which + is the only one Facebook shows on the Page — the other two serve search, and correctly do not appear. + Facebook's Hungarian list has **no IT-support, IT-consulting or cloud category**: eleven terms were + searched, and the one true IT-support match („Számítógépszerviz") is a repair counter, which the + fences rule out. Read back by Graph: IT Company, Internet Company, Software Company. +- **Opening hours cannot be set, and do not need to be.** Facebook greys the row out: „A nyitvatartási + idő megadása előtt add meg előbb a vállalkozásod címét." Hours need a street address and the fences + forbid entering one — so there is no „no hours" option to choose, and none is needed, because with no + hours set the Page shows **no hours label at all**. Measured on the rendered page with controls: + `Zárva 0 · Nyitva 0 · Nyitvatartás 0`, while `Budapest 1 · Informatikai vállalat 1 · felhom.eu 1` + prove the details box was actually being read. An absent string on its own would have proved nothing. +- **The Messenger „Gyakori kérdések" automation does not exist for this Page → R-920.** Searched, not + assumed: the catalogue holds exactly three templates, and a search for „kérdés" returns none while + the control „üzenet" returns two. `COPY.md` §5 is written anyway — four questions verbatim from + `gyik.html`, each answer condensed from that question's own answer with no new claim — and waits like + §2 does (R-917). +- **Service area refused.** Facebook offers the field but its picker has no „Magyarország": it returns + cities and neighbourhoods only. Control: „Szeged" returns Szeged. Left unset rather than narrowed to + „Budapest", which would have shrunk a coverage claim nobody authorised. +- **Link preview is correct on both pages**, re-scraped once each. Title, description and image all + right, Hungarian and English, each with its own `og:image`. The only warning is the **expected** + missing `fb:app_id`, deliberately not added. Both report **Response Code 206, not 200** — a plain + `curl` gets 200, so it is Facebook's scraper and the preview is complete; noted, not chased. +- `fb_probe.py read` now also reports `emails, phone, category_list, location, single_line_address, + hours`, **one field per call** — a batched `fields=` list fails whole when any one member is + unreadable, which would let one refused field hide the other five. `hours` is never returned by + Graph, and the probe logs „not returned" apart from `null`. + ## 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 diff --git a/marketing/facebook/COPY.md b/marketing/facebook/COPY.md index b755b10b..98ad8df1 100644 --- a/marketing/facebook/COPY.md +++ b/marketing/facebook/COPY.md @@ -83,3 +83,73 @@ Fotók és média: Immich, Jellyfin, Plex, Audiobookshelf. Fájlok: Nextcloud, F Szinte mind nyílt forráskódú, és mind a te gépeden fut. Nézd meg mindet, képekkel: https://felhom.eu/alkalmazasok ``` + +## 5. Messenger — gyakori kérdések (Gyakori kérdések / FAQ automatizálás) + +A **kérdések szó szerint** a `website/gyik.html` kérdései. A **válaszok** ugyanannak a kérdésnek a +gyik.html-ben álló válaszából vannak tömörítve — legfeljebb három rövid mondat, **új állítás nélkül** —, +és a gyik.html linkjével záródnak. Minden blokk fölött ott a forrás. + +### 5.1 + + + +Kérdés: + +``` +Mi az a Felhom.eu, és mit csináltok pontosan? +``` + +Válasz: + +``` +A Felhom.eu az otthoni szerver telepítésében és üzemeltetésében segít: megválasztjuk a hardvert, beállítjuk a szoftvereket, biztosítjuk a mentéseket, és figyelemmel kísérjük a rendszert. Így a nagy felhőszolgáltatók helyett a saját otthonodban futó szerveren tárolhatod az adataidat – anélkül, hogy neked kellene szakértőnek lenned. Részletek: https://felhom.eu/gyik.html +``` + +### 5.2 + + + +Kérdés: + +``` +Milyen gépre van szükségem? +``` + +Válasz: + +``` +A legtöbb otthoni felhasználónak egy mini PC tökéletesen megfelel (pl. Intel N100 processzorral, 16-32 GB RAM-mal): csendes, energiatakarékos (15-35W), és elfér a polcon a router mellett. Ha nagyobb tárhelyet szeretnél, NAS-szal vagy külső merevlemezekkel bővíthető. Részletek: https://felhom.eu/gyik.html +``` + +### 5.3 + + + +Kérdés: + +``` +Ti hozzáfértek az adataimhoz? +``` + +Válasz: + +``` +A támogatás és karbantartás érdekében alapesetben rendelkezünk távoli hozzáféréssel a szerveredhez – ahogy bármely IT szolgáltató a kezelt rendszerekhez. A távoli mentésed kulcsát viszont csak te ismered: a helyreállítási kód egyszer jelenik meg, a te képernyődön, és nálunk nem marad belőle másolat, így a távoli mentést mi sem tudjuk elolvasni. Nincs algoritmikus adatelemzés és nincs reklámcélú profilozás. Részletek: https://felhom.eu/gyik.html +``` + +### 5.4 + + + +Kérdés: + +``` +Mennyibe kerül az egész? +``` + +Válasz: + +``` +A költség két részből áll: egyszeri költségek (a hardver ára, konfigurációtól függően 80.000–400.000+ Ft, és a telepítési díj) és havi üzemeltetési díj (monitoring, támogatás, frissítések, mentés-felügyelet). A hardvert te vásárolod meg – a tiéd, örökre. Pontos árajánlatot az egyeztetés után adunk, mert az igények nagyon eltérőek lehetnek. Részletek: https://felhom.eu/gyik.html +``` diff --git a/scripts/facebook/fb_probe.py b/scripts/facebook/fb_probe.py index 09c004bb..180ef52d 100644 --- a/scripts/facebook/fb_probe.py +++ b/scripts/facebook/fb_probe.py @@ -245,12 +245,27 @@ def scenario_b(g, token): INSIGHT_METRICS = ("page_post_engagements", "page_follows", "page_media_view") +# The details box, one field per call. ONE PER CALL ON PURPOSE: Graph fails a whole `fields=` list when +# any single member is unreadable, so a batch would let one refused field hide the other five (the same +# reason INSIGHT_METRICS is called one at a time). A refusal is recorded with Meta's error VERBATIM and +# never retried — a retry would turn „Meta refuses this field" into „the field is empty", which is a +# different fact. An absent key is also not „empty": `null` and „not returned" are logged apart. +DETAIL_FIELDS = ("emails", "phone", "category_list", "location", "single_line_address", "hours") + def scenario_c(g, page): pid, ptok = page["id"], page["token"] c1 = g.call("C1-page", "GET", pid, ptok, query={"fields": "id,name,link,category,about,website,followers_count,fan_count"}) log("C page fields: ok=%s %s" % (c1.ok, {k: v for k, v in c1.body.items() if k != "error"} if c1.ok else c1.err)) + for f in DETAIL_FIELDS: + c = g.call("C4-detail-" + f, "GET", pid, ptok, query={"fields": f}) + if not c.ok: + log(" detail %-20s REFUSED %s" % (f, json.dumps(c.err, ensure_ascii=False))) + elif f not in c.body: + log(" detail %-20s ok, but the field was NOT RETURNED (not the same as null)" % f) + else: + log(" detail %-20s = %s" % (f, json.dumps(c.body[f], ensure_ascii=False))) c2 = g.call("C2-feed", "GET", pid + "/feed", ptok, query={"limit": "5"}) log(" feed: ok=%s posts=%s" % (c2.ok, len(c2.body.get("data", [])) if c2.ok else c2.err)) for m in INSIGHT_METRICS: # one call per metric: one renamed metric must not hide the others