website globe: report, live check (desktop JS on/off, 376 px menu), R-903 (no-JS phone menu); 130 -> 131
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
const puppeteer = require('puppeteer');
|
||||
const sleep = ms => new Promise(r => setTimeout(r, ms));
|
||||
async function items(p) {
|
||||
return p.$$eval('.lang-globe-item', as => as.map(a => ({text: a.textContent, href: a.getAttribute('href'), cur: a.getAttribute('aria-current'),
|
||||
vis: a.offsetParent !== null, r: (b => [Math.round(b.left), Math.round(b.right)])(a.getBoundingClientRect())})));
|
||||
}
|
||||
(async () => {
|
||||
const b = await puppeteer.launch({args: ['--no-sandbox']});
|
||||
for (const js of [true, false]) {
|
||||
for (const [w, h] of [[1280, 800], [376, 812]]) {
|
||||
for (const [u, tag] of [['https://felhom.eu/', 'hu'], ['https://felhom.eu/en/', 'en']]) {
|
||||
const p = await b.newPage();
|
||||
await p.setJavaScriptEnabled(js);
|
||||
await p.setViewport({width: w, height: h});
|
||||
await p.goto(u, {waitUntil: 'networkidle2', timeout: 60000});
|
||||
const name = `${tag}-${w}-${js ? 'js' : 'nojs'}`;
|
||||
const closed = await p.$eval('details.lang-globe', d => d.open);
|
||||
if (w < 900) {
|
||||
if (!js) { console.log(name, 'phone menu needs JavaScript (the three-line button is scripted); skipped'); await p.close(); continue; }
|
||||
await p.click('#hamburger'); await sleep(500);
|
||||
}
|
||||
await p.click('summary.lang-globe-btn'); await sleep(300);
|
||||
const open = await p.$eval('details.lang-globe', d => d.open);
|
||||
const it = await items(p);
|
||||
const scroll = await p.evaluate(() => [window.innerWidth, document.documentElement.scrollWidth]);
|
||||
await p.screenshot({path: `/out/${name}.png`});
|
||||
console.log(name, JSON.stringify({openBefore: closed, openAfterClick: open, items: it, viewport_scroll: scroll}));
|
||||
for (const i of it) {
|
||||
const q = await b.newPage(); await q.setJavaScriptEnabled(js);
|
||||
const r = await q.goto(new URL(i.href, u).href, {waitUntil: 'domcontentloaded'});
|
||||
console.log(' ', i.text, '->', q.url(), r.status(), await q.$eval('html', e => e.lang)); await q.close();
|
||||
}
|
||||
await p.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
await b.close();
|
||||
})().catch(e => { console.error(e); process.exit(1); });
|
||||
@@ -0,0 +1,20 @@
|
||||
hu-1280-js {"openBefore":false,"openAfterClick":true,"items":[{"text":"Magyar","href":"/","cur":"true","vis":true,"r":[1043,1161]},{"text":"English","href":"/en/","cur":null,"vis":true,"r":[1043,1161]}],"viewport_scroll":[1280,1280]}
|
||||
Magyar -> https://felhom.eu/ 200 hu
|
||||
English -> https://felhom.eu/en/ 200 en
|
||||
en-1280-js {"openBefore":false,"openAfterClick":true,"items":[{"text":"Magyar","href":"/","cur":null,"vis":true,"r":[1043,1161]},{"text":"English","href":"/en/","cur":"true","vis":true,"r":[1043,1161]}],"viewport_scroll":[1280,1280]}
|
||||
Magyar -> https://felhom.eu/ 304 hu
|
||||
English -> https://felhom.eu/en/ 200 en
|
||||
hu-376-js {"openBefore":false,"openAfterClick":true,"items":[{"text":"Magyar","href":"/","cur":"true","vis":true,"r":[129,344]},{"text":"English","href":"/en/","cur":null,"vis":true,"r":[129,344]}],"viewport_scroll":[376,376]}
|
||||
Magyar -> https://felhom.eu/ 200 hu
|
||||
English -> https://felhom.eu/en/ 304 en
|
||||
en-376-js {"openBefore":false,"openAfterClick":true,"items":[{"text":"Magyar","href":"/","cur":null,"vis":true,"r":[129,344]},{"text":"English","href":"/en/","cur":"true","vis":true,"r":[129,344]}],"viewport_scroll":[376,376]}
|
||||
Magyar -> https://felhom.eu/ 304 hu
|
||||
English -> https://felhom.eu/en/ 304 en
|
||||
hu-1280-nojs {"openBefore":false,"openAfterClick":true,"items":[{"text":"Magyar","href":"/","cur":"true","vis":true,"r":[1043,1161]},{"text":"English","href":"/en/","cur":null,"vis":true,"r":[1043,1161]}],"viewport_scroll":[1280,1280]}
|
||||
Magyar -> https://felhom.eu/ 200 hu
|
||||
English -> https://felhom.eu/en/ 200 en
|
||||
en-1280-nojs {"openBefore":false,"openAfterClick":true,"items":[{"text":"Magyar","href":"/","cur":null,"vis":true,"r":[1043,1161]},{"text":"English","href":"/en/","cur":"true","vis":true,"r":[1043,1161]}],"viewport_scroll":[1280,1280]}
|
||||
Magyar -> https://felhom.eu/ 304 hu
|
||||
English -> https://felhom.eu/en/ 304 en
|
||||
hu-376-nojs phone menu needs JavaScript (the three-line button is scripted); skipped
|
||||
en-376-nojs phone menu needs JavaScript (the three-line button is scripted); skipped
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -272,7 +272,7 @@ stopping line that lies.
|
||||
| **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 |
|
||||
|
||||
## 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 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
@@ -296,6 +296,7 @@ stopping line that lies.
|
||||
| **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-896** | Process & tooling | P4 | **The catalog's `volume-persistence` gate runs its canary and the apps on the LOCAL Docker, so a full gate run on DooPlex acts on the production host — and there its self-test fails for every app.** SEEN 2026-10-06 night: a helper's full `catalog_gates.py` run on DooPlex built `felhom-volgate-canary:1` and ran the canary pair locally (`scripts/check-volume-persistence.py` canary self-test, ~line 830); it reported the self-test failing for every app, also on `main` (checked with gokapi). Not re-run (it would act on DooPlex again). Same class as R-650 (tests that reach real Docker act on DooPlex). | **OPEN — filed 2026-10-06 night** | — | Point the gate at the bench guest (as the upgrade harness does) or refuse to run on a host without a marker; then find why the self-test fails | CC |
|
||||
| **R-903** | Process & tooling | P4 | **On a phone with JavaScript off, the website's menu does not open — so its links and the language globe cannot be reached there.** MEASURED 2026-10-08 (globe brief, headless Chrome at 376 px, JavaScript off): the three-line button is scripted (`#hamburger` toggles `.nav-links.is-open`), and below 900 px the nav list sits off-canvas until then. Older than the globe — the text switch had the same limit. The globe itself works with JavaScript off at desktop width (`audits/website-globe-2026-10-08/check.txt`). Fix direction: a CSS-only menu toggle (a `<details>` or a checkbox), a nav change on every page plus gate 3. | **OPEN — owner: CC** | — | Build the no-JS menu in a website task | 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.
|
||||
|
||||
Reference in New Issue
Block a user