@suluk/credits — a metered credit ledger (C046, extracted verbatim). The package OWNS the schema (credit_transaction
the credit_amount/credit_key sidecars); the app injects a Drizzle handle (D1 in prod, bun:sqlite in tests). The
money-correctness core: the ATOMIC debitIfCovers (a conditional INSERT that can't drive the ledger negative under
concurrency) + the idempotent debitOnceIfCovers (the partial-refund double-spend guard) + per-key spend + the
activity-log query. App-specific payment-alert kinds + the user-table count stay in the app.
Attribute a debit row to the API KEY that spent it (per-key usage + limit join). Best-effort + idempotent (PK on
txnId) — attribution is reporting, NOT the money path, so a failure here must never break the debit it rode in on.
@suluk/credits— a metered credit ledger (C046, extracted verbatim). The package OWNS the schema (credit_transactioncredit_amount/credit_keysidecars); the app injects a Drizzle handle (D1 in prod, bun:sqlite in tests). The money-correctness core: the ATOMICdebitIfCovers(a conditional INSERT that can't drive the ledger negative under concurrency) + the idempotentdebitOnceIfCovers(the partial-refund double-spend guard) + per-key spend + the activity-log query. App-specific payment-alert kinds + the user-table count stay in the app.