fix(webui): pane ids and task board conflict reopen (#1873) #1910

Merged
jason.woltje merged 5 commits from org-polish1 into refactor 2026-11-10 22:26:46 +00:00
Owner

Two webui fixes from the U4b and U5 reviews (#1873).

  1. Side-by-side panes: the project requirements page drew project-request-select, project-north-star and project-prd twice when both panes showed it. mountContent now takes an idPrefix. Panes pass pane-a- and pane-b-, the same form the dashboard uses. The full view keeps its ids. A new browser test opens the same page in both panes for seven pages. It asserts no duplicate id, and that every for, aria-* and in-page href resolves inside its own pane.
  2. Task board conflict: on task-conflict the old form showed the refusal and re-enabled Save while the board re-read, so a second save could go out with the old digest. Now the old form shows Reading the current task… with every button disabled. The refusal appears only with the reopened current task. A reload that lost to a poll falls back to reading the task itself. A task that is gone shows a could-not-be-read status with only Cancel enabled. A dialog closed during the read stays closed.

Two test-only commits fix the pre-existing flaky layout-reload test (20 runs in a row green).

Lane: Opus. Gate on c3c192677: 418/0, including tasks-board-browser 10 runs at 18/0, run while another seat's browser suite loaded the host. Review: Sol, one P2 (a dialog closed during the read reopened empty), fixed with the reviewer's repro as a test. Deferred: an Archive conflict still shows the refusal on the old form, and a reopen onto a read-only view loses the refusal text.

Two webui fixes from the U4b and U5 reviews (#1873). 1. Side-by-side panes: the project requirements page drew `project-request-select`, `project-north-star` and `project-prd` twice when both panes showed it. `mountContent` now takes an `idPrefix`. Panes pass `pane-a-` and `pane-b-`, the same form the dashboard uses. The full view keeps its ids. A new browser test opens the same page in both panes for seven pages. It asserts no duplicate id, and that every `for`, `aria-*` and in-page `href` resolves inside its own pane. 2. Task board conflict: on `task-conflict` the old form showed the refusal and re-enabled Save while the board re-read, so a second save could go out with the old digest. Now the old form shows `Reading the current task…` with every button disabled. The refusal appears only with the reopened current task. A reload that lost to a poll falls back to reading the task itself. A task that is gone shows a could-not-be-read status with only Cancel enabled. A dialog closed during the read stays closed. Two test-only commits fix the pre-existing flaky layout-reload test (20 runs in a row green). Lane: Opus. Gate on c3c192677: 418/0, including tasks-board-browser 10 runs at 18/0, run while another seat's browser suite loaded the host. Review: Sol, one P2 (a dialog closed during the read reopened empty), fixed with the reviewer's repro as a test. Deferred: an Archive conflict still shows the refusal on the old form, and a reopen onto a read-only view loses the refusal text.
jason.woltje added 5 commits 2026-11-10 22:26:39 +00:00
The requirements page drew project-request-select, project-north-star
and project-prd with fixed ids, so the same project in both panes put
each id in the document twice. mountContent takes the pane's idPrefix
(pane-a-, pane-b-) and every id and id lookup on the page follows it;
the full view passes none and keeps its ids.

The dashboard was already prefixed and the Agents page draws no ids.
A new browser test opens the same dashboard, Agents page and project
pages in both panes and checks for duplicate ids and for labels, ARIA
references and in-page links that leave their pane.
A product race, not only a test race. On task-conflict the dialog wrote
the refusal into the old form, turned its buttons back on and only then
read the current task. For the length of that read the form showed the
refusal beside the old task and a Save went out against the old digest.
The conflict test read the title in that window and failed under load.

The old form now stays disabled with "Reading the current task…" until
the read answers; the refusal and the reopened form appear together. A
read a poll overtook no longer reopens on the board's old read; the
dialog reads the task itself. If the task cannot be read the form keeps
only Cancel and takes no save. A dialog closed during the read stays
closed, and a form whose Save is disabled refuses a submit sent past it.
The wait after location.reload() could pass on the board that was
unloading, and the next read then found no board (seen once in ten
runs under load). A mark set before the reload goes with the old page,
so the wait now passes only on the reloaded one.
Review fix. dialog.close() clears `open` at once but queues the close
event that empties the dialog. A conflict read that resumed in between
still found the old form connected and reopened the dialog, and the
queued event then emptied it: an open modal with nothing in it. The
check is now the dialog's own `open` state and that it still holds the
form. A browser test closes the dialog and releases the read's body in
one task; it fails on the previous commit.
The mark from the previous commit kept the wait off the old page, but
the wait could still start on it and be killed by the reload
("Inspected target navigated or closed", once in ten runs). navigate()
waits for the load; a query makes the same URL load again.
jason.woltje merged commit c3c192677d into refactor 2026-11-10 22:26:46 +00:00
Sign in to join this conversation.