a215cd3 fix(billing): cap metering batch size to 500 6ecd72a test(integration): api contract tests against fixtures c4ddbd2 fix(utils): logger drops circular references safely 3d51ee1 feat(billing): credit notes for refund flows 0ce7a54 chore: prettier + eslint config alignment 01a008f fix(ui): Modal scroll lock on iOS Safari 02b93f2 feat(api): conditional requests with ETag support 9bf6e8c docs(api): OpenAPI examples for error envelope 775d8e9 fix(auth): session fixation on privilege elevation 47e957f refactor(utils): consolidate validation error shapes 4e34a27 feat(billing): usage-based metering hooks 7d22c00 fix(api): normalize trailing slashes in routes 14feeb1 test(unit): property tests for currency utils 4dfc386 feat(ui): skeleton loading states for Table 278af1b fix(billing): webhook replay protection window 18ca4ab chore(scripts): idempotent migrate script with lock f688636 feat(auth): device fingerprint on suspicious login 88f787d fix(ui): debounce search input to 250ms 3195979 refactor(billing): isolate tax calculation behind interface ef118ee feat(api): pagination cursors for list endpoints fe69766 fix(auth): rotate refresh tokens on every use 6b7fa8d docs: architecture decision record for queue choice e29fca6 feat(utils): structured logger with redaction rules c101644 fix(api): stream large responses instead of buffering f258e18 test(integration): checkout happy path with mocked gateway 5281d61 feat(billing): dunning email schedule after failed charge d123c49 fix(ui): Form validation message i18n keys d7c9a65 chore: bump dependencies and fix lockfile drift e62afb7 feat(ui): Table column sorting with stable comparator 2826e7a refactor(api): split error mapping from transport layer