בס״ד

#043 — Unified Operating Map (Sam + Mildred)

docs/PROJECT_043_UNIFIED_OPERATING_MAP.md · last changed (pre-VM history) · rendered from GitHub master

#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.htmlbut 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)

  1. 🎯 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.
  2. 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).
  3. 💵 Money lane — obligations due in the next 7 days + pay-from account.
  4. 📅 Calendar lane — today + next 3 days (respect the 10:30 AM davening block + Shabbos).
  5. 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)

⚠️ 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)

  1. Worker endpoint GET /operating?as=<role> → aggregates Queue + Obligations + Calendar into ONE role-filtered JSON.
  2. Server-side role filter honoring the Mildred-boundary.
  3. The "One Next Best Action" ranker (P0 + bumper + money-impact weight).
  4. Operating Map view in home.html, scoped by ?as=, reusing the shared engine.
  5. 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.

Source trail · docs/PROJECT_043_UNIFIED_OPERATING_MAP.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view