Commit Graph

1954 Commits

Author SHA1 Message Date
admin ed59bf3cbd Website: list the machine estimator — menu, sitemap, FAQ and apps-page links; R-997 closed
gates / gates (push) Failing after 6m33s
noindex and the robots Disallow lines removed; both URLs in the sitemap with their hreflang pair; the pair
moves from UNLISTED to TWINS in site_gates.py. The explaining sentence's base figure was already the drawn
box's base; a test now pins it (red-proved).
2026-10-13 19:26:55 +02:00
admin 750b55e90c Register: file R-998 (no way to turn a machine off) and R-999 (restart text says 'whole server') — being built
gates / gates (push) Successful in 6m25s
2026-10-13 19:20:57 +02:00
admin b4dcf4b373 Power-off spike (Part A) on the N100: plugswitch, wall-power figures, the hub's view
gates / gates (push) Successful in 6m35s
plugswitch.py refuses 'off' unless 20 s of readings show the N100 is already off (standby + 1 W,
no ping); 7 tests, each check red-proofed. By hand: guest shutdown 12 s, host off, 0.0 W; the hub
stayed silent and 'ONLINE' for 18 min; plug off/on did not start the N100, its power button did
(dashboard in 42 s). Wall figures into SIZING.md 4 and sizing.json power (8.5 / 20.7 / 0.0 W).
2026-10-13 19:15:08 +02:00
admin 6a1f715a87 Bench: plugmeter reads the N100's metered plug (tinytuya + Home Assistant from the catalog)
gates / gates (push) Successful in 6m43s
scripts/bench/plugmeter.py prints watts/mA/V/kWh as CSV from the Tuya plug on the LAN
(default) or from Home Assistant on demo-hp's guest. 10-minute side by side and a
3-minute control in documentation/audits/plugmeter-2026-10-13/: Home Assistant alone
did not move for 3 minutes, so the LAN reader is the measurement source.
No key, device id or token in the repo; secrets scan 0 hits with a positive control.
2026-10-13 17:07:26 +02:00
admin fc0441348d Website: machine estimator v3.1 — bar never below an 8 GB box; a single leftover app keeps its name (R-997)
gates / gates (push) Successful in 6m47s
Empty or tiny selections drew a ~2.3 GB box whose base system (1,636 MB) no real box
has; the bar is now floored at the smallest named size (8 GB) for its parts only — the
recommendation and the rule are unchanged. Grouping applies only to two or more
leftover apps; a ninth app is shown by name in the group's colour. Tests: 12, the
new ones red-proofed.
2026-10-13 16:31:56 +02:00
admin 92e9d45cf5 Website: machine estimator v3 — the bar shows what the box's memory is used for (still unlisted, R-997)
gates / gates (push) Successful in 6m29s
The bar keeps its length (the fits-well box memory) and is split into base system
(box - guest), Felhom's own services, each app's peak (largest first, the dashboard's
palette minus amber and its first blue; beyond 8 apps one group) and spare room
(guest - peak) — all from the one rule; a test proves the parts sum to the bar within
1 MB. A legend under it (not sticky) and one sentence explain the recommended size.
Typical figure moved into the method fold-out. English: 'an 8 GB machine'.
2026-10-13 16:08:00 +02:00
admin 16dca64834 Website: machine estimator v2 — fold-out categories and the memory bar (still unlisted, R-997)
gates / gates (push) Successful in 6m31s
Each category is a native <details>, closed at first, with an 'n selected' count;
a preset opens what it ticks. A sticky memory bar (0-64 GB, marks 8/16/24/32/48/64+):
solid fill = smallest box memory where the selection fits well, thin mark = where it
fits, but tight; one line names the box to buy. minBoxGb() inverts guestMib() by
bisection on it, so the rule is still written once. Box sizes 12/24/48/64 added;
tests cover seven sizes and the inverse (red-proofed); SIZING.md table gains 24 GB.
2026-10-13 15:38:45 +02:00
admin d5ef93b13b Website: the machine estimator (/gepigeny, /en/sizing), live but unlisted; SIZING.md §5 in three verdicts; R-997 filed
gates / gates (push) Successful in 6m42s
A household ticks apps and sees, for an 8, 16 and 32 GB box: fits well / fits, but
tight / does not fit, the totals, and the apps that burst on CPU. One rule in
assets/sizing.js, every number from assets/sizing-data.json (built by
scripts/build_sizing_web.py from the 2026-10-13 N100 measurement; test: 7 cases,
red-proofed). Unlisted: noindex, robots Disallow, not in the sitemap, linked from
nowhere — site_gates.py gate 25 enforces it (UNLISTED twin pairs keep every twin
check). SIZING.md §5 corrected: the 8 GB line contradicted its own x1.5 rule; guest
sizes 4.0/11.4/27.4 GB with the measured 612 MiB MemTotal shortfall. R-993 gains the
fact that the installer accepts a host below any minimum.
2026-10-13 14:31:44 +02:00
admin fdca4971af R-996 filed: test_dooplex_offsite.py fails 28/30 under a worktree's absolute GIT_DIR, so the pre-push hook refuses a correct push
gates / gates (push) Successful in 6m23s
2026-10-13 13:54:58 +02:00
admin 3e28c202d7 Golden 0.309.0 baked, published (sha c8a9913d…0e06) and vouched
The golden waiver (R-468) expired 2026-10-13 and the gate refused every push.
Operator: bake a golden, vouch, then push. Baked per RUNBOOK-manual-build §4.0-4.1
in the drill VM: build-golden.sh v3.2.0, controller 0.309.0 (MinAgent 0.131.0),
the approved Docker set, round trip sha-equal, token grep 0 with a working control,
VM back on virgin. Vouch saved by the operator in the hub UI (this session's save was
refused by Claude Code's permission check); read back: golden 0.309.0, agent 0.150.0,
min_agent 0.131.0. Floor untouched.
2026-10-13 13:45:42 +02:00
admin c885b5acf4 Audit: what a Felhom box needs — floor, 64 apps' memory and CPU, power (N100 bench); R-993..R-995; R-231 due check read green
Measured on demo-felhom (N100, 16 GB): 61 apps deployed and removed through the
product, sampled every 5 s; heavy apps with one real action (Immich 200 photos,
Jellyfin transcode, Paperless OCR, Nextcloud 500 MB, ...). sizing.json for the
estimator (tools/build_sizing.py), SIZING.md with the proposed minimum machine,
METHOD.md. Power is RAPL CPU-package only (no meter). R-993 asks the operator to
approve the minimum machine; R-994 lists catalog limits/requests that are too low;
R-995 records leftover unnamed volumes after removal. R-231's dated check measured:
dooplex-backup.service success, journal green.
2026-10-13 13:23:51 +02:00
admin c2a6cf7a58 research doc added
gates / gates (push) Failing after 6m30s
2026-10-13 06:47:09 +02:00
admin 52615d9139 Website + evidence: the Usenet pair (R-988 closed), and the drill route filed as R-989
gates / gates (push) Successful in 6m34s
The catalog published SABnzbd and NZBGet today (app-catalog 8ee687e). Here:

- two cards in the media category on both language sets, each with the project's own logo and
  each saying IN BOLD that a paid Usenet subscription is the household's own
- the published count 60 -> 62 everywhere it is stated; the category badges are derived from
  the cards now (media read 15 with 17 cards, otthon/home read 14 with 16 — both stale)
- documentation/audits/usenet-2026-10-12/: both bench runs, both box steps and verdicts, the
  nine defects with their measurements, what a missing provider left unmeasured, the teardown
- R-988 closed (moved to CLOSED-ITEMS in this commit); R-989 filed: the drill-catalog route of
  09 §6.5 cannot be followed — that repo is private and no box has catalog credentials, so the
  templates were staged in the box's own catalog cache instead
- walk.app_env: a SECRET field in app.yaml is stored ENC:, so that helper returns ciphertext —
  the docstring says so now, measured the hard way
- STATUS.md and REPORT-usenet-2026-10-12.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0117kRTSgs3rJWUFGxyoWN6Y
2026-10-12 22:58:59 +02:00
admin 52b6599d97 Audit: three years of the PROHARDVER! home-server forum read against Felhom; R-990, R-991 filed
gates / gates (push) Successful in 6m36s
Read-only. fetch.py (polite, 5 s apart, 34 pages, all 200), parse.py (own text only; four parser
defects found by the controls and fixed), build.py + spotcheck.py (stdlib). tags.csv holds post
numbers and tags only - no username, author id, salt or post text in git. FINDINGS.md (2,908 posts,
195 people, 82 beginner threads in 7 clusters), FELHOM.md (catalog gap, hardware fit, 15 website
questions, objections, ten ranked recommendations), METHOD.md (controls, spot-check: role and
hardware below 85 % after two rounds, the table-driving splits 92.5 % and 97.3 %), REPORT.md.
R-990: operator rules on the recommendations. R-991: no buyer-readable hardware floor.

Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-12 22:20:52 +02:00
admin a7f897a7dd Audit: selfh.st survey 2023-2025 read against Felhom; R-989 filed
gates / gates (push) Successful in 6m24s
Read-only. fetch.py + tables.py (stdlib), TABLE.md (45 charts, % of
respondents), FELHOM.md (apps, features, reasons, hardware, trends, ten
ranked recommendations), METHOD.md (hashes, counts, matching, MIT licence,
limits). Survey files are not committed. One register row (R-989) and one
STATUS line ask the operator to rule on the recommendations.
2026-10-12 22:09:10 +02:00
admin c4d1b0ff98 Website: the two download clients on the app page; the campaign's evidence; R-988 filed
gates / gates (push) Successful in 6m27s
The catalog published qBittorrent and Transmission today (app-catalog 9081a47). Here:

- two cards in the media category on both language sets, each with the project's own logo,
  each saying what a closed peer port costs (slower swarms, no incoming peers)
- the published count 58 -> 60 on every page that states it, FAQ JSON-LD with its visible twin
- documentation/audits/qbittorrent-2026-10-12/: both bench runs, both box walks and verdicts,
  verify-fixes.json, teardown-newapps.json, and the README brought to its final state
- the 2026-09-30 walk harness: a `type: path` deploy field is filled with the drive ROOT —
  the controller refuses a path inside a drive (409), so the walker could not install any app
  with a drive field at all
- R-988: the Usenet pair (SABnzbd, NZBGet), operator request, not started
- STATUS.md and REPORT-newapps-2026-10-12.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0117kRTSgs3rJWUFGxyoWN6Y
2026-10-12 21:03:11 +02:00
admin 5148fe1e11 audit: download clients for the catalog - qbittorrent + transmission measured twice, five defects fixed
gates / gates (push) Successful in 6m29s
The arr stack had no download client: radarr/sonarr/seerr decide what to fetch
and hand it to one, and there was none. Both templates are written and measured
on the bench (LXC 9401) and on 9202 through the product. Neither is published -
the onboarding records are not complete and the gate refuses a template without
one.

Found by measuring, each fixed:
- qBittorrent was unreachable on its own public name: WebUI\ServerDomains takes
  SEMICOLONS; a comma list answers 401 Invalid Host header to everything.
  Undocumented upstream; measured four ways through the app's own API.
- Both clients asked the household's router to open a port (qBittorrent
  UPnP/NAT-PMP ON, Transmission port-forwarding-enabled true). The box opens no
  port at home. qBittorrent ignores the seeded Session\UseUPnP=false at first
  start but honours the same setting through its API, so it goes through
  after_install: ON at 17:21:51, OFF at 17:21:56.
