model-usage: the vendor-neutral usage store (ADR 0054) #17

Merged
jschoubben merged 1 commits from feat/usage-store into main 2026-09-07 02:08:22 +00:00
Owner

The home ADR 0050 left open for a usage reading. mesh-control is a CLI and cannot consume events, so the store that keeps the current usage picture is a module — the audit-logger's sibling: it consumes module.*.usage.* and upserts each reading into its own provisioned postgres store, latest per (licence, consumer, period, metric), in the clear. One vendor-neutral table holds both grains; they differ only in consumer (the holding module for the licence grain, the session for the finer one). The consumer creates its table on startup and, as a restart-until-ready service, self-heals rather than gating the apply on a run-once that must reach a provider over the overlay.

The vendor→row normalisation moves into the adapter, as ADR 0054 requires: anthropic-manager (licence grain, utilization%) and anthropic-consumer (session grain, token/cost) now emit already-normalised { rows: UsageRow[], raw } on their existing keys, so the store stays vendor-blind.

Proven end to end by the mesh-lab model-usage bed (green).

The home ADR 0050 left open for a usage reading. mesh-control is a CLI and cannot consume events, so the store that keeps the current usage picture is a **module** — the audit-logger's sibling: it consumes `module.*.usage.*` and upserts each reading into its own provisioned postgres store, latest per `(licence, consumer, period, metric)`, in the clear. One vendor-neutral table holds **both grains**; they differ only in `consumer` (the holding module for the licence grain, the session for the finer one). The consumer creates its table on startup and, as a restart-until-ready service, self-heals rather than gating the apply on a run-once that must reach a provider over the overlay. The vendor→row normalisation moves into the adapter, as ADR 0054 requires: anthropic-manager (licence grain, `utilization%`) and anthropic-consumer (session grain, token/cost) now emit already-normalised `{ rows: UsageRow[], raw }` on their existing keys, so the store stays vendor-blind. Proven end to end by the mesh-lab model-usage bed (green).
jschoubben added 1 commit 2026-09-07 02:08:09 +00:00
The home ADR 0050 left open for a usage reading. mesh-control is a CLI and
cannot consume events, so the store that keeps the current usage picture is a
MODULE — the audit-logger's sibling: it consumes `module.*.usage.*` and upserts
each reading into its own provisioned postgres store, latest per
(licence, consumer, period, metric), in the clear. One vendor-neutral table
holds BOTH grains; they differ only in `consumer` (the holding module for the
licence grain, the session for the finer one). The consumer creates its table
on startup and, as a restart-until-ready service, self-heals rather than
gating the apply on a run-once that must reach a provider over the overlay.

The vendor->row normalisation moves into the adapter, as ADR 0054 requires:
anthropic-manager (licence grain, utilization%) and anthropic-consumer (session
grain, token/cost) now emit already-normalised { rows: UsageRow[], raw } on
their existing keys, so the store stays vendor-blind.

Proven end to end by the mesh-lab model-usage bed (green): a usage event
emitted into the mesh is upserted at both grains, latest-per-key, in the clear.

Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
jschoubben merged commit 4cc1b976f5 into main 2026-09-07 02:08:22 +00:00
jschoubben deleted branch feat/usage-store 2026-09-07 02:08:22 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-catalog#17