Goal
Create the shared metering contracts used by producers, worker logic, and blocking.
Deliverables
- add the shared metering module in Apollo
- implement the global metering registry
- define typed event contracts
- implement producer-side validation
- add shared errors and logging hooks
- expose helpers for:
track_metered_usage()check_metering_limit()assert_metering_allowed()
Estimate
2-3 engineering days
Completed (2026-03-30)
Shipped in Apollo (branch plen-1835-build-shared-metering-module-and-global-registry):
- Shared
apps/apollo/src/lib/metering/module: registry, per-entity definitions, validation,prepareMeteringEvent,trackMeteredUsage(validate → dual-write to ClickHousemetering_events_raw+ Stripe Billing meter events whenstripe_customer_idis present) deliverDirectMeteringEventToClickHouseAndStripe— failures logged, non-blocking for request pathscheduleStandaloneToolCallMetering—waitUntil+ org Stripe lookup +trackMeteredUsagefor post-success tool execution (wired fromexecute_tool)- Isolated Vitest:
vitest.isolated-unit.config.ts, scriptpnpm test:unit:isolated— unit tests for deliver, track, scheduler - Docs: metering +
src/libCLAUDE updates
Not in this slice (follow existing tickets): aggregate-backed checkMeteringLimit / blocking enforcement (PLEN-1837, PLEN-1838); durable outbox + off-Vercel worker (PLEN-1834). Producer tracking API MVP is in place.