- Transmission could never go healthy (401 on every path, curl -f exit 22).
- Transmission's host whitelist refused its own healthcheck.
- The apparent lock-out was a measurement artefact: with stranger and household
  on two different addresses, the stranger is banned and the household signs in
  at the same instant (204). qBittorrent reads the real visitor address.

Downloads work with no inbound port, measured: 34 seeds / 4 MB/s (qBittorrent),
48 peers (Transmission), both complete, port confirmed closed.

9202 is back on the live catalog with both apps removed; bench 9401 stopped as
found; the live catalog's main untouched.
2026-10-12 19:38:23 +02:00
admin 7865dc9f58 R-917: the first Facebook post is published (19:00:07, permalink 200); only the operator's pin left
gates / gates (push) Successful in 6m23s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 19:04:48 +02:00
admin 43b2822883 evening: controller 0.309.0 delivered (R-388 slice 1, R-521 F7 closed); decisions 234-235 (Q1/Q2); STATUS + REPORT-disk-evening-2026-10-12
gates / gates (push) Successful in 6m28s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 18:16:07 +02:00
admin 1606b492d5 evening Part C: R-931 (gzip live) and R-932 (em dashes) closed; R-206 part (a) in git; R-935 note
gates / gates (push) Successful in 6m25s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 17:27:01 +02:00
admin f9bb02707f security review: STATUS (four decisions) and REPORT-security-review-2026-10-12.md
gates / gates (push) Successful in 6m23s
2026-10-12 17:21:11 +02:00
admin 0b7a8dbf63 architecture 13: the threat model (draft) from the security review
gates / gates (push) Successful in 6m29s
2026-10-12 17:18:08 +02:00
admin db0071f486 security review: FINDINGS.md (short form) and COVERAGE.md
gates / gates (push) Successful in 6m29s
2026-10-12 17:15:40 +02:00
admin a4f3b7a088 security review: SCANNERS.md, redacted scanner output, live evidence (demo-hp, public sites, hub 0.148.0 check)
gates / gates (push) Successful in 6m26s
2026-10-12 17:13:02 +02:00
admin daf942fc7a security review part 4: 18 finding rows (R-970..R-987), notes on R-935/R-132/R-908, the rotation date in secrets.md (101 -> 119 rows)
gates / gates (push) Successful in 6m20s
2026-10-12 17:10:19 +02:00
admin 013ee81369 hub (tests only): five cross-box refusal tests (security review part 3); R-955 filed (100 -> 101 rows)
gates / gates (push) Successful in 6m25s
2026-10-12 17:06:51 +02:00
admin 9d8da61dc3 security review part 2: R-954 filed — the exposure window cannot be seen in the logs; operator decision (99 -> 100 rows)
gates / gates (push) Successful in 6m13s
2026-10-12 17:01:51 +02:00
d fa5c13eac1 manifests/webpage: nginx gzip for text (R-931); a pod annotation so the subPath config reloads on sync
gates / gates (push) Successful in 6m11s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 16:59:12 +02:00
admin 8d34d60740 manifests: hub 0.148.0 (SECURITY, R-951)
gates / gates (push) Successful in 6m11s
2026-10-12 16:55:26 +02:00
admin b67b8cea8f hub v0.148.0 (code): SECURITY — the customer list and box reports need the operator key (R-951); R-950 rotated; R-952, R-953 filed (97 -> 99 rows)
gates / gates (push) Successful in 6m8s
2026-10-12 16:51:42 +02:00
admin fa4c505a55 report: the first tester - privacy notice 1.1, the two rulings, and the kit
gates / gates (push) Successful in 6m10s
2026-10-12 16:49:23 +02:00
d 186f3aa34e evening Part B: R-304 runbook + close, R-836 closed, R-528/R-435 dated, R-330 wire half closed; R-935 filed (core.bare flips)
gates / gates (push) Successful in 6m11s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 16:45:24 +02:00
admin 225afa0f30 legal+marketing: privacy notice 1.1 (the domain registration) and a tester kit
gates / gates (push) Successful in 6m4s
The first real tester answered on Prohardver today. His domain is bought in his
name (terms 1.1 §4), so his name, address, e-mail and phone leave this house -
and the privacy notice did not say so. Now it does, before the purchase.

