The audit · why this is not a repaint

What the page is
actually doing.

Measured from the running service and the real snapshot data, not from memory. The dashboard answers one question — what needs me today — and everything else on it is either evidence for that or clutter. Right now it does not take a position on which is which.

Measured

It is nine screens long on a phone.

MeasureNow
Page height, desktop at 1280px4,943px — 5.5 screens
Page height, phone at 390px7,331px — 8.7 screens
Real opens, 11 retained days82 across ten days (1–20/day)
Anomaly excludedone 453-hit day — a tab left open
Requests from an iPhone123 of 535

Opens measured from the Caddy access log, excluding the page’s own background refreshes and keeping only real browser navigations. An earlier figure I had quoted was wrong; this replaces it.

Information architecture

Answer, evidence, or clutter.

SurfaceShowsRows nowDuplicated elsewhereVerdict
TODAY railkind chip, title, detail, fix-prompt, done / snooze / dismiss12 items (8 live, capped at 5 + “3 more”; 4 commitments)Yes, extensivelyAnswer
At a glanceActive 11, Needs attention 3, Shipped 2, snapshot age4 cellsPure rollup of the board’s own chipsEvidence
Project boardname, status, last activity, live dot, cron OK/FAIL, next action22 projects across 7 status sectionsNext action duplicated in Recent Work; cron FAIL in Automation; attention reason in TODAYEvidence
Ask your chief of stafffree-text input and answer0 rows until usedNoneClutter
Obligationstitle, note, due chip0 — permanently emptyBoth real reminders are overdue and correctly shown in TODAY insteadClutter
Recent worknext per project (12), recently active (13), taskboard todos (0)25 rows“Next per project” wholly duplicates the board’s next-action columnMixed
Automationfailing / total / OK / flapping / unchecked, plus lists~71 jobsBoth failing jobs duplicate TODAY rail rowsEvidence
Money3 lines and an equity sparkline3 linesNoneEvidence
Infraload, disk %, up/down, down-host list2 of 52 hosts downDown hosts duplicate TODAY rail rowsEvidence
Twinsper-twin last feed, sleep, today6 linesNoneClutter*

* Twins is the only non-work signal on the page. It is clutter relative to the page’s stated question, which is an argument for changing the question rather than cutting the panel — your call.

The reason it is so long

One failure, rendered four times.

The Concord cron failure appears as a project attention chip, as the project’s next action, as a TODAY rail row, and as an Automation failing row. Four renderings of one fact. The Broven and Money Ideas flags do the same. And manual.next is duplicated wholesale for 12 of 22 projects — the “next per project” list in Recent Work is the same text as the next-action column on the board above it.

One panel can never show anything

The Obligations panel always renders “no upcoming obligations”. Both real reminders are overdue — by 38 and 35 days — and overdue items are filtered out before the panel is fed. It occupies space in order to say nothing. I would cut it rather than restyle it.

The page contradicts itself about one host

The Agent Store project reports its URL status as unknown for brovenhq.com, while the Infra panel independently reports that same host as down. Two different answers about one host, on one page. That is the class of bug the honesty affordances exist to prevent, so it gets fixed rather than carried across.

Generated but never rendered

What must survive the redesign

Thirty-three honesty affordances.

Each of these exists because the dashboard previously lied in that exact way. The visual language is entirely replaceable; these behaviours are not. A redesign that makes them prettier but quieter is a regression.

BehaviourInstancesWhat it saysPinned by a test?
Evidence verdicts7 placesunasserted / no-evidence-source / fresh / confirmed / aging / stale — only commits strictly after an assertion count as confirming itYes — whole-file coverage
Blind-spot warnings8 places“Root crontab not readable — production crons unmonitored”, “Systemd timers not readable”, and a Blind spots list on the railYes
Flapping3 places“N flapping” and “last run passed, but N failure runs in the recent log”; counted out of the healthy total at a threshold of 3 episodesData logic only — no render test
Unchecked ≠ healthy2 places“N unchecked” chips, excluded from the healthy count whenever a job’s status is nullData logic only — no render test
Panel error states5 places“Unavailable — {error}” badges, a distinct “Source broken” state, and money showing unreadable rather than a fabricated $0.00None
Staleness5 places“Updated N ago” turning amber past 90 minutes; 48-hour stale thresholds on the ledger and twins feedsNone
Phantom automation new1 place“Declared automation X matches no cron job or systemd timer — it may not exist.”Yes
Snooze fails open new1 placeA snooze whose expiry cannot be read re-opens the item rather than hiding it foreverYes
Reserved status green new1 placeThe OK green is reserved for real status only — the decorative masthead dot is explicitly forbidden from using itNone

The test suite would not catch losing any of them

There are no component tests in the repository at all — not one .test.tsx file. All 214 passing tests cover data logic underneath the UI. The flapping chip, the unchecked chips, the blind-spot header, the “source broken” state and every “unavailable” badge could be dropped in a rewrite and the suite would stay green.

So the first act of the build is to write those tests against the current design and watch them pass. Only then does the visual language get replaced. That turns the suite into a real gate instead of a green light.

Status colours, as meanings

Every hex value changes with the direction. The meanings carry over intact, including the rule reserving the status green for real status only — the decorative masthead dot is explicitly forbidden from using it.

TokenMeaning
okactive, on-time, up — reserved for real status
warnpaused, hold, staleness, flapping
alertneeds attention, down, failing
infoshipped
ideaidea, not started
idleidle, parked, archived
pinpinned — deliberately not a status

Personal HQ redesign review · 8 August 2026 · built from branch worktree-redesign-2026-08-08. Nothing here is deployed; the live dashboard is untouched.