SCA-2009: feat(omi-tv): spend reader for the settled spend table (shadow)
Merged
GI
1d ago+321+321+012345678901234567890123456789-0-0-0123456789
Requested by David
What changed and why
Omi TV PR3, a shadow reader for the settled spend table. It adds web/admin/lib/wall-spend.ts, the Omi TV reader for omi_finops.spend_daily:
- a daily query that dedupes to the latest run and filters to settled inputs;
- typed day rows that keep missing sums as
nullrather than zero; - a 2026-11-04 all-in parity check;
- the two Revenue tile metrics: listen $ per audio-hour, and variable cost per paying user per month.
Nothing on the board reads it yet. It is wired in only after the table is populated and the parity check passes.
How it was verified
After merging current main and resolving the FinOps allowlist conflict (retaining margin_meter_hourly and both spend tables):
npm test -- lib/__tests__/wall-spend.test.ts lib/__tests__/admin-finops-grants.test.ts: 20/20 pass.- ESLint on all three PR files: pass.
npm run typecheck: pass.make preflight: all 18 selected checks pass.- Full repository pre-push hook: pass without skip hatches.
The reader remains shadow-only; #24945 must rebase onto main after this PR lands. Table grants and populated-table parity remain prerequisites for wiring.
UI evidence
UI-Evidence: none -- library module only; not wired to any dashboard view.
Failure class (fixes)
Failure-Class: none
🤖 Generated with Claude Code