Operator rulings, asked before the work and recorded in CONTEXT.md:
- Registrar for a tester's .hu domain: Nethely Kft.
- The tester's zone lives in FELHOM's Cloudflare account during the test. This
  is what the build already assumed (day0-install A.1 + the one-zone token guard
  of 01 §7 / R-138 option C) and nothing had recorded it; it answers open point 9
  of the privacy draft.

Privacy notice 1.1:
- New §10 "A domained regisztrációja": exactly the four fields the .hu
  Domainregisztrációs Szabályzat §1.2.2.1 requires of a natural person (the
  optional mother's name, birth date and ID number are NOT asked for), by e-mail,
  to Nethely and the .hu registry (both named with seats), why, how long, and
  what is public - a natural person shows as "Természetes személy" only.
- It also states whose Cloudflare account holds the zone and that the domain
  moves to the tester's own account when he leaves.
- §11 (recipients) gained the two new names: a recipients list that omits two
  recipients is wrong. That is the one change beyond the new section.
- 1.0 -> 1.1 diff: the only removed/changed lines are the record's title and
  derived-on date, the version line, and four renumbered headings.

marketing/testers/kit/: five files + README, Hungarian, first person. Questions
about the machine and the net (each traced to day0-install Part B or the FAQ),
the domain data request, the tester's acceptance e-mail (no domain purchase
before it arrives), the welcome e-mail with the recovery-code warning, and the
operator's own step list. No personal data in any of it - placeholders only.

