feat(webui): one Inbox for the whole system, answers pinned to the row's organization (#1873) #1967

Merged
jason.woltje merged 3 commits from sp3-inbox into refactor 2026-11-15 08:14:29 +00:00
Owner

One Inbox for the whole system (#1873, lane sp3). Third slice of the single-pane direction.

What changes for a person:

  • #/inbox lists what needs a person across every organization that answers, newest first. Each row has its organization chip and a project chip when the item has one.
  • Filters by organization and by decision class live in the hash query, so a reload keeps them.
  • Answering a row posts to that row's organization, never to the one opened last. "Open in " goes to the item in its own organization.
  • A stopped organization is named at the top as not read, with the reason.
  • The dashboard's Needs you tile and card and the sidebar count come from the same read and the same order.
  • #/orgs/<id>/inbox still works and shows that organization's items, with the hire form.

How: WebUI only (workspace.js, bus.js, display.js, app.js, shell.css). It uses the existing GET /api/workspace?sections=inbox and the existing per-organization decision routes. No new route, no role, contract or schema change.

Bug found on the way: the answer check read routed_to, a field the broker never sends (it sends route_to). Fixed, and the new test's fixture now mirrors the broker row.

Tests: new tests/system-inbox-browser.test.mjs (10 tests), red first. Lane gate 106 files, 892/0. Lead check at 3885f4628: 11 WebUI files one at a time, the new file twice, 111/0.

Reviews (fresh Opus 5.5 delegates): review 1 asked for six changes, all handled. Review 2 approved with three P3, all fixed. Two fixes came after review 2 and were read by the Lead instead: #/inbox keeps the system theme, and the hire checks run before the answer panel so a render can't paint over a confirm step. The second has no deterministic test.

Follow-ups:

  • The filter is by decision class, not the prototype's Decisions / Questions / Receipts / System. No read classifies items that way.
  • Fixtures in three older browser tests still carry routed_to.
  • The sidebar count can go stale if every bus stops, has no sequence guard, and blanks for a moment on an organization switch.
  • The dashboard card shows the five newest, so an older gated item can be off the card while still counted.
One Inbox for the whole system (#1873, lane sp3). Third slice of the single-pane direction. What changes for a person: - `#/inbox` lists what needs a person across every organization that answers, newest first. Each row has its organization chip and a project chip when the item has one. - Filters by organization and by decision class live in the hash query, so a reload keeps them. - Answering a row posts to that row's organization, never to the one opened last. "Open in <org>" goes to the item in its own organization. - A stopped organization is named at the top as not read, with the reason. - The dashboard's Needs you tile and card and the sidebar count come from the same read and the same order. - `#/orgs/<id>/inbox` still works and shows that organization's items, with the hire form. How: WebUI only (`workspace.js`, `bus.js`, `display.js`, `app.js`, `shell.css`). It uses the existing GET `/api/workspace?sections=inbox` and the existing per-organization decision routes. No new route, no role, contract or schema change. Bug found on the way: the answer check read `routed_to`, a field the broker never sends (it sends `route_to`). Fixed, and the new test's fixture now mirrors the broker row. Tests: new `tests/system-inbox-browser.test.mjs` (10 tests), red first. Lane gate 106 files, 892/0. Lead check at 3885f4628: 11 WebUI files one at a time, the new file twice, 111/0. Reviews (fresh Opus 5.5 delegates): review 1 asked for six changes, all handled. Review 2 approved with three P3, all fixed. Two fixes came after review 2 and were read by the Lead instead: `#/inbox` keeps the system theme, and the hire checks run before the answer panel so a render can't paint over a confirm step. The second has no deterministic test. Follow-ups: - The filter is by decision class, not the prototype's Decisions / Questions / Receipts / System. No read classifies items that way. - Fixtures in three older browser tests still carry `routed_to`. - The sidebar count can go stale if every bus stops, has no sequence guard, and blanks for a moment on an organization switch. - The dashboard card shows the five newest, so an older gated item can be off the card while still counted.
jason.woltje added 3 commits 2026-11-15 08:14:26 +00:00
#/inbox lists every answering organization's decisions from the one GET /api/workspace read, newest
first, each row with its organization chip and a project chip when it has one. Organization and
type filters live in the hash query. A stopped organization is named at the top with its reason.
An answer from the list reads and posts to the row's own organization (/api/orgs/<org>/...), never
the one opened last, and each item can be opened in its own organization. #/orgs/<id>/inbox is the
same list filtered to that organization. No server route was added.
jason.woltje merged commit 3885f4628b into refactor 2026-11-15 08:14:29 +00:00
Sign in to join this conversation.