The audit · why this is not a repaint
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.
| Measure | Now |
|---|---|
| Page height, desktop at 1280px | 4,943px — 5.5 screens |
| Page height, phone at 390px | 7,331px — 8.7 screens |
| Real opens, 11 retained days | 82 across ten days (1–20/day) |
| Anomaly excluded | one 453-hit day — a tab left open |
| Requests from an iPhone | 123 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.
| Surface | Shows | Rows now | Duplicated elsewhere | Verdict |
|---|---|---|---|---|
| TODAY rail | kind chip, title, detail, fix-prompt, done / snooze / dismiss | 12 items (8 live, capped at 5 + “3 more”; 4 commitments) | Yes, extensively | Answer |
| At a glance | Active 11, Needs attention 3, Shipped 2, snapshot age | 4 cells | Pure rollup of the board’s own chips | Evidence |
| Project board | name, status, last activity, live dot, cron OK/FAIL, next action | 22 projects across 7 status sections | Next action duplicated in Recent Work; cron FAIL in Automation; attention reason in TODAY | Evidence |
| Ask your chief of staff | free-text input and answer | 0 rows until used | None | Clutter |
| Obligations | title, note, due chip | 0 — permanently empty | Both real reminders are overdue and correctly shown in TODAY instead | Clutter |
| Recent work | next per project (12), recently active (13), taskboard todos (0) | 25 rows | “Next per project” wholly duplicates the board’s next-action column | Mixed |
| Automation | failing / total / OK / flapping / unchecked, plus lists | ~71 jobs | Both failing jobs duplicate TODAY rail rows | Evidence |
| Money | 3 lines and an equity sparkline | 3 lines | None | Evidence |
| Infra | load, disk %, up/down, down-host list | 2 of 52 hosts down | Down hosts duplicate TODAY rail rows | Evidence |
| Twins | per-twin last feed, sleep, today | 6 lines | None | Clutter* |
* 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 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.
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 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.
projects.nextUp — five entries produced every snapshot; nothing has
rendered them since the TODAY rail replaced that lanememoryWrittenAt, cron.jobs, and the updatedAt
stamps on money, twins and recent workdescription — rendered on mobile, silently dropped on desktopEach 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.
| Behaviour | Instances | What it says | Pinned by a test? |
|---|---|---|---|
| Evidence verdicts | 7 places | unasserted / no-evidence-source / fresh / confirmed / aging / stale — only commits strictly after an assertion count as confirming it | Yes — whole-file coverage |
| Blind-spot warnings | 8 places | “Root crontab not readable — production crons unmonitored”, “Systemd timers not readable”, and a Blind spots list on the rail | Yes |
| Flapping | 3 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 episodes | Data logic only — no render test |
| Unchecked ≠ healthy | 2 places | “N unchecked” chips, excluded from the healthy count whenever a job’s status is null | Data logic only — no render test |
| Panel error states | 5 places | “Unavailable — {error}” badges, a distinct “Source broken” state, and money showing unreadable rather than a fabricated $0.00 | None |
| Staleness | 5 places | “Updated N ago” turning amber past 90 minutes; 48-hour stale thresholds on the ledger and twins feeds | None |
| Phantom automation new | 1 place | “Declared automation X matches no cron job or systemd timer — it may not exist.” | Yes |
| Snooze fails open new | 1 place | A snooze whose expiry cannot be read re-opens the item rather than hiding it forever | Yes |
| Reserved status green new | 1 place | The OK green is reserved for real status only — the decorative masthead dot is explicitly forbidden from using it | None |
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.
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.
| Token | Meaning |
|---|---|
| ok | active, on-time, up — reserved for real status |
| warn | paused, hold, staleness, flapping |
| alert | needs attention, down, failing |
| info | shipped |
| idea | idea, not started |
| idle | idle, parked, archived |
| pin | pinned — 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.