Also: EMAIL-privacy-1.1.md for the existing testers, the legal README pointing at
the 1.1 records, and one plural verb the voice sweep missed in the FAQ.
2026-10-12 16:44:35 +02:00
d 6c2c3dd574 evening Part A: disk Z6A07P2G silenced 30 days by serial, Longhorn HDD4 removed, removal checklist + R-934; R-231 token out of the URL
gates / gates (push) Successful in 6m24s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 16:36:00 +02:00
admin 0d463a859e answers 2026-10-12 Parts D, F, G: controller 0.308.0 delivered, the capability map restructured, the notification design; 128 -> 97
gates / gates (push) Successful in 6m12s
- closed: R-922 R-255 R-266 R-333 R-577 R-554 R-562 (controller 0.308.0 on demo-hp, demo-felhom, Tester 1), R-288 (map 212 KB -> 48 KB, detail per section)
- R-521 narrowed to F7; R-388 design in 08 §8.1 (two questions for the operator)
- privacy draft: why the registered address stays (S1); 02 module map: setup wizard deleted
- STATUS + REPORT-answers-2026-10-12.md; docs.md routing line names capability-map-detail/

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 15:54:44 +02:00
admin c31f0a1a51 answers 2026-10-12 Parts C + E: hub 0.147.0 live and read back, Glance gated; 5 rows closed (110 -> 105)
gates / gates (push) Successful in 6m17s
- closed: R-242 (golden-vouch alarm live), R-244 (cascade + sweep 19 ids / 79 rows / 7 orphans, recount 0),
  R-246 (stale_at retired), R-402 (host-page integrity line, matches the box), R-782 (Glance family gate proven on 9202)
