diff --git a/documentation/audits/redesign-2026-10-10/PREFLIGHT.md b/documentation/audits/redesign-2026-10-10/PREFLIGHT.md new file mode 100644 index 00000000..6bc33438 --- /dev/null +++ b/documentation/audits/redesign-2026-10-10/PREFLIGHT.md @@ -0,0 +1,119 @@ +# Pre-flight — taste-skill §14 plus the Felhom additions + +Run against the **deployed** preview at `https://felhom.eu/preview/`, 2026-10-10, not against the +file on disk. Every measurement came from the browser. + +## Headline numbers + +| | Old home page | New preview | | +|---|---|---|---| +| Page height, 1440 px | 10 922 px | **6 780 px** | 38% shorter | +| Page height, 390 px | 19 913 px | **10 865 px** | 45% shorter, 23.6 → 12.9 phone screens | +| Initial load (same conditions) | 13 requests, 308 KB | **11 requests, 260 KB** | | +| Fully loaded (all assets) | 16 requests, ~540 KB | 15 requests, ~545 KB | **essentially unchanged** | +| Third-party hosts | 0 | **0** | | +| Em dashes in the page's own copy | 18 | **0** | | +| Layout families for 11 / 10 sections | 8 (3 repeats) | **10 (no repeat)** | | +| JetBrains Mono fetched | yes, 31 KB, for 13 characters | **no** | | + +**Honest reading of the weight.** The *initial* load is 48 KB lighter. The *fully scrolled* page is +about the same: the new 93 KB portrait is paid for by dropping the 49 KB decorative `logo.png` and +the 31 KB mono font. The redesign is not a weight win once you scroll; it is a weight win for the +first screen, which is the one most visitors see. R-931 (no gzip anywhere on the site) is worth far +more than anything on this page. + +## taste-skill §14 + +| Check | Verdict | +|---|---| +| Brief inference declared (§0.B) | **Pass** — AUDIT.md §A | +| Dial values explicit and reasoned | **Pass** — 6 / 3 / 4, AUDIT.md §I | +| Design system chosen or aesthetic labelled honestly | **Pass** — Felhom design system v2, no new system | +| Redesign mode detected, audit performed (§11) | **Pass** — preserve; AUDIT.md | +| **ZERO em dashes** | **Pass with two stated exceptions** — 0 in the page's own copy. 6 remain in ``/description/OG/Twitter/JSON-LD **by operator decision at STOP 1** (indexed strings), 1 in the shared footer, which gate 3 forces to be identical on 14 pages. Neither swept silently | +| Page Theme Lock — one theme | **Pass** — dark throughout, no section inverts | +| Color Consistency Lock — one accent | **Pass** — `--blue` / `--blue-bright` only | +| Shape Consistency Lock — one radius | **Pass** — `--radius: 2px` everywhere | +| Button Contrast Check | **FAIL, pre-existing, filed** — `.cta-button` is 4.01:1 (white on `#0083D8`, 16px/600) against a 4.5 floor. **Identical on the live page**, so not a regression. R-930, needs a brand decision | +| CTA Button Wrap — no 2-line label at desktop | **Pass** | +| Form Contrast Check | **n/a** — no form on this page | +| Serif discipline | **n/a** — no serif | +| Premium-consumer palette ban | **n/a** — not that brief | +| Italic descender clearance | **n/a** — no italic display type | +| Hero fits viewport, ≤2-line headline, ≤20-word subtext | **Pass** — headline 2 lines, subtext **20 words**, CTA and a real screenshot both above the fold at 1440 and at 390 | +| Hero top padding ≤ `pt-24` | **Pass** — 128 px, and the hero is sized by its content; the old one was a forced `100vh` band with the content floating in the middle | +| Hero stack ≤ 4 text elements | **Pass** — headline, subtext, CTA, figure caption. No eyebrow, no tagline under the CTA, no trust strip | +| **Eyebrow count ≤ ceil(sections/3)** | **Pass — 0 of an allowed 4.** The cluster headings are not eyebrows (no uppercase, no tracking, they head real groups), and the comparison's column headers were deliberately de-capitalised for this rule | +| Split-Header Ban | **Pass** — every section header stacks headline over body | +| Zigzag Alternation Cap | **Pass** — the two image+text splits (hero, portrait) are separated by two other families | +| No Duplicate CTA Intent | **Pass** — one label, „Jelentkezem tesztelőnek", used for the one intent in both places | +| Logo wall = logos only | **n/a** — no logo wall | +| Bento Background Diversity | **n/a** — no bento | +| „Used by" wall under the hero | **n/a** | +| **Copy Self-Audit** | **Pass** — every visible string re-read. The ten capability texts are **verbatim from the live page** on purpose: the audit's finding was that the writing is right and the layout is wrong, so no hedge („ha van", „szinte mind") was rewritten away | +| Motion motivated | **Pass** — there is no motion. The old hero's infinite float is gone | +| Marquee max one | **n/a** — none | +| Navigation one line, ≤80 px | **Pass** — unchanged from the live nav, spliced verbatim | +| **Section-Layout-Repetition** | **Pass** — 10 sections, 10 families. Was 11 sections over 8 families, `why-grid` ×3 and `apps-showcase` ×2 | +| Bento rhythm and exact cell count | **n/a** | +| Long lists use the right component | **Pass** — the ten-card grid became three labelled clusters (§4.9 „grouped chunks") | +| **Real images, no fake screenshots** | **Pass** — one real dashboard screenshot in the hero, four in the gallery, one real photograph of the operator. No AI image, no stock, no picsum, no div-built preview. The decorative logo is gone from the hero | +| No pills over images | **Pass** | +| No photo-credit decoration | **Pass** | +| No version footers | **Pass** | +| No micro-meta sentences under eyebrows | **Pass** | +| No hero-bottom decoration strip | **Pass** | +| No floating top-right sub-text | **Pass** | +| No filled progress-bar comparisons | **Pass** — the comparison is text in two columns | +| No locale / weather strips | **Pass** | +| No scroll cues | **Pass** | +| No version labels in the hero | **Pass** | +| **No section-numbering eyebrows / generic step labels** | **Pass** — `1..5` and `01..05` are gone; the steps are named by their verb-noun and ordered by layout | +| No decorative dots | **Pass** | +| No `border-t`+`border-b` on every row | **Pass** — the comparison uses one divider between rows, not a box per row | +| Content density sane | **Pass with a stated deviation** — the ten capability paragraphs run past §4.9's 25-word guide. Deliberate: see Copy Self-Audit | +| Quotes ≤3 lines | **n/a** — no testimonials | +| Motion claimed = motion shown | **Pass** — `MOTION_INTENSITY: 3` claims none and ships none | +| GSAP skeletons | **n/a** | +| No `window.addEventListener('scroll')` | **Pass** — the only JS is the existing nav toggle and `gallery.js` | +| Reduced motion honoured | **Pass** — the global `prefers-reduced-motion` block is present, and there is no animation to suppress | +| Dark mode tested | **Pass** — single locked dark theme, by brand decision | +| Mobile collapse explicit | **Pass** — every new multi-column rule has its `<900px` and `<600px` fallback written in the same block | +| Viewport stability, no `h-screen` | **Pass** — the new hero uses no viewport-height sizing at all; the old `.hero` used `100vh` | +| `useEffect` cleanup | **n/a** — no framework | +| Empty / loading / error states | **n/a** — static marketing page | +| Cards omitted in favour of spacing | **Pass** — the ten cards became three clustered lists; the comparison is a divided table, not eight boxes | +| Icons from an allowed library | **Pass, by the Felhom override** — the self-hosted `icons.svg` sprite is the library; no npm icon package | +| Motion isolated in client leaves | **n/a** | +| No AI tells from §9 | **Pass** | +| Core Web Vitals plausible | **Partly** — the hero image is `fetchpriority="high"` with width/height set, so LCP and CLS are in hand; **but nothing is compressed on the wire** (R-931), which is the real limiter | +| One design system | **Pass** | + +## The Felhom additions (`felhom-web-design` §9) + +| Check | Verdict | +|---|---| +| UTF-8 BOM on every page file | **Pass** — asserted by the builder and by `site_gates.py` gate 1 | +| Zero emoji | **Pass** — gate 2 | +| Zero `—` including meta | **Pass with the two stated exceptions above** | +| No `<style>` block; `site.css` `?v=` bumped | **Pass** — `?v=11` | +| **Every request to `felhom.eu` or `stats.felhom.eu`, listed from the browser** | **Pass** — 11 requests: `felhom.eu` 8, `stats.felhom.eu` 2, third-party **0**. Full list in the session report | +| Page weight compared and said out loud | **Pass** — table above, including the part that did not improve | +| Body contrast at or above baseline | **Pass after a fix.** Three new styles measured **3.88 / 3.14 / 3.57** on first pass, all under AA. Moved to `--text-2` and re-measured on the deployed file: **7.56 / 6.12 / 6.96**. One pre-existing failure remains and is filed (R-930) | +| Focus visible | **Pass** — `:focus-visible { outline: 2px solid var(--blue-bright) }` applies | +| Reduced motion honoured | **Pass** | +| **No horizontal scroll at 390 px** | **Pass** — `clientWidth == scrollWidth == 375` at 390, and `== 1425` at 1440 | +| English twin in the same commit | **Deferred to Part D by design** — a preview URL cannot be a `TWINS` pair (AUDIT.md §K.6). The twin is written in the switch commit, as a real twin | +| `repo_gates.py` green, new page registered | **Pass** — `site_gates.py` green; `preview/index.html` registered in `NO_TWIN` with its reason | + +## A measurement that was wrong, and how it was caught + +The first contrast pass reported `.limits p` at **1.17:1**, which would have been a severe failure. +It was an error in the measuring script, not in the page: the helper walked up for the first +non-transparent background and found `--warn-dim`, which is `rgba(224,169,62,.12)`, then treated that +translucent colour as if it were opaque. Compositing the whole ancestor stack over the page +background gives the true value, **5.67:1**, which passes. The three real failures in the same run +were real and were fixed. + +The lesson is the project's own: an instrument that can report a wrong number silently is not a +measurement. The corrected helper is in the session transcript and composites every layer. diff --git a/documentation/audits/redesign-2026-10-10/after/home-1440-hero.png b/documentation/audits/redesign-2026-10-10/after/home-1440-hero.png new file mode 100644 index 00000000..4f26e2e3 Binary files /dev/null and b/documentation/audits/redesign-2026-10-10/after/home-1440-hero.png differ diff --git a/documentation/audits/redesign-2026-10-10/after/home-1440-ki-all-mogotte.png b/documentation/audits/redesign-2026-10-10/after/home-1440-ki-all-mogotte.png new file mode 100644 index 00000000..538cd03d Binary files /dev/null and b/documentation/audits/redesign-2026-10-10/after/home-1440-ki-all-mogotte.png differ diff --git a/documentation/audits/redesign-2026-10-10/after/home-1440-miert.png b/documentation/audits/redesign-2026-10-10/after/home-1440-miert.png new file mode 100644 index 00000000..460820a6 Binary files /dev/null and b/documentation/audits/redesign-2026-10-10/after/home-1440-miert.png differ diff --git a/documentation/audits/redesign-2026-10-10/after/home-390-hero.png b/documentation/audits/redesign-2026-10-10/after/home-390-hero.png new file mode 100644 index 00000000..fc9f0844 Binary files /dev/null and b/documentation/audits/redesign-2026-10-10/after/home-390-hero.png differ diff --git a/documentation/backlog/OPEN-ITEMS.md b/documentation/backlog/OPEN-ITEMS.md index b7e10bae..29718164 100644 --- a/documentation/backlog/OPEN-ITEMS.md +++ b/documentation/backlog/OPEN-ITEMS.md @@ -254,7 +254,7 @@ stopping line that lies. | **R-814** | Hub & operator | P4 | `PBS-storage-1` (u629193, box 611421) still `status=active`, 19.9 MB | **VERIFY** (2026-10-03 triage: a July watch row with no id; given R-814. WAITING-ON-OPERATOR — no record found that the box was deleted.) — WAITING-ON-OPERATOR | operator console | Delete the box | operator | | **R-844** | Hub & operator | P4 | **The household's OS-update line exists only on the hub's customer timeline.** 2026-10-04: the box itself has no event surface for agent results (the controller UI shows no timeline), so `os_update_applied` is a hub customer event (info: recorded, never mailed). Its stored text is the hub's English sentence; the hu/en bundle text (`mail.event.os_update_applied`) is used only if it is ever mailed. Fix direction: a controller-side line (the controller already polls the agent's local API) when the box gets a household timeline. `audits/os-guest-lane-2026-10-04/partG/hub-customer-timeline-demo-hp.txt` | **READY — owner: CC** **2026-10-05 (burn-down night): NEEDS A DESIGN** — a household timeline on the box does not exist yet. | — | — | CC | -## Business & legal — 10 rows (P2 4, P3 1, P4 5) +## Business & legal — 11 rows (P2 4, P3 2, P4 5) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| @@ -268,8 +268,9 @@ stopping line that lies. | **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 | +| **R-930** | Business & legal | P3 | **The site's primary call-to-action fails WCAG AA: white on `--blue` #0083D8 measures 4.01:1 at 16px/600, against a 4.5:1 floor.** MEASURED 2026-10-10 in the browser, on the LIVE home page and on the redesign preview: identical, so this is **pre-existing and site-wide**, not a regression of the redesign. It is the „Jelentkezem tesztelőnek" button and every `.cta-button` on every page. `.cta-button-secondary` is fine (7.17:1). Three fixes, all needing the operator because each touches brand: (a) darken `--blue` until the ratio clears 4.5 (changes a token used across hub, controller and website); (b) make the label 700 weight at 18.66px+, which moves it into WCAG's „large text" band where 3:1 applies and 4.01 passes, at the cost of a bigger button everywhere; (c) accept it and record the decision. **Not changed unilaterally**: `felhom-web-design` §6 puts a new accent colour behind the operator's word. | **WAITING-ON-OPERATOR** — filed 2026-10-10 by the home-page redesign session; evidence `audits/redesign-2026-10-10/AUDIT.md` | operator's choice between (a), (b), (c) | pick one of the three | operator | -## Process & tooling — 20 rows (P3 3, P4 17) +## Process & tooling — 21 rows (P3 3, P4 18) | ID | Category | Sev | What | State | Blocked on | Next action | Owner | |---|---|---|---|---|---|---|---| @@ -293,6 +294,7 @@ stopping line that lies. | **R-759** | Process & tooling | P4 | **[P3-LOW] wger's onboarding record (the checklist pilot) keeps rows open that no other row owns.** 2026-10-01, `app-catalog-felhom.eu/onboarding/wger.md`: **2.5** no backup → remove → restore → read back of wger exists — the box has no per-app backup press outside an Update (R-648) and wger has no newer step to carry one; **3.7** changing the password and adding a family member not measured, and the template has no `add_people` text; **6.3** no forced-fail undo for wger; **8.2** the app page not read on 9202 this session; **9.1** the runtime volume-persistence gate not re-run (last CLEAN 2026-08-02). The other open rows have their own: 1.5 (R-755), 1.7/2.8 (R-762), 3.4 (R-763), 7.1 (R-764). wger is exempt from the onboarding gate (published before the checklist), so nothing blocks; this row is what keeps the record honest. **Needs:** the five measured on 9202 — 2.5 and 6.3 ride wger's next ladder step (the update's backing-up phase is the per-app backup). `audits/new-app-checklist-2026-10-01/` | **READY — rank P3-LOW; owner: CC (catalog)** **Re-ranked 2026-10-03: P3→P4: record-keeping for a hidden app; nothing blocks.** | — | — | CC | | **R-786** | Process & tooling | P4 | **[P3-LOW] SparkyFitness's onboarding record has six open rows** (`app-catalog-felhom.eu/onboarding/sparkyfitness.md`): 0.5 runtime internet (food search providers), 0.7 the phone app's sign-in route through traefik, 1.6 the env names the server reads, 1.7 the entrypoint read, 5.4 a second memory watch at another limit, 8.3 no logo/screenshots on felhom.eu (404). Everything else measured this session (bench + 9202). **Needs:** each row measured, or n/a with a reason. | **READY — rank P3-LOW; owner: CC (catalog)** **Re-ranked 2026-10-03: P3→P4: onboarding record completeness; no household meets it directly.** | — | — | CC | | **R-807** | Process & tooling | P4 | **[P3-LOW] 13 apps stay UNDETERMINED because their seeds write only to the database, so their upload / media / cache / redis volumes stay empty.** MEASURED 2026-10-02 (`audits/persistence-sweep-2026-10-02/A/sweep/TABLE.md`): claper, crafty-controller, dawarich (redis), docmost, gramps-web, immich (ML cache), outline (+redis), sparkyfitness, tandoor, vikunja, wger, wishlist, zipline — plus plex (no seed route: a plex.tv claim token) and wanderer (no fixture; unhealthy under the gate). None is BROKEN: nothing was written outside a preserved folder. **Needs:** per app, a seed that uploads one file (or the volume named n/a with a reason: a redis cache, an ML model cache). | **READY — rank P3-LOW; owner: CC** **Re-ranked 2026-10-03: P3→P4: test coverage; nothing was found broken.** | — | — | CC | +| **R-931** | Process & tooling | P4 | **felhom.eu serves no compression at all — `site.css` goes over the wire as 94 310 raw bytes, and the home page's HTML as ~27 KB.** MEASURED 2026-10-10: `curl -H 'Accept-Encoding: gzip, br'` returns **no `Content-Encoding` header** and the same `Content-Length` as a request that offers nothing, for both the stylesheet and the HTML. CSS of this shape typically gzips to roughly a fifth, so this is the single cheapest weight win on the public site, and it helps **every** page rather than one. It is an nginx setting in `manifests/webpage.yaml`, not a website change, which is why the redesign session filed it instead of fixing it. Noticed because the redesign added ~7 KB of CSS, and that 7 KB is paid in full, uncompressed, by every page on the site. | **OPEN** — filed 2026-10-10 by the home-page redesign session | — | add `gzip`/`gzip_types` (or brotli) to the website nginx config and re-measure the header | CC | <!-- DUE-CHECKS-BEGIN — machine-readable. Parsed by scripts/due_checks_gate.py. One row per dated check. The R-number must have a row above. Dates are UTC.