Sub-issue of #565 (master: HydraNPS end of experience rating). Full design on #565. This issue is Phase 4: hydraheadipad.
Scope:
- HydraNPSClient (nps_url/nps_token from head config); session id mint; stream start timestamp in AppState
- Pending rating captured in AppState.stopStream() only for the visitor exit path (the exit action sheet in HydraStreamSession.m), with expiry
- Card as SwiftUI ZStack sibling in ContentView, .zIndex(14), NOT a .sheet (blank black screen bug, ContentView.swift:81-83); styled like OperatorPinView per docs/design/rating-card.md; portrait + landscape; cap the wait on notifyStreamStopped before showing the card
- Bounded UserDefaults queue (50), flushed on heartbeat and at launch
Verify: testbook step 8 rating flow + step 9 regression (mic enabled exit); remote check via admin screenshot (window.drawHierarchy captures the card).
Depends on: hydranps and hydracluster sub-issues.