Commit Graph

1203 Commits

Author SHA1 Message Date
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 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
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
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 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 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 bd708b3593 report: M3 live - the changelog, the session report and the operator's screen
gates / gates (push) Failing after 3m58s
Records what shipped, the two operator decisions as answered, what the website and
the controller now share and how a change flows between them, and the five faults
that measurement caught before the switch rather than after.

head-before.json / head-after.json are kept as the evidence that the switch changed
no SEO-bearing tag: the only difference across 19 pages is the dash substitution
inside the two FAQ pages' JSON-LD.
2026-10-11 16:00:57 +02:00
admin 7b6bcd2416 audit: M3 STOP 2 - the page table and what was checked on all 19
gates / gates (push) Failing after 13m34s
Records the three faults that measurement found and looking would not have:
168 words silently deleted by the first page-header transform, the contact pages'
header sliding under the sidebar (content column at x=642 instead of 240), and two
pages that already scrolled sideways on a phone BEFORE M3.

Also raises the one thing needing an operator decision: the English home page is
the old design in the new frame, because the /preview/ round never produced an
English twin. 4 186px tall in Hungarian, 10 786px in English.
2026-10-11 14:25:07 +02:00
admin 698ec9b561 audit: M3 STOP 1 - the shell, the home page, and the six leaking declarations
gates / gates (push) Successful in 6m30s
Measured on the deployed page: 21 requests / 285 KB, 4 181 px at 1440 and 7 530 px
at 390 - less than half the live home page's height - zero third-party hosts, no
overflow, and no contrast failures after two fixes.

Records three things worth keeping beyond this session:
  * the six declarations that leak from site.css into the shell, because later-wins
    is per PROPERTY not per rule. Only one was visible; the rest were found by
    diffing declaration sets.
  * R-930 arriving a second time by another route: fixing the website's .cta-button
    did not fix the controller's .btn-primary, which the shell imports.
  * a measurement trap: a background tab freezes CSS transitions AND rAF, so the
    drawer read as permanently shut when it was fine. Setting transition:none
    before measuring gives the real end state; an rAF await froze a probe for 45s.
2026-10-11 14:00:32 +02:00
admin 80659232bc website: M3 part A - the controller's shell, and the home page inside it
gates / gates (push) Successful in 6m58s
The direction the operator chose: the controller's FRAME around the website's own
content. Staged at /preview/m3/, noindex, nothing live.

website/assets/shell.css - 117 rules COPIED VERBATIM from felhom-controller
  style.css @ dcd89364a4 (sidebar, mobile top bar, off-canvas drawer, and the
  component atoms the restyled pages use: btn, alert, app-info-card, launch-*,
  stack-detail-card, form-*). Exactly ONE rule is not verbatim and says so:
  body.shell { display:flex; min-height:100vh }, which lives in the controller's
  base rather than in a component, scoped to .shell so other pages are untouched.

  The generator NAMES every rule it copies and REFUSES to write the file if one has
  disappeared upstream. That is not ceremony: it already caught two things this
  session. It refused because .sidebar::-webkit-scrollbar does not exist (only the
  -track override does), and because prefers-reduced-motion is split across FIVE
  separate blocks in the controller - reading only the first would have silently
  lost four rules. The M1 round lost a rule exactly this way.

  The bare `body { flex-direction: column }` that broke M1's phone layout is copied
  this time, by name, as are body.nav-open and the no-js/js pair.

  Load order is deliberate: shell.css AFTER site.css. Thirteen selectors exist in
  both files with different meanings (.nav-links, .page-header, .lang-globe*, .ico)
  - a horizontal site nav there, a vertical sidebar here. Later wins, and a page
  that does not load shell.css is completely unaffected.

website/preview/m3/index.html - the home page in the shell. Content is /preview/'s
  cleaned text; body carries `shell page-index` so the existing .page-index content
  rules (caps, flow, vs, band, who-mini) are reused rather than duplicated. Six
  sections, left-aligned headers, the controller's cards. Head tags (title, meta
  description, canonical, hreflang) are already the FINAL values, so the switch in
  part D needs no head edit.

  Four changes from the operator's mockup, each with its reason in the generator:
    1. the active item follows the page (the mockups show Inditopult active on all)
    2. Teszteles is ALSO a primary button at the top of the lower group - it is the
       one action we want and the mockup buries it at the bottom
    3. the Alkalmazasok categories are anchors on /alkalmazasok: real URLs, no
       JS-only state
    4. ADDED GYIK. It is in today's nav; dropping it silently would take a page out
       of navigation, which is not a change a restyle gets to make.

