fix(webui): E2E round 6, live edits survive refresh, org page layout, decision refusals (#1873) #1961

Merged
jason.woltje merged 3 commits from f6w into refactor 2026-11-14 02:12:30 +00:00
Owner

WebUI fixes from E2E round 6 (#1873). Tester reports: e2e-r6-webui-report.md (0/3/15) and e2e-r6-cli-report.md (0/0/7, handled by the separate CLI lane). Brief: E2E6-FIX-BRIEF.md, lane f6w. Only packages/webui/src/** and packages/webui/tests/** change. No bus, cli, organization, roles, contracts or schema change. Schema stays 3w. 22 files, +672/-76.

P1 fixes:

  • P1-1. An open workflow editor, a dirty autonomy form, or a pack's picked project, preview and status keeps its live node across the 10 s poll and a mosaic-org-changed repaint (workspace.js holdLive/graftLive). Focus and caret survive. Buttons and links come back through data-focus-key. A failed read keeps an open editor and a dirty form. A clean form shows the error.
  • P1-2. decision-http.mjs maps every hire, fire and change refusal the start can return to its own code and a next step, not outcome-unknown 503. Codes that only prepare() or the route check can raise say "Nothing was applied." Codes the apply step can also raise after the decision is consumed say part of it may already be applied and to check the Agents page. outcome-unknown is kept for no reply and the bus server's own request codes.
  • P1-3. Autonomy, Starter packs and Workflows move to a full-width .ws-wide block below the split. At 1440 the split goes from 2113 px to 670 px tall. About 336 px of gap is left under Queue. A balanced split would close it and is a follow-up.

P2 fixes: unknown workflow role named (1); Apply redraws Workflows, Autonomy and board and the receipt survives the next poll (2); preview wraps at word boundaries (3); "Invalid decision answer" names the field and rule (4); org Queue section gives the refusal reason (6); a stopped bus reads "bus stopped", not a failure (8); pane container queries stop Settings clipping (9); Model spend wording (10); project header no longer overflows (11); tab strip fades while more tabs lie past it (12); header buttons line up (13); focus kept across refresh (14); onboarding bubble renders inline code (15). P2-5 is CLI (lane f6c). P2-7 is a tester setup gap: the setup script never ran project create or project init. P2-14 was a hidden legacy card.

Tests: new org-live-edit-browser (4) and e2e6-layout-browser (7), decision-http +5, chat-replies-browser addition. Each was shown red on BASE src. The s8-header and s9-reflow pins held Settings at x=1418, which was the P2-11 overflow itself. They now measure from the scrollbar edge per route. Lane gate: 199 webui files, 1527/0.

Lead check under env -i on this head (176 files: touched tests, importers of every touched src basename, refusal, redact, rename-b, project-runtime and schema tests, without v1 and agents probes): 2051/0 plus 4 environment skips (Quick Setup scratch fixture).

Reviews (fresh Opus 5.5 delegates): the review of 0c35eeed9 found one P2 and five P3s, and all were fixed in 266f3a45f. The re-check found finding 1's wording still pointed at the inbox, which lists no closed decision, and added three P3s. 23b5e24eb fixes the wording and P3-b and P3-c. The Lead read that last diff (refusal wording, autonomy focus keys, read-error handling) and accepted it.

Follow-ups:

  • refusals.mjs lacks hire-start codes decision-http words itself: project-agents-invalid, organization-unknown-instance, organization-instance-exists, definition-rev-conflict, definition-missing, organization-refused.
  • Re-check P3-a: the bus should mark whether a hire refusal came before or after the decision was consumed, so the WebUI can word it exactly.
  • The 336 px gap under Queue at 1440 (balanced split).
  • The E2E setup script should run project create and project init.
WebUI fixes from E2E round 6 (#1873). Tester reports: `e2e-r6-webui-report.md` (0/3/15) and `e2e-r6-cli-report.md` (0/0/7, handled by the separate CLI lane). Brief: `E2E6-FIX-BRIEF.md`, lane f6w. Only `packages/webui/src/**` and `packages/webui/tests/**` change. No bus, cli, organization, roles, contracts or schema change. Schema stays 3w. 22 files, +672/-76. P1 fixes: - P1-1. An open workflow editor, a dirty autonomy form, or a pack's picked project, preview and status keeps its live node across the 10 s poll and a `mosaic-org-changed` repaint (workspace.js holdLive/graftLive). Focus and caret survive. Buttons and links come back through data-focus-key. A failed read keeps an open editor and a dirty form. A clean form shows the error. - P1-2. decision-http.mjs maps every hire, fire and change refusal the start can return to its own code and a next step, not outcome-unknown 503. Codes that only prepare() or the route check can raise say "Nothing was applied." Codes the apply step can also raise after the decision is consumed say part of it may already be applied and to check the Agents page. outcome-unknown is kept for no reply and the bus server's own request codes. - P1-3. Autonomy, Starter packs and Workflows move to a full-width `.ws-wide` block below the split. At 1440 the split goes from 2113 px to 670 px tall. About 336 px of gap is left under Queue. A balanced split would close it and is a follow-up. P2 fixes: unknown workflow role named (1); Apply redraws Workflows, Autonomy and board and the receipt survives the next poll (2); preview wraps at word boundaries (3); "Invalid decision answer" names the field and rule (4); org Queue section gives the refusal reason (6); a stopped bus reads "bus stopped", not a failure (8); pane container queries stop Settings clipping (9); Model spend wording (10); project header no longer overflows (11); tab strip fades while more tabs lie past it (12); header buttons line up (13); focus kept across refresh (14); onboarding bubble renders inline code (15). P2-5 is CLI (lane f6c). P2-7 is a tester setup gap: the setup script never ran `project create` or `project init`. P2-14 was a hidden legacy card. Tests: new org-live-edit-browser (4) and e2e6-layout-browser (7), decision-http +5, chat-replies-browser addition. Each was shown red on BASE src. The s8-header and s9-reflow pins held Settings at x=1418, which was the P2-11 overflow itself. They now measure from the scrollbar edge per route. Lane gate: 199 webui files, 1527/0. Lead check under `env -i` on this head (176 files: touched tests, importers of every touched src basename, refusal, redact, rename-b, project-runtime and schema tests, without v1 and agents probes): 2051/0 plus 4 environment skips (Quick Setup scratch fixture). Reviews (fresh Opus 5.5 delegates): the review of 0c35eeed9 found one P2 and five P3s, and all were fixed in 266f3a45f. The re-check found finding 1's wording still pointed at the inbox, which lists no closed decision, and added three P3s. 23b5e24eb fixes the wording and P3-b and P3-c. The Lead read that last diff (refusal wording, autonomy focus keys, read-error handling) and accepted it. Follow-ups: - refusals.mjs lacks hire-start codes decision-http words itself: project-agents-invalid, organization-unknown-instance, organization-instance-exists, definition-rev-conflict, definition-missing, organization-refused. - Re-check P3-a: the bus should mark whether a hire refusal came before or after the decision was consumed, so the WebUI can word it exactly. - The 336 px gap under Queue at 1440 (balanced split). - The E2E setup script should run `project create` and `project init`.
jason.woltje added 3 commits 2026-11-14 02:12:23 +00:00
P1-1 an open workflow editor, a dirty autonomy form and a pack's picked project keep their
node, draft and focus across the 10-second poll and an org-changed repaint.
P1-2 decision-http names the refused field and keeps the bus code and detail.
P1-3 long editors span the full width below the org page split.
P2-1 workflow roles resolve as definitions, templates and human; P2-2 a pack apply re-reads
workflows, autonomy and board and keeps its receipt; P2-3 pack preview fits its column;
P2-4 unknown project, agent or harness say so instead of outcome-unknown; P2-6 a stopped bus
reads "bus stopped"; P2-8 Queue says why it is unavailable; P2-9 pane settings values are not
clipped; P2-10 spend wording; P2-11 project header stays in its column; P2-12 project tabs
fade at the edge until scrolled to the end; P2-13 Restart bus and Stop bus line up in panes;
P2-15 backticks in chat text render as code.
Minor: Same-as commands wrap between words; harness checkboxes share a row.
Tests: org-live-edit-browser, e2e6-layout-browser, chat-replies and decision-http additions.
Review finding 1: a hire start refusal the apply step can also raise after the decision is
consumed (decision-stale, organization-instance-*, organization-refused, definition-missing,
invalid-request and the rest) no longer says "Nothing was applied". It says that part may be
applied when the inbox shows the proposal as answered, and to check Agents first. Only codes
that prepare() or the route checks alone raise keep "Nothing was applied".
Review P3: a failed workflows or autonomy read keeps the last good read, so an open editor or
a dirty form stays through it. Focus holds a section only in a field being typed in; a focused
button is rebuilt and gets focus back by data-focus-key. Autonomy has Discard changes. The
project tab fade is 0px when every tab fits.
s8 and s9 header pins at 1440 now measure from the content edge: 1418 was 100vw-based, ran
under the page scrollbar and is the P2-11 clipping itself.

Correction to the previous commit's message: P1-2 is the unknown project, agent or harness
wording; P2-4 names the refused field; P2-6 is the Queue refusal reason; P2-8 is "bus stopped".
Re-check finding 1 (P2): the wording for refusals that can come after the
decision is consumed told the user to look for the proposal "as answered"
in the inbox and otherwise read "nothing was applied". The bus inbox lists
no closed decision, so a consumed one drops out of it and the user would
read the false claim. Those codes now say only that part of it may already
be applied and to check the Agents page. decision-http tests assert no
"nothing was applied" in any case and no inbox pointer for those codes.

Re-check P3-b: the autonomy controls (Save, Discard, notices, review
summary and buttons) carry data-focus-key, so a focused button in a clean
form gets its focus back after the poll repaints the section.

Re-check P3-c: a failed autonomy read keeps the last read only while the
page holds the form (dirty, or focus inside it). A clean form shows the
read error. org-live-edit-browser test 4 covers both.

Re-check P3-a (harness-off after the consume through a corrupt prior
settings file) is deferred: wording it exactly needs the bus to mark the
phase on the refusal.
jason.woltje merged commit 23b5e24ebc into refactor 2026-11-14 02:12:30 +00:00
Sign in to join this conversation.