#043 — Unified Operating Map (Sam + Mildred)
Spec written: 2026-06-08 · remote-control session · for the portal/ops-api session to build (NOT this session's lane; NOT MIS-frozen).
Card: Action_Queue #043 (P2) — "ONE always-current view both Sam AND Mildred see + know what to do."
The problem (Sam's words)
The pieces exist — Action_Queue, the Mildred weekly briefing, the morning brief, the portal home.html — but there is no single shared live map that both Sam and Mildred open and instantly know what matters and what's theirs to do. Today it's scattered across a sheet, an email, and a portal page.
Design principle — DON'T build a new surface
Extend the existing canonical home.html (Grand Central) with one Operating Map view, role-scoped via the existing ?as= mechanism (?as=sam / ?as=mildred). Reuse hs-core.js + hs-theme.css. One source of truth, not a new doc. This avoids the sprawl the 6/8 strategic brief flagged as the #1 engineering criticism.
What the one screen shows (role-scoped)
- 🎯 ONE Next Best Action (header) — the single ranked answer for this viewer, not a list. (This is the monetizable "cockpit" differentiator the brief named as [missing].) Ranker = P0 first · nearest bumper/due · money-impact.
- Open loops — Action_Queue cards, P0/P1 first, each with: owner (Sam/Mildred), status, next action, bumper/due. Tap → DONE/DEFER/PROOF (reuses the engine).
- 💵 Money lane — obligations due in the next 7 days + pay-from account.
- 📅 Calendar lane — today + next 3 days (respect the 10:30 AM davening block + Shabbos).
- Two columns: Sam: what's mine + what I'm waiting on Mildred for · Mildred: my assigned cards + what I'm waiting on Sam for. Same underlying map, different highlight.
Data sources (all live, via the Worker — already proxied)
- Action_Queue + Action_Events — Personal Command Inbox sheet
1U0-Ll_WDDiYPuzXRnkISGfUTWxOpWQgz3gprQvAcXNU - Monthly Obligations sheet
1L_rxCSOncM6WtqCYaEbooNdxiXbfOi_Sfm7k0IAAsBo - Google Calendar (MCP / iCal feeds)
⚠️ Privacy / Mildred-boundary (HARD — locked)
?as=mildred MUST hide wife / mother / family / private-dates cards and any OFF-LIMITS row (feedback_mildred_scope_model, user_private_dates). ?as=sam sees all. Role filter runs server-side in the Worker, never client-side hiding.
Build steps (portal/ops-api session)
- Worker endpoint
GET /operating?as=<role>→ aggregates Queue + Obligations + Calendar into ONE role-filtered JSON. - Server-side role filter honoring the Mildred-boundary.
- The "One Next Best Action" ranker (P0 + bumper + money-impact weight).
- Operating Map view in
home.html, scoped by?as=, reusing the shared engine. - Mildred's weekly briefing email links into this view (so the email becomes a pointer to the live map, not a separate artifact).
Acceptance
Sam and Mildred each open the same scoped URL and see, in <5s and always-current (no manual refresh, no separate doc): what matters now + their single next action. Closes the "we have pieces but not the one shared map" gap.
Boundary note
This spec is handoff to the portal/ops-api session. It touches home.html / ops-api (their lane) and the Command Inbox engine — NOT MIS (frozen) and NOT this session. Build there.