# Senior Court Monitor (Mobile) — Cross-Role Handoffs

> The cross-role touchpoints this role fires into / receives from. The Senior Monitor is a **producer of submissions** (into the approval cascade) and a **receiver of send-backs** — exactly like the anchor (Staff Court Monitor). It never approves (`PROJECT_PLAN §3`). The one extra is a **read-only consumer** of the zone monitors' submission read-model (the Team / Zone status view). Cascade mechanics live in `FOUNDATION_SPEC §4`.

---

## Upstream input (what arrives at the Senior Monitor)

| From | Trigger | What the Senior Monitor receives | Surfaces on |
|---|---|---|---|
| **Store Manager / Team Leader** | Roster **published** (`SM-ROSTER-PUBLISH` / `TL-ROSTER`) | Auto-assign fires → `ChecklistInstance`s for Karan's roster entry (role + certified ride + shift → templates; e.g. Trampoline Daily + Opening if opener) | `SCM-DASH`, `SCM-CHK-TODAY` + a `ROSTER_PUBLISHED` notification |
| **Team Leader / Store Manager / Operation Head** | **Send-back** at any approval step (`TL-CHK-VERIFY` / `SM-CHK-APPROVE` / `OH-CHK-APPROVE`) | Instance state → `SENT_BACK`, with the reject reason. Returns to **Karan, the original filler** (§9 #3) — not the previous approver | `SCM-CHK-STATUS` (red banner + Re-fill) + a `SENT_BACK` notification (FCM + in-app) |
| **Staff Court Monitors in the zone (read model)** | Those monitors fill/submit their own checklists | A **read-only** roll-up of their instances + statuses (no actionable handoff — pure visibility) | `SCM-TEAM-STATUS` + the `SCM-DASH` Team-status card |

## Downstream output (what the Senior Monitor fires)

| To | Trigger | What fires | Lands on |
|---|---|---|---|
| **Team Leader (Priya)** | Karan **submits** a checklist (`SCM-CHK-SUBMIT` → `POST …/submit`) | Instance state → `SUBMITTED`; `ApprovalStep` rows (TL/SM/OH) created; **TL notified** (FCM + in-app). The TL's verify queue gains this instance | `TL-CHK-VERIFY` / `TL-CHK-OVERVIEW` + a notification to Priya |
| **Up the chain (derived)** | submission climbs the cascade | While not yet OH-approved, the instance reads **Pending** to TL/SM/OH per their level (derived, L8); the Senior Monitor still sees the real sub-state | `OH-DASH` / `*-CHK-OVERVIEW` Pending counts |
| **Reports (roll-up)** | items recorded | Karan's **G** items feed the Positive report; **A** items + their issue photos feed the Negative report (per ride/shift/day/Game Zone) | `*-REP-POSITIVE`, `*-REP-NEGATIVE` (TL/SM/OH packs) |
| **Overdue escalation** | `now() > dueAt` and not submitted | Instance → `OVERDUE`; escalates up the chain | `*-REP-OVERDUE`, dashboards |

> **The Team view fires nothing.** It is a pure read of the zone monitors' submissions; the Senior Monitor cannot approve, send back, reassign, or edit from it. Any action on those instances stays with the cascade owners (TL → SM → OH).

## The closed loop (mirrors the anchor end-to-end)

```
SM publishes roster ──auto-assign──▶ SCM-CHK-TODAY (Karan: Trampoline Daily)
        ▲                                    │ fill G/A + completion photo + per-A photo
        │ send-back (to Karan)               ▼ submit  ──notify──▶  TL verify queue (Priya)
   SCM-CHK-STATUS  ◀───────────── (any approver rejects)               │ approve
   (red banner, Re-fill)                                               ▼
                                                          SM approve ─▶ OH approve = DONE
                                            (until OH approves, everyone above sees PENDING)

   SCM-TEAM-STATUS  ◀── read-only roll-up of the zone's Staff Court Monitors' submissions
                        (visibility only — no approve, no send-back, no edit)
```

## Contract notes for the BE dev
- The **submit** handler is the single producer-side touchpoint: on success it (1) transitions state, (2) creates the 3 `ApprovalStep`s, (3) enqueues the TL notification (FCM fan-out to Priya's `DeviceToken`s + an in-app `Notification`). Implement once; the TL pack consumes the queue. (Identical to the anchor — share the handler.)
- The **send-back** handler (TL/SM/OH packs) must set `state=SENT_BACK` and notify the **original `fillerId`**, not the previous approver — the Senior Monitor pack only *reads* this outcome via `/me/notifications` + `/me/submissions`.
- The **Team-view read model** (`GET /me/team/checklists/today`) reuses the same `renderStatusForViewer()` used by the manager overviews, but with the SCM viewer (not an approver → never resolves to "Pending"). Grant SCM a `checklist.view` permission scoped `own_team`; **deny** `checklist.approve`. Do not expose any write endpoint to SCM on team instances — the resolver returns 403.
- Do **not** expose any approve/sendback endpoint to SCM — the resolver denies it (403). This pack consumes none of them.