- R-250 VERIFY (next real off-site setup); R-266 + R-521 hub halves live, controller halves pending
- R-887: my rate limit refused a hub image push (home public IP); fixed at once (homelab-manifests d0767fe)
- evidence: audits/answers-2026-10-12/{hub-0.147.0-readback,s26-glance-family-gate-9202}.txt

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 15:36:49 +02:00
admin c0a2953bea website: the share card's wordmark is the brand's own, with the blue .eu
gates / gates (push) Successful in 6m15s
The old card's lettering was plain white and in some other face. The card now
takes assets/logo-wordmark.png - the same file the sidebar shows - scaled to the
old lettering's ink height and alpha-composited in its place, so felhom is white,
.eu is blue, and the drawn outline is there. The cloud mark beside it is still
the old card's pixels, which were always right. og:image ?v=3.
2026-10-12 15:34:55 +02:00
admin 0fbba61030 manifests: hub 0.147.0 (the operator's answers S4, S6, S10, S29, S30, S32, S33)
gates / gates (push) Successful in 6m14s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 15:27:07 +02:00
admin 655f5f66f8 hub v0.147.0 (code): the operator's answers S4, S6, S10, S29, S30, S32, S33
gates / gates (push) Successful in 6m0s
- S4 / R-242: GoldenVouchChecker - a published golden unvouched for 2 h raises golden_not_vouched (operator only)
- S6 / R-244: the delete cascade de-references app_log_issues; one-time sweep flag -sweep-app-log-residue=count|apply
- S10 / R-266: read_failed storage entry shows "read failed", not 0 %
- S29 / R-250: host-key scan IPv4 first, ~2 min ladder, "safe to press Save again" error
- S30 / R-246: stale_at retired (reader, setter, badge)
- S32 / R-521: storage_reconnected ends the storage_disconnected cooldown on both channels
- S33 / R-402: host page "Last full check (off-site)" line; two wire-gate allowlist entries removed
Each with a test seen failing first. Not built or deployed yet (operator-attended deploy).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 14:54:14 +02:00
admin c9b9432986 website: the contact pages' share text speaks in the first person too
gates / gates (push) Successful in 6m5s
The voice sweep reached the visible text and stopped there. description,
og:description and twitter:description on both contact pages still said "Irj
nekunk es szemelyre szabott ajanlatot keszitunk" / "Write to us and we will
make a personal offer" - six lines nobody sees on the page and everybody sees
under a shared link, which is where the operator was about to post one.
2026-10-12 14:52:16 +02:00
admin d328147322 website: the share card shows the product, not just the words
gates / gates (push) Successful in 6m13s
The operator went to post the link and found the card out of date: it was the
2026-07-18 design - a headline and two lines of text on a dark field, nothing of
the product, and older than everything the site has become since.

- og-image.png and og-image-en.png rebuilt around the laptop, with the hero's
  own poster frame on its screen.
- scripts/make_og_card.py: the headline, logo and button are lifted as PIXELS
  from the previous card and composited with `lighter` onto flat --bg-0, because
  the site's font is a woff2 and nothing here can draw a glyph with it. A new
  headline therefore CANNOT be made with this script - new words go back to the
  design tool and this takes that card as its source. The lede lines are gone;
  the laptop says what they said.
- ?v=2 on every og:image and twitter:image (20 pages): a scraper caches by URL,
  so a new picture at the old URL would reach nobody. A card already attached to
  a post still does not change - that post must drop the preview and re-add the
  link after a re-scrape.
2026-10-12 14:48:44 +02:00
admin e2b09f25ea answers 2026-10-12 Part B: the four DooPlex changes live and read back; R-886 + R-211 closed (112 -> 110)
gates / gates (push) Successful in 6m7s
- S21 / R-887: runner fetch_timeout 30s, Gitea Ingress 2 rps per address (homelab-manifests ad8618f); WATCHING to 2026-10-19
- S22 / R-886: Alertmanager fsGroup 65534; a test silence survived a pod restart (4168451) - closed
- S23 / R-211: Prometheus config-reloader; two automatic reloads, no manual POST (ab40c7b, test e70e0f1/78d4be4) - closed
- S20 / R-231: backup scripts in homelab-ansible/roles/dooplex_backup, installed from git (fdd324b); VERIFY 2026-10-13
- evidence: documentation/audits/answers-2026-10-12/s2{0,1,2,3}-*.txt

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 14:35:10 +02:00
admin ee43929040 report: the reviewer's round - the three answers, each fix with its check, the film licence
gates / gates (push) Successful in 6m17s
2026-10-12 14:31:32 +02:00
admin 02be8ea7f0 website: the reviewer's findings - consent error, reply time, sitemap, voice, clip
gates / gates (push) Successful in 6m12s
A page-by-page review of the live site (1440px and 390px) found six defects and
two editorial questions. The operator answered three questions; the answers and
the evidence are in REPORT-review-2026-10-12.md.

Fixed:
- The contact form showed its consent error before any submit, on both pages:
  #privacyError sits outside any .form-group and the hide rule was scoped to
  .form-group. Scoped to the page. Checked: load (none) -> submit unticked
  (shown) -> tick (gone), with no message sent.
- The consent checkbox is the site's own control now: 24px box, keyboard focus
  ring, and a second <label for="privacy"> at 44x44 round it for touch.
- The contact page promised a reply within 24 hours while /feltetelek 1.1 §4
  promises no reply time. Now 1-2 days usually, and no promise during the test.
- sitemap.xml was missing /szolgaltatasok and /en/services: 18 -> 20 URLs.
- The pre-shell mobile-menu script still ran on 20 pages and logged
  "[mobile-menu] Missing elements" on every one. Removed.
- The sidebar's tester button was btn-outline while the hero's was btn-primary.
- The home page's "Mit tud a doboz ma?" was three bare links; each card now
  carries 2-3 of the services page's own items, word for word.
- A plain Facebook link in the footer of all 22 pages. No script, widget or
  pixel: the only external hosts any page refers to are still felhom.eu and
  stats.felhom.eu.

Voice (operator ruling: "I" everywhere a person speaks): contact, tester and FAQ
pages in both languages, and the home and services pages that repeat the same
promises. An inclusive "we" (you and I, talking) stays plural, and the legal
texts are untouched. Each FAQ answer exists twice (JSON-LD + visible) and gate 18
holds them equal - it caught the five answers whose markup split the sentence.

Hero clip rebuilt: Immich first, so the poster is a wall of real photographs;
the Jellyfin scene starts after the demo's library wall (eleven pieces of poster
art whose licence cannot be quoted from a first-party source); 1.3s of blank
screen cut from the OnlyOffice scene. The film that plays, Caminandes 3:
Llamigos, is CC BY per Blender's own video platform ("licence": {"id": 1,
"label": "Attribution"}) - NOT public domain as website/CHANGELOG.md said
yesterday. That sentence is corrected in place and the film is credited under
the hero caption.