scripts/site_gates.py - gate 3 extended rather than duplicated, as asked: a SHELL
  set whose pages must carry an IDENTICAL <nav class="sidebar"> after the active
  marker is normalised. RED-PROOFED: a one-character change to one menu label on a
  second shell page convicts. It also prints "DIFFER" rather than a reassuring
  "identical" count when it fails - a false reassurance printed beside a conviction
  is the exact defect this repo files rows about.

documentation/design/design-system.md - new "Shell" section: what is shared (tokens
  + shell + atoms), what each side owns, how a change flows (controller first, the
  website's copy the same week), and that the cross-repo gate is deliberately NOT
  built yet.
2026-10-11 13:48:50 +02:00
admin d5f00b7115 context: operator ruling 2026-10-11 - none of the three directions; M3 follows
gates / gates (push) Successful in 7m2s
Recorded in CONTEXT.md as a dated ruling and at the top of the comparison.

Nothing deleted: /preview/, /preview/m1/ and /preview/m2/ all stay up, hidden, so
the next direction can be compared against them. Nothing built: SHARED-DESIGN.md
recommended the canonical-stylesheet-plus-gate mechanism only once a direction
exists, and none does, so it stays unbuilt.

The measured case for a mechanism rather than a convention survives the ruling and
is kept in the audit folder: a component copy between the repos silently dropped a
bare body rule and broke the phone layout in four measurable ways.
2026-10-11 13:38:08 +02:00
admin e2b9e7d9e9 R-899 closed: the night after a daytime press still took its whole-guest backup (Tester 1, 2026-10-11 04:33)
gates / gates (push) Successful in 7m9s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-11 13:35:47 +02:00
admin 7413e0dfab audit: the mockup comparison, the shared-design answer, and two register moves
gates / gates (push) Failing after 11m45s
documentation/audits/mockups-2026-10-11/
  COMPARE.md        the three directions side by side, measured the same way:
                      A  current preview   12 req /  270 KB
                      M1 dashboard         68 req / 1012 KB  (front page 1 660 px)
                      M2 hybrid            16 req /  150 KB  (phone 3 057 px, the shortest)
                    plus three sentences each (good / risk / cost) and the risk I
                    think is real: a non-technical visitor may read M1 as somebody
                    else's account and look for a login.
  SHARED-DESIGN.md  REPORT ONLY, nothing built. M1 needed 260 CSS rules: 188 (72%)
                    copied from the controller UNCHANGED, 8 adapted, 64 new. It used
                    188 of the controller's 826 rules (23%). The 18 tokens are
                    already identical - verified by parsing both :root blocks, zero
                    differing values.
                    Recommends (a) a canonical felhom-ui.css plus a copy-drift gate,
                    over (b) serving the controller's stylesheet to the website -
                    and recommends NOT building it until a direction is chosen.
  shots/            desktop and phone captures of all three, from the deployed pages

The finding that outranks the percentage, and the reason for the recommendation: a
component-level copy silently drops the element-level rules those components depend
on. The extractor copied every .sidebar/.content/.mobile-topbar rule and missed
"@media(max-width:768px){ body { flex-direction: column } }". Everything LOOKED
copied; the phone layout was broken in four measurable ways. Invisible to a diff,
invisible to review. A second instance the same evening: the drawer is gated on a
'js' class set by an inline script that was not copied either.

Register 129 -> 129 (one closed, one opened):
  R-929 CLOSED - NOT A DEFECT. Measured from the catalog: 60 templates, minus
        plant-it (abandoned) and wger (hidden) = 58 offered, exactly what the prose
        says; the page's 59th card is FileBrowser carrying the single "Beepitett"
        badge. Set difference both ways is empty. The premise was wrong on BOTH
        halves. Rule kept: before filing a count disagreement, check whether the
        counts are counting the same set.
  R-932 OPEN - 8 catalog strings across 5 apps carry an em dash, and they render in
        the controller's app page on every real box. Found because the mockups are
        the first thing to show catalog copy on a website page. Lives in a repo this
        session did not have in scope, so it is a row, not a fix.
2026-10-11 12:26:46 +02:00
admin 0c86e698b0 docs: record the placement change and re-measure after it
gates / gates (push) Failing after 5m58s
Every document that described the biography as a home-page section would now be
wrong, so each is corrected rather than left:

  ki-all-mogotte.md  gains 'Where it ended up' with the operator's reasoning, the
                     rejected /rolam option, and why the home page keeps a trace
  AUDIT.md           lever 2 carries a dated revision note (the audit itself is a
                     record of what was found, so it is annotated, not rewritten)
  PREFLIGHT.md       re-measured on the deployed page after the move:
                       1440: 6 780 -> 6 385 px  (42% shorter than the old page)
                        390: 10 865 -> 10 145 px (49% shorter, 23.6 -> 12.0 screens)
                       sections 10 -> 9, layout families 10 -> 9, still no repeat
                       eyebrow allowance 4 -> 3, still 0 used
  website/CHANGELOG  the live change, with the layout bug that the deployed page
                     revealed and the markup did not
  REPORT + STATUS    what is live vs what is still waiting on the operator

The numbers moved because a whole section left the page; leaving the old ones in
place would have been a quiet overclaim in the other direction.
2026-10-11 09:29:47 +02:00
admin 3b3a926b39 audit: the preview's source body, matching fb9fe080
gates / gates (push) Failing after 6m24s
The preview page is generated from this file, so fb9fe080 changed the generated
page without its source. Same change: the 'Ki all mogotte' section removed, the
compact who-mini row added to the closing call to action.
2026-10-11 09:22:43 +02:00
admin 56c357c074 report + plan: the redesign session's record, and the order for the other pages
gates / gates (push) Successful in 6m31s
REPORT-redesign-2026-10-10.md (not REPORT.md: that file belongs to the kernel
night session de4a8d20 and is overwritten per session).

NEXT.md - the other pages in order with what each needs, and the traps:
  teszteles/en/testing first (the destination of every CTA, newest page)
  gyik/en/faq second, with the warning that gate 17 requires the FAQPage JSON-LD
    to EQUAL the visible answers, so every copy edit there is a two-place edit
  technologiak third ("Ipari szintu megoldasok" is the exact language the home
    page just removed)
  alkalmazasok is BLOCKED on R-929 - prose 58, page 59 cards, catalog 60
  adatkezeles/feltetelek are reviewed legal texts; a dash sweep there needs the
    operator's word separately and is not ours to take

  It also records the per-page em-dash count: 300 across 19 pages, the preview
  being the only page at zero.

STATUS.md - the operator's one screen, in plain language: the preview is waiting
on him, the two fixes that DID go live, and the two new decisions (R-931 the
missing compression, R-929 the app count).

website/CHANGELOG.md - the footer sweep and R-930, both with their measurements
and with the scope stated rather than implied.

Register 127 -> 129 (R-930, R-931 opened; none closed).
2026-10-11 00:31:14 +02:00
admin 94ac6afbe8 audit: the preview's pre-flight, before/after shots, and two filed rows
gates / gates (push) Failing after 12m59s
PREFLIGHT.md - taste-skill §14 plus the Felhom additions, run in writing against
the DEPLOYED preview, Pass/Fail per line. Measured, not assumed:

  page height 1440: 10 922 -> 6 780 px (38% shorter)
  page height  390: 19 913 -> 10 865 px (45%, 23.6 -> 12.9 phone screens)
  initial load:     13 req / 308 KB -> 11 req / 260 KB   (same conditions)
  fully loaded:     16 req / ~540 KB -> 15 req / ~545 KB (ESSENTIALLY UNCHANGED -
                    the 93 KB portrait is paid for by dropping the 49 KB hero logo
                    and the 31 KB mono font; stated rather than spun)
  third-party hosts: 0 -> 0
  em dashes in our copy: 18 -> 0
  layout families: 8 for 11 sections (3 repeats) -> 10 for 10 (none)
  no horizontal scroll: clientWidth == scrollWidth at 390 and at 1440

Contrast: three NEW styles measured 3.88 / 3.14 / 3.57 on the first pass, all under
WCAG AA. Fixed to --text-2 and re-measured on the deployed file: 7.56 / 6.12 / 6.96.

A measurement that lied, recorded because it nearly shipped a false verdict: the
first helper reported .limits p at 1.17:1 by treating the translucent --warn-dim
as opaque. Compositing the whole ancestor stack gives the true 5.67:1, a pass. The
three real failures in the same run were real. An instrument that can report a
wrong number silently is not a measurement.

Two rows filed, both needing something this session may not do alone:
  R-930 (Business & legal, P3) the primary CTA is 4.01:1, under AA. MEASURED
        IDENTICAL ON THE LIVE PAGE, so pre-existing and site-wide, not a regression
        of this redesign. Three fixes offered, each touching brand, so it goes to
        the operator rather than being changed unilaterally.
  R-931 (Process & tooling, P4) felhom.eu serves NO compression at all - site.css
        goes over the wire as 94 310 raw bytes with no Content-Encoding even when
        gzip is offered. An nginx setting in manifests/, not a website change.
        Worth more than anything on this page.

Register: 127 -> 129 rows, 2 opened, 0 closed. register_shape_gate.py OK.
2026-10-10 22:12:47 +02:00
admin a818b9c576 website: the redesigned home page, staged at /preview/ (noindex)
gates / gates (push) Failing after 14m33s
Part C. The live home page is NOT touched: every CSS rule added is a new class
under .page-index, so index.html renders byte-for-byte as before.

website/preview/index.html  (BOM + CRLF, noindex, Disallow: /preview/)
  Ten sections, ten different layout families. The three repeats the audit found
  are gone: why-grid ran 3x and apps-showcase 2x.
    - hero: a real dashboard screenshot instead of the logo, sized by its content
      instead of a forced 100vh band, no infinite float animation, and a sentence
      made of four facts instead of "Professzionalis ... telepites es uzemeltetes".
    - the ten capability cards become three labelled clusters. Their TEXT is
      verbatim: the audit's own finding was that the writing is right and the
      layout is wrong, so only the layout moved. Every hedge ("ha van") survives.
    - NEW "Ki all mogotte" with the operator's photo and five approved sentences.
    - the 3 cloud-problem cards + the 4 own-server cards merge into ONE two-column
      comparison. No new claim about any competitor: all four left-hand sentences
      already existed on the page.
    - the two tile walls (10 + 7 tiles duplicating pages that already exist) shrink
      to a two-item band that keeps the app names and the links.
    - section headers are left-aligned and varied, not 11x centred-two-words-plus-
      one-blue-word.

  Em dashes in the page's own copy: 18 -> 0. Deliberately kept: the 6 in <title>,
  meta description, OG, Twitter and JSON-LD (operator decision at STOP 1 - indexed
  strings deserve their own pass), and 1 in the shared footer, which gate 3 requires
  to be identical across all 14 pages. Both stated, neither swept silently.

  JetBrains Mono is no longer fetched. Exactly 13 characters were loading 31 KB:
  the 1..5 process badges, the 01..05 service numbers, and - the audit missed this
  at first and it is corrected in the file - the 3/2/1 of the backup rule.

assets/operator-portrait.webp  720x900, 93 KB
  Cropped from an original that stays OUTSIDE this public repo. All metadata
  stripped and VERIFIED BY READ-BACK: 0 EXIF tags, 0 GPS IFD entries, and none of
  EXIF/XMP/ICCP/samsung/SM-A705FN/2023:10:18 appear anywhere in the bytes. Built by
  re-writing the pixels into a fresh image, so the source info dict cannot travel.
  Honest correction to the brief's premise: this photo had NO GPS tag to begin with.

scripts/site_gates.py
  preview/index.html registered in NO_TWIN, with the reason. It cannot go in TWINS:
  gate 3 wants its nav identical to index.html's (globe -> / and /en/) while the
  twin check wants a pair's globe pointing at the pair's own URLs. The English twin
  is written in the same commit as the switch, as a real twin. Everything else still
  runs on the preview - BOM, emoji, nav/footer, globe, analytics, CDN, tokens,
  cache-busting, dash-language, viewer, tail.

site_gates.py green. The builder (kept in the session scratchpad) writes BOM + CRLF
and asserts both: it first wrote LF and turned the nav/footer gate red for the
preview, which is exactly the trap this CHANGELOG's morning entry records.
2026-10-10 22:01:12 +02:00
admin fc52e3865e skills + audit: vendor taste-skill, add the Felhom override, audit the home page
gates / gates (push) Successful in 6m30s
Part 0 and Part A of the home-page redesign. Nothing under website/ is touched.

skills/
  - design-taste-frontend installed to ~/.claude/skills/ as a VERBATIM copy of
    github.com/Leonxlnx/taste-skill @ 717446e07a (2026-10-09, MIT). Body verified
    byte-identical line by line; the only addition is a provenance block. The repo
    holds scripts (skill.sh, scripts/*.mjs) but the SKILL FOLDER holds only SKILL.md,
    so no script was copied and none was run. Not installed via npx or skill.sh.
  - skills/felhom-web-design/SKILL.md is the override layer and names every conflict:
    the static-HTML stack fence (no React/Tailwind/Motion/npm), nothing fetched from
    another server (kills taste-skill's picsum/Unsplash/SimpleIcons ladder and its
    npm icon libraries, since we have a self-hosted sprite), real images only, the
    Hungarian gondolatjel surviving the en-dash ban, the claim rule, and the SEO-keep
    list. 137 lines, check_skills.py PASS.
  - SOURCES.md records the provenance and the kept/overridden table.

documentation/audits/redesign-2026-10-10/AUDIT.md
  Measured against the LIVE site, not the file. 12 patterns to retire (R1-R12), each
  naming the taste-skill rule it breaks; 7 to keep; dial reading 3/2/4 -> 6/3/4;
  8 levers in priority order for the operator to approve at STOP 1.

  Headline measurements: 10 922 px tall at 1440 and 19 913 px at 390 (23.6 phone
  screens); 11 sections but only 8 layout families, why-grid used 3x and
  apps-showcase 2x; 18 em dashes; 16 requests / 533 KB from exactly two hosts.
  Contrast measures 7.56:1 body and 16.67:1 headings - AAA, and an accessibility win
  to preserve rather than a thing to fix.

  Method note: resize_window does not move window.innerWidth on this workstation and
  DevTools device mode could not be driven, so the page was rendered in a same-origin
  iframe at each width. Faithful, with two positive observables: the hamburger
  computes to display:block at 390, and clientWidth == scrollWidth == 375.

Gates: site, hostinstall, hub-confirm, register and the rest green. instructions and
script-tests fail on this Windows workstation for environment reasons that predate
this change (E:\git\CLAUDE.md is the deliberate Windows adaptation the gate wants
identical; fcntl missing; relpath across C:/E:; the cp1250 console trap). Re-run on
DooPlex follows.
2026-10-10 21:32:40 +02:00
admin 8ef7c3a7e2 R-784 narrowed: the SparkyFitness author agreed (official images, EUR 1/household/month quarterly, 90 days' notice); closes when the operator's e-mail is sent
gates / gates (push) Successful in 6m18s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 20:36:56 +02:00
admin 86361a79c8 testers: the outreach kit, R-929 (the app count disagrees), STATUS and the report
gates / gates (push) Successful in 6m6s
OUTREACH.md: a personal message, a Facebook group post with a shorter variant,
a forum post, and a table of 15 places with the rules quoted where they are
published. Nothing was posted and no group was joined; the group data was read
from each group's public About page on 2026-10-10.

The rules that matter, measured rather than assumed: Magyar Linux Felhasznalok
(11970, public) has no advertising ban and Felhom is on topic; DIY Smart Home
forbids ads and names an e-mail route; HUP forbids unlicensed advertising; the
prohardver family forbids "tagok, vasarlok gyujtese ... felhivas" without the
operator's permission, which is literally what recruiting testers is.

R-929 (P4): the website's prose says 58 apps, the apps page renders 59 cards,
the catalog holds 60 template directories. Gate 15 cannot catch it because it
compares the two language sets to each other, never to the catalog. Not fixed
here - it needs the catalog skill's exclusion rules. The campaign posts say 58,
matching every prose claim on the site.
2026-10-10 16:25:25 +02:00
admin 5bea5f2ebf marketing + seo: the three-week tester campaign, schedule-post --link, the not-indexed audit
gates / gates (push) Successful in 6m15s
COPY.md section 7: five Hungarian posts for Tue/Thu 19:00 over three weeks, each
with a source comment per claim and one link. The Monday post (2026-10-12, 6.2)
is untouched and no slot shares its day.

fb_probe.py gains --link (default unchanged). Every scheduled post used to
attach the home page's preview card whatever its text said, so a post about
/teszteles would have sent the people who clicked its card to the home page.
build_parser() split out of main() so a test can parse argv. Red-proved: both
new tests fail with "Namespace object has no attribute link" without the flag.

Search Console audit (seo-2026-10-10/not-indexed.md): all seven not-indexed
URLs with a verdict each - four expected by design, two waiting on Google's
crawl queue, one fault on our side. That one is /api/contact, the contact
form's POST endpoint crawled as a page; robots.txt now disallows /api/. The
performance baseline (0 clicks, 47 impressions, position 73, nine queries) is
recorded there to compare against in a month.
2026-10-10 16:13:23 +02:00
admin 9d530b8f4a R-928 filed: concurrent gate runs in the shared clone see each other's decoy plants; register 126
gates / gates (push) Successful in 6m13s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 15:59:31 +02:00
admin a263061183 STATUS: the 2026-10-10 decision sheet (S1-S38, T1-T19) and the register-shrink report; R-903 live read-back
gates / gates (push) Successful in 5m55s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 15:57:06 +02:00
admin 92dc41638a website: a tester recruitment page, and test terms 1.1 (the domain)
gates / gates (push) Failing after 13m28s
New page pair /teszteles + /en/testing: who the closed test is for, what a
tester needs (machine + internet quoted verbatim from the FAQ, plus a domain),
what they get (terms section 3, nothing new), what we ask for, and how many
places there are. Every "Jelentkezem tesztelonek" button now goes there.

Operator rulings 2026-10-10, recorded in CONTEXT.md:
  D1 - the tester's domain is in the TESTER'S OWN name; Felhom pays its fee for
       two years and the tester keeps it when the test ends or they leave; DNS
       is managed with a token scoped to that one zone only.
  D2 - the closed test runs with at most 5 households.

Terms 1.1 adds section 4 (the domain) with the D1 text; old sections 4-11 are
renumbered 5-12 and nothing else changed. Section 11 promises the testers an
e-mail before a change, so one is drafted for the operator to send.

Registered in site_gates.py TWINS/URL and listed in sitemap.xml.
2026-10-10 15:47:15 +02:00
admin cf6fec8d87 hub (unreleased): the System page answers 'is anything wrong?' and 'is anything waiting for me?' first
gates / gates (push) Successful in 6m17s
Needs attention, Waiting for you (one card per kernel/Docker/Proxmox set the button may approve), a
7-column Boxes table whose rows open to every old value, and a closed Details (release ids, cancelled
approvals, ring-0 counts, floors, crash guard and root files, Approve now - which now asks first).
Same data, buttons, routes and CSRF field. No deploy. Screenshots in audits/hub-system-page-2026-10-10/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
2026-10-10 15:38:25 +02:00
admin ec5605d42c register shrink 2026-10-10: 13 rows closed with live evidence (138 -> 125); R-903 phone menu without JS; R-910 pictures; R-912 site gate 21
gates / gates (push) Successful in 6m4s
Closed: R-906 R-907 R-909 R-910 R-911 R-815 R-756 R-570 R-896 R-912 R-903 R-338 R-916.
Updated: R-899 (press set up, dated check 2026-10-11), R-243 (the mail is due 2026-10-11 ~16:06Z, dated check),
R-782 (homepage live; glance question to the operator), R-904 (the TLS sentence is in 01 s7).
Website: site.css v=9 (scripting:none menu), eight dashboard pictures retaken. Evidence: audits/register-shrink-2026-10-10/.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 15:27:59 +02:00
admin 9255d939e3 nodes.md: the update-harness bench (LXC 9401 on demo-hp) was in no document
gates / gates (push) Successful in 6m6s
A session that needs the swap-0 venue for checklist 5.1 had to find it with
pct list, and a brief this week placed it on the wrong host. Now recorded where
such facts live: which host, why swap is 0, that it is normally stopped, what it
keeps in /opt/upg between runs, and that its images are not pruned.
2026-10-10 14:50:35 +02:00
admin cf1e137129 R-887: three CI jobs lost today, all ending at :45:58 past the hour
gates / gates (push) Successful in 6m0s
1631 (catalog b7f0f7c), 1632 (felhom.eu 970616b7) and 1634 (felhom.eu 29c9cb1e):
every step failure with 0 s after 10.5-14 minutes in set-up, logs absent. A job
never picked up would end at an arbitrary second; the same second-of-the-hour
twice two hours apart points at a periodic sweep or a fixed deadline. Between
them the runner worked — catalog job 1633 succeeded normally on the same tree,
and a shallow clone with no sibling runs the catalog gates green by hand, so the
code is not what is red. The 2026-10-12 due-check's premise is false and the row
now says so.
2026-10-10 14:46:47 +02:00
admin 29c9cb1e9a new-apps report; Monica closed on the operator's word (R-927)
gates / gates (push) Failing after 10m32s
The operator was asked at the end, as the brief said, and ruled: keep Monica
out. R-927 opened and closed in the same session, with the measurements and the
sentence worth keeping — an app is not added because a gap exists, it is added
because the app can be kept. Register 137 -> 138: 2 opened, 1 closed.

Also in here: the two small things seen and not filed (remove leaves hold-logs
in the stack directory, with no secret in it; the catalog clone's pre-push hook
is unarmed, so the gates were run by hand before the commit and by CI after).
2026-10-10 14:34:47 +02:00
admin 970616b72b New apps 2026-10-10: Grocy and LubeLogger on the website; Monica stopped
gates / gates (push) Failing after 11m41s
The catalogue side is app-catalog-felhom.eu b7f0f7c. Here: the evidence, the
website, the register and the operator's view.

Website
- Two cards in the Otthon & Eletmod / Home & Lifestyle section of BOTH apps
  pages, with assets: grocy-logo.svg is grocy's own icon with its single fill
  made white like the other logos, lubelogger-logo.png is the app's own icon
  with its dark background dropped and the mark made white (the rule
  SparkyFitness's PNG follows), and six screenshots of each app's own UI with a
  household's own data, taken headless on the bench from the published template.
- The app count moved 56 -> 58 in 15 places per language set, both languages,
  and the open-source tile 49 -> 51. Checked by asking the same patterns for the
  new number afterwards. marketing/facebook/COPY.md still says 56 and is NOT
  changed: the post it carries is already scheduled.

Evidence
- documentation/audits/new-apps-2026-10-10/ — FIT.md (checklist group 0 for all
  three, with the Hungarian-UI column), the bench and box transcripts, the
  memory samples, the screenshots and the gate runs.

Register: 137 -> 139 rows, 2 opened, 0 closed.
- R-926 after a remove-keeping-backups and restore, nobody has checked what the
  app page shows for an after_install app's generated password. Measured here:
  LubeLogger is safe (its login is derived from the environment at every start,
  the new password signs in, the data is back); grocy's install password still
  signs in from the restored database but the deployed environment no longer
  carries ADMIN_PASSWORD at all. Seven apps are in the class.
- R-927 Monica, stopped at checklist 0.2 with the measurements, waiting on the
  operator.

Gate scripts: the same console trap in nineteen of them and in repo_gates.py
itself, where it ABORTED THE WHOLE RUNNER at the first gate — printing a
non-ASCII character on this workstation's cp1250 console raised
UnicodeEncodeError before the gate had decided anything, and reuse_refs_check.py
died while printing a NOTE. All now reconfigure their own streams. Red-proof
that the remaining script-test failures are not mine: test_due_checks_gate.py
fails the same 5 of 42 with the change reverted.
2026-10-10 12:34:05 +02:00
admin e0be6e7cd6 release 2026-10-10: CI runner restart (operator yes) evidence; report
gates / gates (push) Successful in 6m13s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 11:11:31 +02:00
admin a406efc7d5 release 2026-10-10: hub 0.145.0 deployed (security check PASS live), controller 0.305.0 delivered, kernel button offers -22; R-921/R-922 released; R-925 consequences; build skill: sync only the hub when other resources drift
gates / gates (push) Successful in 6m26s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 10:02:33 +02:00
admin ca9408f153 hub v0.145.0: the kernel approval rule (operator ruling 2026-10-10, 09 §3 decision 195) + release entry for the security fix, R-922, MAIL-HOLD
gates / gates (push) Successful in 6m3s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 09:27:54 +02:00
admin ca584d30b6 kernel night 9→10 read back: demo-hp 7.0.14-22 (~3.5 min down), demo-felhom 7.0.14-23 (~65 s), no false alarm, Approve kernel set not shown (boxes on different kernels)
gates / gates (push) Successful in 5m53s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
2026-10-10 07:36:10 +02:00