SCA-2009: feat(omi-tv): spend reader for the settled spend table (shadow)

Merged
GI
1d ago
+321-0

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 null rather 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