New gate 24: sitemap.xml lists every public page once, with its twin's hreflang
pair, and lists nothing else. Decoy: site/sitemap-missing-page, the exact shape
the reviewer found by hand.

site.css ?v=30; hero clip and poster ?v=2.
2026-10-12 14:25:53 +02:00
admin 1b45bb4d9b answers 2026-10-12 Part A: the 38 rulings recorded (09 §3 196-233), 17 rows closed (128 -> 112), R-933 filed
gates / gates (push) Successful in 6m41s
- 09 §3: the decision sheet S1-S38, the operator's words quoted where they differ (S1, S2, S8, S32, S37)
- closed: R-831 R-870 R-698 R-327 R-230 R-719 R-352 R-526 R-770 R-771 R-913 R-290 R-209a R-769 R-616 R-884, and R-243 (dated check: the mail fired 2026-10-11 16:13:51Z, hub log agrees)
- R-698: the known limit written in 07 §6.6; new row R-933 (mirror supported catalog images, P3)
- R-327: capability-map row BUILT; stands claim re-titled and moved to built; page re-rendered
- R-913: the customer Cloudflare token recipe in day0-install A.1; 01 §7 points at it
- R-884: read only - ArgoCD Synced, live Deployment equals git
- R-887 dated check NOT met (4 lost jobs 10-10/11); re-dated 2026-10-19 after the S21 change
- 22 open rows carry their ruling; STATUS: the sheet is ANSWERED

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-12 14:07:50 +02:00
admin 25ab47eeaa website: the two-tone headings are back, and the home page's sections are ruled apart
gates / gates (push) Failing after 6m59s
Two notes from the operator, 2026-10-12: the white/blue heading split was lost
in the M3 switch and should return everywhere, the apps page categories
included; and the home page's sections ran into one another.

