Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
6.8 KiB
REPORT — the hub's System page, made readable (2026-10-10)
Before: 3 cards plus one box table with 30 columns that scrolled sideways. Release ids, cancelled TEST approvals and package counts came first. The red „Approve now (guest + host)" sat in the middle of the page. After: 4 parts, in this order:
- Needs attention.
- Waiting for you.
- Boxes: one 7-column table. Each row opens in place.
- Details: closed by default.
No sideways scroll at 1280 px or at 390 px (measured: scrollWidth == clientWidth at both widths).
Released as hub 0.146.0 on the operator's word („Release the new hub version", 2026-10-10). No box touched.
Baseline
felhom.eumain@ec5605d4aftergit pull --rebase. The last hub release inhub/CHANGELOG.mdis v0.145.0.- Architecture read:
05-hub-architecture.md§5 (floors, vouched agent),11-os-updates.md§5.7, §5.8 and §5.11 (System page, lanes, kernel approval),08-alarm-ladder.md§6.3 (the colours).
What changed
hub/internal/web/system_view.go(new) is the view model:buildSystemPagetakes all the inputs and is pure, so the fixture can feed it.summariseRowmakes the box mark and the plain-words reasons, from the same cell colours as before.buildWaitingmakes the cards, with the same gate the buttons always had: a set exists, it is not approved, and nothing is waiting.
hub/internal/web/system.go: the handler fillssystemInput. It now also reads the controller version per box (GetCustomers). It reads the candidate package list and the healthy-night count, both only to describe a card.hub/internal/web/templates/system.html: the new layout and its page CSS. It uses the hub's colour tokens. The nav wraps on a phone (this page's CSS only).- Docs:
05(a short paragraph) and11§5.7 (the new layout).hub/CHANGELOG.md: an „Unreleased" entry.
Where each old item went (the Baselines contract)
| Old item | Now |
|---|---|
| Flash / error line | unchanged, at the top |
| Per box: the 30 columns, the ring button, the updates switch | Boxes: the row opens to all of them. Ring, health, controller + agent, OS updates, kernel and last night are also in the row |
| Approved releases (ids, packages, by, TEST) | Details |
| „Approve now (guest + host)" | Details, beside the releases. It now asks: „Approve the guest and host sets now, without the usual 24 h and one night?" |
| Cancelled approvals (last 7 days) | Details |
| What ring 0 runs now (counts, first seen, the wait reason) | Details. A set still being tested is also listed under Waiting for you, with the hub's reason |
| Approve Docker / Proxmox / kernel set | Waiting for you: one card each, when the button is allowed |
| Version floors, global floor, vouched agent | Details (the #version-floors link opens it) |
| kernel.panic, oops, crash restarts, crash guard, root files | in each box's row, and also as a table in Details |
| Legend („unknown" = could not read, never a guess) | under the Boxes title |
Same routes and the same _csrf field on every form. Clicking to open works without JavaScript (<details>).
Tests
go build ./... && go vet ./... && go test ./...inhub/: rc 0.python3 scripts/repo_gates.py --fast: rc 0.- Pushed as
cf6fec8d. CI job 1643 (matched onhead_sha):completed, conclusion success. - New file
system_layout_test.go. Each test below was red-proofed: I broke the code on purpose and saw the test fail.- Every old item is still on the page. Red: I dropped the containerd line →
Boxes lacks ">containerd</dt>". - Every form carries
_csrfand posts only to the old routes. Red: I removed_csrffrom a card →form /os/approve-pve lacks the CSRF or return field. - Needs attention: a green box is not listed; amber and red boxes are, with reasons; all green gives one line. Red: I
skipped the cells →
the amber box (agent behind) is missing. - Waiting for you: a card per lane, the not-ready line, nothing once approved, guest/host never a card, and the empty
line. Red: I dropped the wait gate →
kernel not ready: cards [...]. - Approve now is inside Details and asks first.
- Every old item is still on the page. Red: I dropped the containerd line →
- Changed old assertion:
system_trim_test.gonow looks for>Last disk trim</dt>(it was</th>). The label moved from a table header into the box panel.
Screenshots (made-up fixture shaped like today: 4 boxes, kernel approved, Docker still testing, Tester 2 „unknown")
All are in documentation/audits/hub-system-page-2026-10-10/. They were taken with a headless Chromium in the
scratchpad, from system-fixture*.html. Those pages are written by SYSTEM_PAGE_FIXTURE_OUT=<dir> go test ./internal/web/ -run TestSystemPage_WriteFixture.
01-1280.png— the page at 1280 px.02-390.png— the page at 390 px (phone).03-1280-details-open.png— Details open.04-1280-box-open.png— one box (Tester 1) open.05-1280-waiting-card.png— a Proxmox set ready, as a card with its button.
Not done / notes
- Guest and host sets get no card: they approve themselves. Their urgent override („Approve now") is in Details.
- The flash after an approval still says
approved <release id>. That text comes from the/os/route, not from this page, so I left it. - Teardown: provisioned nothing. No machine, no host, no hub change.
Release (hub 0.146.0)
- Version commit
9fbdee83(CHANGELOG heading). Imagegitea.dooplex.hu/admin/felhom-hub:0.146.0, digestsha256:c31ffdd8…. Manifest commit2db785da. - ArgoCD after a hard refresh: OutOfSync on
Deployment/huband on three Secrets (gitea-creds,healthchecks-config,umami-config) andDeployment/umami. So I synced onlyDeployment/hub(the runbook's R-925 rule). The others are untouched. Sync phaseSucceeded; app healthHealthy. - The pod runs
felhom-hub:0.146.0, ready. Its log:felhom-hub 0.146.0 starting,Listening on :8080. - Live check through the ClusterIP with the operator's Basic auth (the endpoint the browser calls):
GET /system→ 200. All four parts are there; 4 boxes open in place; 9 forms, each with_csrf. Today's real page: 4 boxes amber (three „root files behind the vouched agent's"; Tester 2 „needs a restart since 2026-10-04", „agent behind 0.142.0 → 0.150.0", „could not read: default kernel, root files"). „Nothing waits for your approval." The Docker 29.9.0-1 and Proxmox 9.2.21 sets are still being tested (1 of 2 healthy nights on demo-felhom). - No button was pressed.
Questions for the operator
- Look at the five screenshots. Is the order right (problems first, then approvals, then boxes)? OK, or what to change?
- Tester 2 („agent older than v0.142.0") shows red for „agent behind" plus three amber reasons. Do you want an old agent as one line only, or is the full list useful?