Report · 2 September 2026
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.
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.
Collapsing is a layout change. Nothing was dropped.
| Signal | Why it exists | Closed row | Open 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 on | yes — moved here | — |
| Red setup flags (No CRM account yet · No number → default brain) | a caller is affected right now | yes | — |
| 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 call | a 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 total | yes | (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.
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:
held is not painted red. A held email is a switch on somebody's desk blocking every submitted client at once; it is counted once, in red, at the top of the page. Painting every held row red would make the whole board red for one decision.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.
| Check | Result |
|---|---|
| Rows drawn | 51 (50 + the demo) — none open on load |
| Page height, all closed | 5,764 px — about six screens |
| Page height, all open (the old page) | 16,153 px — about eighteen screens |
| Tab to a name, press Enter | opens; aria-expanded flips to true |
| Press Space | closes again |
| Open two rows, reload | the same two are open |
| Open two rows, press Refresh | the same two are open |
| Open all / Close all | 51 open / 0 open; the remembered set follows |
| Rows painted red at fifty | 18 in the seed (5 failed, 5 stuck, 8 red-flagged) — each with its word on the closed row |
Rows named xyz or pdf | 0 |
| 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.
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.
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.
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.
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.
dashboard/watch.html — the collapse; the head comment carries the reasoningapi/watch/index.js — test firms filtered off the boardtest/watch-board.test.mjs — 8 new checks (the button, the default, the head/panel split, the red edge, no signal lost, the test firms)