- 41 headings get their <span> back (home 5+5, apps 6+6, FAQ 6+7, services 3+3).
  The style never went away - site.css has styled `h2 span` blue all along; the
  M3 rewrite dropped the markup. No text changed: the span wraps words that were
  already there. The three home headings that predate M3 are split where they
  were split then.
- Apps and FAQ categories are new to the treatment: a name with an & splits
  there, a phrase on its last words. Five one-word headings stay plain.
- The home page's sections get a 1px --line rule with 2.75rem of air on each
  side, so it sits centred in the gap; the first also parts the hero from the
  page. Home page only.
- Blue on the page background measures 7.9:1 - AA at any size.
- site.css ?v=28.
2026-10-12 13:18:59 +02:00
admin 6b6aca900c website: the language menu opened off the left edge of the window
gates / gates (push) Failing after 7m1s
The controller's rule centres the menu on the globe (left: 50% +
translateX(-50%)). On the website the globe sits at the far left of the sidebar
footer, so 60px of the 120px menu hung outside the window and both labels were
cut. Anchored to the button's left edge in site.css instead, opening rightwards
into the sidebar; shell.css stays a verbatim copy.

Measured after the fix: menu x 24->144 inside a 240px sidebar. site.css ?v=27.
2026-10-12 13:07:02 +02:00
admin b0ef27e914 website: the laptop screen moves - six real apps behind the cut-out frame
gates / gates (push) Failing after 7m17s
The operator recorded the six scenes and ruled on their length: use them whole,
"they had been cut as I liked them". Jellyfin, Tandoor, OnlyOffice, Immich,
RomM, Paperless, 0.6s crossfades, 36.6s looping at 904x556.

