Report · 2 September 2026

S19 — The watch board: click the company name, the detail drops down

For: Ken, Dil, Beth · Page: bookedsolidinspector.com/watch.html · Branch: claude/s15-watch-html-improvement-ymrwna · Date: 2026-09-02

Ken asked for it twice: "You push the button and it opens up to see the detail. So probably you would just see the account name. Push the button, the details drop down, then you push the button, details go back up." That is what the page does now. Every account starts closed. The company name is the button. Click it, the detail drops down. Click it again, it goes back up.


1 · What a closed row shows, and why

A closed row shows the company name, the contact, the stage badge, the pills, the next-action line, and any red setup flag. Everything else — the progress bar, the eleven section chips, the one-line summary, the nine-step go-live rail, the amber flags — is the detail, and lives in the panel that opens.

The judgement call was the next-action line. A row that shows only a name forces fifty clicks to find the one account that needs a person; a row that shows everything is the scroll Ken is complaining about. The next-action line is the one sentence the server already computes that says what the account is waiting on — Do next / Blocked / Broken / Complete / Waiting — and that is exactly the signal that tells you which row to open. It was already there, under the rail; it only moved up. Red flags come with it because red means a caller is affected right now, and that cannot hide inside a closed row. Amber flags (get to it before go-live) are detail, so they went into the panel.

2 · Every existing signal survived — where each one lives now

Collapsing is a layout change. Nothing was dropped.

SignalWhy it existsClosed rowOpen panel
Stage badge (Live / Submitted / Submitted · gaps / In progress / Stuck / Not started / Demo)"are they done? where are they stuck?" (Dil, 2026-08-25)yes—
Next-action line (Do next / Blocked / Broken / Complete)the one sentence saying what the account waits onyes — moved here—
Red setup flags (No CRM account yet · No number → default brain)a caller is affected right nowyes—
Amber setup flags (Running on built-in seed · No portal login)get to it before go-live—yes
Progress bar + "N of 9 required · N of 2 optional"the counter that replaced the eleven-green-squares strip—yes
Eleven section chips, optional drawn as outlined (optdone) vs dashed (skipped), red ring on the stuck card"saying which is which is the whole fix"—yes, unchanged
Go-live rail, nine steps with dates"a guide of the workflow" (Dil, 2026-09-01)—yes, unchanged
"Josh has answered on it" with call count and last calla mapped number is not a working number (Ken, 2026-09-01)—yes, it is a rail step, untouched
The email-actually-fired signal (Welcome email sent · Agreement sent, with held in its own colour)the board was wrong about the held email twice—yes, rail steps, untouched. And "Waiting on an email" still counts in red at the top of the page for everybody
One-line form summary—yes
Demo row marked "Demo — not a client", out of every totalyes(no journey to show)

The collapsed row does not carry a miniature of the chip strip — that would recreate the eleven-green-squares problem in small. It carries words, not squares.

The booking panel Dil removed on 2026-08-25 is not back. Nothing about bookings was added.

3 · What happens to a broken account when it is closed

It is painted red — a red edge down the left and a red border — and it stays closed. Broken means: a go-live step that never ran (failed), a form the client is stuck on, or a red setup flag on an account that has at least started. The closed row already carries the word — the BROKEN or STUCK tag with the sentence beside it — so you can see what is wrong without opening it.

I chose colour over auto-open on purpose. Ken asked for collapsed by default with no exceptions, and a row that keeps springing open is a row people learn to ignore. Two deliberate exclusions:

4 · The walkthrough at fifty rows

Seeded fifty accounts in the shapes the server actually sends (live, do-next, held, failed, stuck, not-started, plus the demo) and drove the page in headless Chromium.

CheckResult
Rows drawn51 (50 + the demo) — none open on load
Page height, all closed5,764 px — about six screens
Page height, all open (the old page)16,153 px — about eighteen screens
Tab to a name, press Enteropens; aria-expanded flips to true
Press Spacecloses again
Open two rows, reloadthe same two are open
Open two rows, press Refreshthe same two are open
Open all / Close all51 open / 0 open; the remembered set follows
Rows painted red at fifty18 in the seed (5 failed, 5 stuck, 8 red-flagged) — each with its word on the closed row
Rows named xyz or pdf0
Mobile (390 px)name wraps, button still the name, panel opens under it

The company name is a real <button> with aria-expanded and aria-controls, so Enter, Space and a screen reader work without a keydown handler. The portal's accelerant cards need one because they are divs; a real button gets it free. Open/closed state is stored in this browser under watch_open, keyed by slug, only for the rows that are open — a fresh browser, a cleared one and an account never seen before all start closed. Open all and Close all were added beside the Accounts heading; at fifty rows a person will want both.

Screenshots (fifty rows): /reports/s19-watch-50-collapsed.png and /reports/s19-watch-50-open.png.

Added the same afternoon: filter and sort

Dil, looking at the live board: "right now it's scattered. What if we only like to see those that are completed or non completed or pending." Above the list there are now five chips, each with a count: All · Needs attention · Live · In progress · Not started. Beside them a sort: needs attention first (the default: broken rows, then blocked, then do-next, then waiting, then live), by stage (not started through to live), or A to Z. Both are remembered in your browser, like open and closed rows.

A filter hides rows. It never changes the numbers at the top of the page, which still count every account. "Needs attention" uses exactly the rule that paints a row red, so the two cannot disagree.

5 · How the page is served, and what it took to make Ken's URL show it

Proxied to the app. curl -I https://bookedsolidinspector.com/watch.html returns X-Powered-By: Express, and the live file was byte-identical to dashboard/watch.html on main. So a merge to main deploys this page; there is no copy step into /var/www/bookedsolid/. The 2026-07-23 note in CLAUDE.md saying the domain is static is stale — the decisions log already says so (2026-08-03).

So the one thing needed is the merge. Until this branch is on main, Ken's URL shows the old page.


⚠️ Found on the way: the two test firms were ON the watch board

The brief said xyz and pdf "are filtered by isTestFirm(slug)" on this page. They were not — api/watch/index.js never imported it. The build board and the CRM note knew about the test firms; the watch board did not. They went in through the real form on purpose, so they have real records, real held emails and real gaps — which means, if their records are on the data branch, they have been sitting on Ken's board as two client rows and counted in every total, "Waiting on an email" included.

Fixed in the same change: the watch board now drops them from the rows, the totals and What's new, the same way it drops our own internal test accounts. test/watch-board.test.mjs pins it.

Not found

The brief's read-first list names Owner's Inbox/2026-09-02-work-split-into-sessions.md. That file does not exist on main. The nearest is 2026-09-01-josh-consistency-work-split-into-sessions.md, which does not mention this board. I read that one and went ahead, because nothing in this task depended on it — saying so here rather than guessing that it was the same document.

Files