- hero-clip.mp4 (1 134 KB) + hero-clip.webm (1 295 KB) + hero-poster.webp
  (53 KB), one set for both languages: the recordings are the same on / and /en/.
- The hero <video> sits in the frame's cut-out hole at z-index 1, the frame above
  it at 2. No autoplay attribute: the page's script starts it when the hero is on
  screen, pauses it when it leaves, and never starts it under
  prefers-reduced-motion. With JS off the poster stays.
- make_hero_clip.py reads each scene's own length (ffprobe) instead of cutting
  every one to a fixed window, and the xfade offsets count from the running sum
  minus one fade per transition already made.
- site.css ?v=26 on all 22 pages.

NOT verified: playback in this workstation's Chrome, whose media pipeline loads
nothing at all today (a 1 KB generated WAV blob stalls the same way, with no
error) - which rules the clip out as the cause. Geometry, layering and the
poster frame were verified in the browser.

Jellyfin, Paperless and RomM were filmed on those projects' own public demo
sites; the films in the Jellyfin scene are public-domain prints.
2026-10-12 12:39:31 +02:00
admin 7733d7b754 website: prepare the moving laptop screen - the cut-out frame and the clip builder
gates / gates (push) Failing after 14m28s
The operator asked for the laptop's screen to show a few seconds of real apps
running. His decision: he records the raw clips, the assembly is built here. So no
Playwright and no new dependency - ffmpeg 7.1.5 is already on DooPlex.

NOT ON THE PAGE YET. The live hero still shows the still picture; this commit is the
two finished pieces plus the measurements behind the format choice.

scripts/make_hero_clip.py
  NN-appname.ext in -> scaled and centre-cropped to the screen's 1.626:1, crossfaded,
  out as mp4 (h264) + webm (VP9) + a webp poster. Runs on DooPlex; Windows has no
  ffmpeg. Not part of any build, gate or deploy: the site has no build step, so the
  output is committed like any other picture. Proven end to end against six
  placeholder scenes built from the repo's own app screenshots (21s loop -> mp4
  480 KB, webm 609 KB, poster 83 KB).

WHY NOT A GIF - measured, six crossfaded scenes:
    904x556   mp4 331 KB | webm 411 KB |            GIF 2676 KB for HALF the length
    1130x696  mp4 775 KB | webm 1196 KB | webp 2551 KB
  A GIF is ~11x the mp4 for the same seconds and dithers to 256 colours on a dark UI.

website/assets/hero-laptop-frame.webp
  The laptop render with its SCREEN CUT OUT to transparency, so a clip plays under the
  bezel with the glass reflection over it. The reflection is PAINTED: lifting the
  bright pixels out of the AI-drawn screen dragged a ghost of the drawn UI along.
  Hole: left 11.041% top 12.345% width 79.817% height 64.305%, ratio 1.626:1. Two
  pixels of slack - a tight rect showed the drawn sidebar's highlight, a loose one
  showed page background at the top left; both were seen in the browser.

The page will load it as <video muted loop playsinline preload="none"> with the first
frame as poster, started only on scroll-into-view and never under
prefers-reduced-motion. First paint: frame 59 KB + poster ~80 KB against today's single
57 KB still; the ~330 KB clip comes after, or never if the visitor does not scroll
there. No "loading" graphic needed - the poster IS the loading state.

The recording brief is in E:\felhom-video\README.txt (outside the repo: the raw files
are large and the repo is public).
2026-10-12 10:40:26 +02:00
admin 42c2d84c7c gates: re-anchor the ascii-hungarian-text decoy on the renamed link label
gates / gates (push) Failing after 7m19s
Its anchor was "Who is behind it" in en/index.html, which became "More about me" when
the home line went first person. The suite refused to build the decoy rather than skip
it, which is the behaviour that makes an anchor change visible.
2026-10-12 09:34:28 +02:00