Skip to content

feat(bss-ledger): billing ledger gear, SDK, coord lease lib, and design docs#5

Closed
diffora wants to merge 2 commits into
mainfrom
bss/ledger
Closed

feat(bss-ledger): billing ledger gear, SDK, coord lease lib, and design docs#5
diffora wants to merge 2 commits into
mainfrom
bss/ledger

Conversation

@diffora

@diffora diffora commented Jul 6, 2026

Copy link
Copy Markdown
Owner

Summary

Adds the Billing Ledger gear (bss-ledger) — the transactional posting foundation plus its handler slices (invoice posting, audit/immutability/observability, payments & allocation, ASC 606 recognition, adjustments/notes/refunds, FX & multi-currency, reconciliation & period-close) — together with the bss-ledger-sdk contract crate, the shared coord lease library, and the full design set (PRD, design slices 01–07, ADR-0001, 41 migrations).

Foundation gaps closed against the design audit

  • Clock-skew posting gate (±15 min warn / ±24 h CLOCK_SKEW_QUARANTINE).
  • tenant_posting_lock pre-transaction kill switch (TENANT_POSTING_LOCKED).
  • DB-level currency_scale immutability trigger (defense-in-depth beyond the app check).
  • Allocation size bound moved onto the invoices a split actually touches (configurable via payments.max_invoices_per_allocation), so a large open-invoice backlog no longer blocks a small payment.

Design reconciled with shipped code

  • Post-v1 deferrals marked (journal partitioning, the REVOKE immutability layer, event_outbox/event layer, the ERP/GL export half of slice 7).
  • NOTE_INVOICE_NOT_FOUND and IMMUTABLE_FINANCIAL_FIELD/ATTRIBUTE_NOT_MUTABLE retired to match the platform CanonicalError model; lockedRead described as the implemented SERIALIZABLE/SSI ordering.

Tests & E2E wiring

  • Crate-level full-flow integration tests (provision → post → read → reverse → tie-out; settle / allocate / return through the real in-process client + Postgres).
  • pytest black-box E2E module under testing/e2e/gears/bss/ledger.
  • Gear wired into cf-gears-example-server as an opt-in cargo feature (like account-management): optional dep + bss-ledger feature + registered_gears link + config/e2e-features.txt + a SQLite entry in config/e2e-local.yaml. Dropped the event-broker gear dep (no such gear in this repo; the event layer is a no-op), which otherwise makes the gear unschedulable.

Test status

  • cargo check -p bss-ledger: clean.
  • Crate unit + SQLite + Postgres (testcontainers) suites: green locally, incl. the new clock-skew / tenant-lock / scale-immutability / allocation-cap tests.
  • E2E: make e2e-local E2E_TARGET=testing/e2e/gears/bss/ledger → server boots with the gear mounted, 25 seam tests pass.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 475 files, which is 325 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: da4db384-23c1-48d4-85b2-06bdf410a1bf

📥 Commits

Reviewing files that changed from the base of the PR and between 322a01f and befa68f.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (475)
  • .cf-studio/config/artifacts.toml
  • Cargo.toml
  • apps/cf-gears-example-server/Cargo.toml
  • apps/cf-gears-example-server/src/registered_gears.rs
  • config/e2e-features.txt
  • config/e2e-local.yaml
  • deny.toml
  • gears/bss/ledger/docs/ADR/0001-cpt-cf-bss-ledger-adr-book-ownership-predicate.md
  • gears/bss/ledger/docs/PRD.md
  • gears/bss/ledger/docs/design/01-repository-foundation.md
  • gears/bss/ledger/docs/design/01a-invoice-posting.md
  • gears/bss/ledger/docs/design/02-audit-immutability-observability.md
  • gears/bss/ledger/docs/design/03-payments-allocation.md
  • gears/bss/ledger/docs/design/04-asc606-recognition.md
  • gears/bss/ledger/docs/design/05-adjustments-notes-refunds.md
  • gears/bss/ledger/docs/design/06-fx-multicurrency.md
  • gears/bss/ledger/docs/design/07-reconciliation-export.md
  • gears/bss/ledger/docs/design/README.md
  • gears/bss/ledger/ledger-sdk/Cargo.toml
  • gears/bss/ledger/ledger-sdk/src/api.rs
  • gears/bss/ledger/ledger-sdk/src/bill_run_finished.rs
  • gears/bss/ledger/ledger-sdk/src/close.rs
  • gears/bss/ledger/ledger-sdk/src/enums.rs
  • gears/bss/ledger/ledger-sdk/src/error.rs
  • gears/bss/ledger/ledger-sdk/src/error_tests.rs
  • gears/bss/ledger/ledger-sdk/src/issued_invoice_manifest.rs
  • gears/bss/ledger/ledger-sdk/src/lib.rs
  • gears/bss/ledger/ledger-sdk/src/posting.rs
  • gears/bss/ledger/ledger-sdk/src/provisioning.rs
  • gears/bss/ledger/ledger-sdk/src/psp_settlement_feed.rs
  • gears/bss/ledger/ledger-sdk/src/rate_provider.rs
  • gears/bss/ledger/ledger/Cargo.toml
  • gears/bss/ledger/ledger/schemas/billing_ledger_credit_note_posted.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_debit_note_posted.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_dispute_recorded.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_entry_posted.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_entry_reversed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_fx_revaluation_completed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_fx_revaluation_reversed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_invariant_alarm.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_manual_adjustment_posted.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_period_closed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_reconciliation_completed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_refund_recorded.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_revenue_recognition_reversed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_revenue_recognized.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_schedule_changed.v1.schema.json
  • gears/bss/ledger/ledger/schemas/billing_ledger_settlement_returned.v1.schema.json
  • gears/bss/ledger/ledger/src/api.rs
  • gears/bss/ledger/ledger/src/api/local_client.rs
  • gears/bss/ledger/ledger/src/api/local_client_tests.rs
  • gears/bss/ledger/ledger/src/api/rest.rs
  • gears/bss/ledger/ledger/src/api/rest/adjustments.rs
  • gears/bss/ledger/ledger/src/api/rest/approvals.rs
  • gears/bss/ledger/ledger/src/api/rest/audit.rs
  • gears/bss/ledger/ledger/src/api/rest/audit_tests.rs
  • gears/bss/ledger/ledger/src/api/rest/auth_context.rs
  • gears/bss/ledger/ledger/src/api/rest/canonical_json.rs
  • gears/bss/ledger/ledger/src/api/rest/closure.rs
  • gears/bss/ledger/ledger/src/api/rest/control.rs
  • gears/bss/ledger/ledger/src/api/rest/credit.rs
  • gears/bss/ledger/ledger/src/api/rest/disputes.rs
  • gears/bss/ledger/ledger/src/api/rest/dto.rs
  • gears/bss/ledger/ledger/src/api/rest/dto_tests.rs
  • gears/bss/ledger/ledger/src/api/rest/error.rs
  • gears/bss/ledger/ledger/src/api/rest/error_tests.rs
  • gears/bss/ledger/ledger/src/api/rest/exceptions.rs
  • gears/bss/ledger/ledger/src/api/rest/fx.rs
  • gears/bss/ledger/ledger/src/api/rest/fx_revaluation_mode.rs
  • gears/bss/ledger/ledger/src/api/rest/journal_entries.rs
  • gears/bss/ledger/ledger/src/api/rest/journal_entries_tests.rs
  • gears/bss/ledger/ledger/src/api/rest/payers.rs
  • gears/bss/ledger/ledger/src/api/rest/payments.rs
  • gears/bss/ledger/ledger/src/api/rest/posting_policy.rs
  • gears/bss/ledger/ledger/src/api/rest/provisioning.rs
  • gears/bss/ledger/ledger/src/api/rest/recognition.rs
  • gears/bss/ledger/ledger/src/api/rest/reconciliation.rs
  • gears/bss/ledger/ledger/src/api/rest/refunds.rs
  • gears/bss/ledger/ledger/src/authz.rs
  • gears/bss/ledger/ledger/src/authz_tests.rs
  • gears/bss/ledger/ledger/src/config.rs
  • gears/bss/ledger/ledger/src/config_tests.rs
  • gears/bss/ledger/ledger/src/domain.rs
  • gears/bss/ledger/ledger/src/domain/adjustment.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/credit_note.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/credit_note_tests.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/debit_note.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/debit_note_tests.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/manual.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/manual_tests.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/refund.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/refund_tests.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/splitter.rs
  • gears/bss/ledger/ledger/src/domain/adjustment/splitter_tests.rs
  • gears/bss/ledger/ledger/src/domain/allocate.rs
  • gears/bss/ledger/ledger/src/domain/approval.rs
  • gears/bss/ledger/ledger/src/domain/approval/intent.rs
  • gears/bss/ledger/ledger/src/domain/approval/intent_tests.rs
  • gears/bss/ledger/ledger/src/domain/approval/policy.rs
  • gears/bss/ledger/ledger/src/domain/approval/policy_tests.rs
  • gears/bss/ledger/ledger/src/domain/approval_tests.rs
  • gears/bss/ledger/ledger/src/domain/audit_chain.rs
  • gears/bss/ledger/ledger/src/domain/audit_chain_tests.rs
  • gears/bss/ledger/ledger/src/domain/canonical.rs
  • gears/bss/ledger/ledger/src/domain/chain.rs
  • gears/bss/ledger/ledger/src/domain/chain_tests.rs
  • gears/bss/ledger/ledger/src/domain/error.rs
  • gears/bss/ledger/ledger/src/domain/exception.rs
  • gears/bss/ledger/ledger/src/domain/exception_tests.rs
  • gears/bss/ledger/ledger/src/domain/fx.rs
  • gears/bss/ledger/ledger/src/domain/fx/realized.rs
  • gears/bss/ledger/ledger/src/domain/fx/realized_tests.rs
  • gears/bss/ledger/ledger/src/domain/fx/revaluation.rs
  • gears/bss/ledger/ledger/src/domain/fx/revaluation_mode.rs
  • gears/bss/ledger/ledger/src/domain/fx/revaluation_mode_tests.rs
  • gears/bss/ledger/ledger/src/domain/fx/revaluation_tests.rs
  • gears/bss/ledger/ledger/src/domain/fx/translate.rs
  • gears/bss/ledger/ledger/src/domain/fx/translate_tests.rs
  • gears/bss/ledger/ledger/src/domain/invoice.rs
  • gears/bss/ledger/ledger/src/domain/invoice/aging.rs
  • gears/bss/ledger/ledger/src/domain/invoice/aging_tests.rs
  • gears/bss/ledger/ledger/src/domain/invoice/builder.rs
  • gears/bss/ledger/ledger/src/domain/invoice/builder_tests.rs
  • gears/bss/ledger/ledger/src/domain/invoice/mapping.rs
  • gears/bss/ledger/ledger/src/domain/invoice/mapping_tests.rs
  • gears/bss/ledger/ledger/src/domain/invoice/policy.rs
  • gears/bss/ledger/ledger/src/domain/invoice/policy_tests.rs
  • gears/bss/ledger/ledger/src/domain/invoice/reversal.rs
  • gears/bss/ledger/ledger/src/domain/invoice/reversal_tests.rs
  • gears/bss/ledger/ledger/src/domain/model.rs
  • gears/bss/ledger/ledger/src/domain/money.rs
  • gears/bss/ledger/ledger/src/domain/money_math.rs
  • gears/bss/ledger/ledger/src/domain/payment.rs
  • gears/bss/ledger/ledger/src/domain/payment/allocation.rs
  • gears/bss/ledger/ledger/src/domain/payment/allocation_tests.rs
  • gears/bss/ledger/ledger/src/domain/payment/chargeback.rs
  • gears/bss/ledger/ledger/src/domain/payment/chargeback_tests.rs
  • gears/bss/ledger/ledger/src/domain/payment/credit.rs
  • gears/bss/ledger/ledger/src/domain/payment/credit_tests.rs
  • gears/bss/ledger/ledger/src/domain/payment/precedence.rs
  • gears/bss/ledger/ledger/src/domain/payment/precedence_tests.rs
  • gears/bss/ledger/ledger/src/domain/payment/settlement.rs
  • gears/bss/ledger/ledger/src/domain/payment/settlement_return.rs
  • gears/bss/ledger/ledger/src/domain/payment/settlement_return_tests.rs
  • gears/bss/ledger/ledger/src/domain/payment/settlement_tests.rs
  • gears/bss/ledger/ledger/src/domain/period.rs
  • gears/bss/ledger/ledger/src/domain/period_tests.rs
  • gears/bss/ledger/ledger/src/domain/ports.rs
  • gears/bss/ledger/ledger/src/domain/ports/metrics.rs
  • gears/bss/ledger/ledger/src/domain/ports/obligation_state.rs
  • gears/bss/ledger/ledger/src/domain/posting.rs
  • gears/bss/ledger/ledger/src/domain/posting_tests.rs
  • gears/bss/ledger/ledger/src/domain/provisioning.rs
  • gears/bss/ledger/ledger/src/domain/provisioning/plan.rs
  • gears/bss/ledger/ledger/src/domain/recognition.rs
  • gears/bss/ledger/ledger/src/domain/recognition/builder.rs
  • gears/bss/ledger/ledger/src/domain/recognition/builder_tests.rs
  • gears/bss/ledger/ledger/src/domain/recognition/change.rs
  • gears/bss/ledger/ledger/src/domain/recognition/change_tests.rs
  • gears/bss/ledger/ledger/src/domain/recognition/input.rs
  • gears/bss/ledger/ledger/src/domain/recognition/input_tests.rs
  • gears/bss/ledger/ledger/src/domain/recognition/ports.rs
  • gears/bss/ledger/ledger/src/domain/recognition/ports_tests.rs
  • gears/bss/ledger/ledger/src/domain/scale.rs
  • gears/bss/ledger/ledger/src/domain/status.rs
  • gears/bss/ledger/ledger/src/gts.rs
  • gears/bss/ledger/ledger/src/gts/permissions.rs
  • gears/bss/ledger/ledger/src/gts/permissions_tests.rs
  • gears/bss/ledger/ledger/src/infra.rs
  • gears/bss/ledger/ledger/src/infra/adjustment.rs
  • gears/bss/ledger/ledger/src/infra/adjustment/credit_note_service.rs
  • gears/bss/ledger/ledger/src/infra/adjustment/debit_note_service.rs
  • gears/bss/ledger/ledger/src/infra/adjustment/manual_adjustment_service.rs
  • gears/bss/ledger/ledger/src/infra/adjustment/refund_service.rs
  • gears/bss/ledger/ledger/src/infra/adjustment/refund_service_tests.rs
  • gears/bss/ledger/ledger/src/infra/annotation.rs
  • gears/bss/ledger/ledger/src/infra/annotation_tests.rs
  • gears/bss/ledger/ledger/src/infra/approval.rs
  • gears/bss/ledger/ledger/src/infra/approval/executor.rs
  • gears/bss/ledger/ledger/src/infra/approval/service.rs
  • gears/bss/ledger/ledger/src/infra/audit.rs
  • gears/bss/ledger/ledger/src/infra/audit/event_type.rs
  • gears/bss/ledger/ledger/src/infra/audit/retrieval.rs
  • gears/bss/ledger/ledger/src/infra/audit/secured_audit_sink.rs
  • gears/bss/ledger/ledger/src/infra/audit/store.rs
  • gears/bss/ledger/ledger/src/infra/authz.rs
  • gears/bss/ledger/ledger/src/infra/authz/cross_tenant.rs
  • gears/bss/ledger/ledger/src/infra/authz/cross_tenant_tests.rs
  • gears/bss/ledger/ledger/src/infra/control_feed.rs
  • gears/bss/ledger/ledger/src/infra/control_feed_tests.rs
  • gears/bss/ledger/ledger/src/infra/currency_scale.rs
  • gears/bss/ledger/ledger/src/infra/error_mapping.rs
  • gears/bss/ledger/ledger/src/infra/error_mapping_tests.rs
  • gears/bss/ledger/ledger/src/infra/events.rs
  • gears/bss/ledger/ledger/src/infra/events/alarm_catalog.rs
  • gears/bss/ledger/ledger/src/infra/events/alarm_catalog_tests.rs
  • gears/bss/ledger/ledger/src/infra/events/payloads.rs
  • gears/bss/ledger/ledger/src/infra/events/publisher.rs
  • gears/bss/ledger/ledger/src/infra/events/publisher_tests.rs
  • gears/bss/ledger/ledger/src/infra/events/schemas.rs
  • gears/bss/ledger/ledger/src/infra/exception.rs
  • gears/bss/ledger/ledger/src/infra/fx.rs
  • gears/bss/ledger/ledger/src/infra/fx/rate_locker.rs
  • gears/bss/ledger/ledger/src/infra/fx/rate_locker_tests.rs
  • gears/bss/ledger/ledger/src/infra/fx/rate_source.rs
  • gears/bss/ledger/ledger/src/infra/fx/rate_source_tests.rs
  • gears/bss/ledger/ledger/src/infra/fx/revaluation_run.rs
  • gears/bss/ledger/ledger/src/infra/fx/revaluation_run_tests.rs
  • gears/bss/ledger/ledger/src/infra/inquiry.rs
  • gears/bss/ledger/ledger/src/infra/inquiry_tests.rs
  • gears/bss/ledger/ledger/src/infra/invoice_post.rs
  • gears/bss/ledger/ledger/src/infra/jobs.rs
  • gears/bss/ledger/ledger/src/infra/jobs/aged_alarms.rs
  • gears/bss/ledger/ledger/src/infra/jobs/aged_alarms_tests.rs
  • gears/bss/ledger/ledger/src/infra/jobs/attribution_sweep.rs
  • gears/bss/ledger/ledger/src/infra/jobs/period_open.rs
  • gears/bss/ledger/ledger/src/infra/jobs/queue_applier.rs
  • gears/bss/ledger/ledger/src/infra/jobs/rate_sync.rs
  • gears/bss/ledger/ledger/src/infra/jobs/rate_sync_tests.rs
  • gears/bss/ledger/ledger/src/infra/jobs/recognition_run.rs
  • gears/bss/ledger/ledger/src/infra/jobs/recognition_run_tests.rs
  • gears/bss/ledger/ledger/src/infra/jobs/revaluation_run.rs
  • gears/bss/ledger/ledger/src/infra/jobs/tieout.rs
  • gears/bss/ledger/ledger/src/infra/jobs/tieout_tests.rs
  • gears/bss/ledger/ledger/src/infra/jobs/verifier.rs
  • gears/bss/ledger/ledger/src/infra/metrics.rs
  • gears/bss/ledger/ledger/src/infra/metrics_tests.rs
  • gears/bss/ledger/ledger/src/infra/payment.rs
  • gears/bss/ledger/ledger/src/infra/payment/allocate.rs
  • gears/bss/ledger/ledger/src/infra/payment/chargeback.rs
  • gears/bss/ledger/ledger/src/infra/payment/credit.rs
  • gears/bss/ledger/ledger/src/infra/payment/queue_apply.rs
  • gears/bss/ledger/ledger/src/infra/payment/settle.rs
  • gears/bss/ledger/ledger/src/infra/payment/settlement_return.rs
  • gears/bss/ledger/ledger/src/infra/payment/sidecar.rs
  • gears/bss/ledger/ledger/src/infra/period_close.rs
  • gears/bss/ledger/ledger/src/infra/pii.rs
  • gears/bss/ledger/ledger/src/infra/pii_tests.rs
  • gears/bss/ledger/ledger/src/infra/policy_version.rs
  • gears/bss/ledger/ledger/src/infra/policy_version_tests.rs
  • gears/bss/ledger/ledger/src/infra/posting.rs
  • gears/bss/ledger/ledger/src/infra/posting/chain.rs
  • gears/bss/ledger/ledger/src/infra/posting/chart.rs
  • gears/bss/ledger/ledger/src/infra/posting/freeze.rs
  • gears/bss/ledger/ledger/src/infra/posting/idempotency.rs
  • gears/bss/ledger/ledger/src/infra/posting/idempotency_tests.rs
  • gears/bss/ledger/ledger/src/infra/posting/period.rs
  • gears/bss/ledger/ledger/src/infra/posting/projector.rs
  • gears/bss/ledger/ledger/src/infra/posting/projector_tests.rs
  • gears/bss/ledger/ledger/src/infra/posting/service.rs
  • gears/bss/ledger/ledger/src/infra/provisioning.rs
  • gears/bss/ledger/ledger/src/infra/provisioning/service.rs
  • gears/bss/ledger/ledger/src/infra/recognition.rs
  • gears/bss/ledger/ledger/src/infra/recognition/change_service.rs
  • gears/bss/ledger/ledger/src/infra/recognition/run_service.rs
  • gears/bss/ledger/ledger/src/infra/recognition/runner.rs
  • gears/bss/ledger/ledger/src/infra/recognition/runner_tests.rs
  • gears/bss/ledger/ledger/src/infra/recognition/sidecar.rs
  • gears/bss/ledger/ledger/src/infra/reconciliation.rs
  • gears/bss/ledger/ledger/src/infra/reconciliation_tests.rs
  • gears/bss/ledger/ledger/src/infra/retention.rs
  • gears/bss/ledger/ledger/src/infra/seller_guard.rs
  • gears/bss/ledger/ledger/src/infra/seller_guard_tests.rs
  • gears/bss/ledger/ledger/src/infra/storage.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/account_balance.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/ar_invoice_balance.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/ar_payer_balance.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/audit_chain_state.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/audit_pack_export.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/chain_checkpoint.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/chain_state.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/credit_note.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/currency_scale_registry.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/debit_note.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/dispute.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/dual_control_approval.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/dual_control_comment.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/dual_control_policy.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/entry_annotation.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/exception_queue.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/fiscal_calendar.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/fiscal_period.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/fx_rate.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/fx_rate_snapshot.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/fx_revaluation_mode.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/fx_revaluation_run.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/idempotency_dedup.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/invoice_exposure.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/journal_entry.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/journal_line.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/payer_pii_map.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/payer_state.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/payment_allocation.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/payment_allocation_refund.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/payment_settlement.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/pending_event_queue.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/period_close.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/posting_policy.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/recognition_run.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/recognition_schedule.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/recognition_segment.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/reconciliation_run.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/refund.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/reusable_credit_subbalance.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/scope_freeze.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/secured_audit_record.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/tax_subbalance.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/tenant_account.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/tenant_posting_lock.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/tenant_precedence_policy.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/unallocated_balance.rs
  • gears/bss/ledger/ledger/src/infra/storage/entity/verified_balance.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260619_000001_create_bss_schema.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260619_000002_create_journal_tables.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260619_000002_create_journal_tables_tests.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260619_000003_create_balance_caches.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260619_000004_create_idempotency_and_reference.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260619_000005_create_fiscal_calendar.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260622_000006_create_payment_tables.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260623_000007_create_precedence_policy.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260623_000008_create_pending_event_queue.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260623_000009_add_ar_status.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260623_000010_create_dispute.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000011_create_chain_state.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000011_create_recognition_tables.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000012_create_dual_control_tables.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000012_relax_journal_entry_trigger.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000013_create_scope_freeze.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000014_create_secured_audit.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000014_create_secured_audit_tests.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000015_create_entry_annotation.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000016_create_payer_pii_map.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000017_create_chain_checkpoint.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260624_000018_create_audit_pack_export.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260625_000013_dual_control_approving_state.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000019_create_invoice_exposure.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000020_create_credit_note.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000021_create_debit_note.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000022_create_refund.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000023_refund_approval_kind.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000024_manual_adjustment_approval_kind.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260626_000025_note_approval_kinds.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260627_000026_create_fx_rate_tables.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260627_000027_journal_line_rate_ref.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260627_000028_wide_cache_functional_cols.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260627_000029_dual_column_commit_check.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260627_000030_fiscal_calendar_functional_ccy.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260628_000031_cache_functional_consistency.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260628_000032_snapshot_identity_rate_micro.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260628_000033_create_period_close.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260628_000034_create_exception_queue.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260628_000035_create_reconciliation_run.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260628_000036_exception_queue_open_uniq.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260629_000037_create_posting_policy.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260629_000038_create_verified_balance.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260629_000039_create_fx_revaluation_run.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260630_000040_create_fx_revaluation_mode.rs
  • gears/bss/ledger/ledger/src/infra/storage/migrations/m20260706_000041_currency_scale_immutable.rs
  • gears/bss/ledger/ledger/src/infra/storage/odata_mapping.rs
  • gears/bss/ledger/ledger/src/infra/storage/odata_mapping_tests.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/adjustment_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/approval_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/chain_state_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/dispute_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/exception_queue_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/fx_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/fx_revaluation_mode_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/fx_revaluation_run_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/journal_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/payer_state_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/payment_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/pending_queue_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/period_close_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/posting_policy_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/recognition_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/reconciliation_run_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/reference_repo.rs
  • gears/bss/ledger/ledger/src/infra/storage/repo/verified_balance_repo.rs
  • gears/bss/ledger/ledger/src/lib.rs
  • gears/bss/ledger/ledger/src/module.rs
  • gears/bss/ledger/ledger/src/odata.rs
  • gears/bss/ledger/ledger/src/odata_tests.rs
  • gears/bss/ledger/ledger/tests/metrics_emit.rs
  • gears/bss/ledger/ledger/tests/module_test.rs
  • gears/bss/ledger/ledger/tests/postgres_allocate_fx.rs
  • gears/bss/ledger/ledger/tests/postgres_audit.rs
  • gears/bss/ledger/ledger/tests/postgres_balance_caches.rs
  • gears/bss/ledger/ledger/tests/postgres_bola.rs
  • gears/bss/ledger/ledger/tests/postgres_chain.rs
  • gears/bss/ledger/ledger/tests/postgres_chargeback_concurrency.rs
  • gears/bss/ledger/ledger/tests/postgres_chargeback_fx.rs
  • gears/bss/ledger/ledger/tests/postgres_chargebacks.rs
  • gears/bss/ledger/ledger/tests/postgres_credit.rs
  • gears/bss/ledger/ledger/tests/postgres_credit_concurrency.rs
  • gears/bss/ledger/ledger/tests/postgres_credit_note.rs
  • gears/bss/ledger/ledger/tests/postgres_cross_tenant.rs
  • gears/bss/ledger/ledger/tests/postgres_debit_note.rs
  • gears/bss/ledger/ledger/tests/postgres_dual_control.rs
  • gears/bss/ledger/ledger/tests/postgres_entry_annotation.rs
  • gears/bss/ledger/ledger/tests/postgres_exception.rs
  • gears/bss/ledger/ledger/tests/postgres_executor.rs
  • gears/bss/ledger/ledger/tests/postgres_fx_revaluation_mode.rs
  • gears/bss/ledger/ledger/tests/postgres_idempotency.rs
  • gears/bss/ledger/ledger/tests/postgres_inquiry.rs
  • gears/bss/ledger/ledger/tests/postgres_invoice_post.rs
  • gears/bss/ledger/ledger/tests/postgres_invoice_post_fx.rs
  • gears/bss/ledger/ledger/tests/postgres_journal.rs
  • gears/bss/ledger/ledger/tests/postgres_manual_adjustment.rs
  • gears/bss/ledger/ledger/tests/postgres_migration_idempotency.rs
  • gears/bss/ledger/ledger/tests/postgres_payer_state.rs
  • gears/bss/ledger/ledger/tests/postgres_payment_concurrency.rs
  • gears/bss/ledger/ledger/tests/postgres_payment_returns.rs
  • gears/bss/ledger/ledger/tests/postgres_payments.rs
  • gears/bss/ledger/ledger/tests/postgres_period_close.rs
  • gears/bss/ledger/ledger/tests/postgres_period_guard.rs
  • gears/bss/ledger/ledger/tests/postgres_period_open.rs
  • gears/bss/ledger/ledger/tests/postgres_pii.rs
  • gears/bss/ledger/ledger/tests/postgres_policy_version.rs
  • gears/bss/ledger/ledger/tests/postgres_posting.rs
  • gears/bss/ledger/ledger/tests/postgres_precedence_policy.rs
  • gears/bss/ledger/ledger/tests/postgres_projector.rs
  • gears/bss/ledger/ledger/tests/postgres_provisioning.rs
  • gears/bss/ledger/ledger/tests/postgres_queue.rs
  • gears/bss/ledger/ledger/tests/postgres_queue_concurrency.rs
  • gears/bss/ledger/ledger/tests/postgres_read_surface.rs
  • gears/bss/ledger/ledger/tests/postgres_recognition_build.rs
  • gears/bss/ledger/ledger/tests/postgres_recognition_change.rs
  • gears/bss/ledger/ledger/tests/postgres_recognition_disaggregation.rs
  • gears/bss/ledger/ledger/tests/postgres_recognition_run.rs
  • gears/bss/ledger/ledger/tests/postgres_reconciliation.rs
  • gears/bss/ledger/ledger/tests/postgres_reference.rs
  • gears/bss/ledger/ledger/tests/postgres_refund.rs
  • gears/bss/ledger/ledger/tests/postgres_refund_dispute_hold.rs
  • gears/bss/ledger/ledger/tests/postgres_refund_fx.rs
  • gears/bss/ledger/ledger/tests/postgres_retention.rs
  • gears/bss/ledger/ledger/tests/postgres_revaluation_fx.rs
  • gears/bss/ledger/ledger/tests/postgres_scale_lock.rs
  • gears/bss/ledger/ledger/tests/postgres_schema.rs
  • gears/bss/ledger/ledger/tests/postgres_settlement_return_fx.rs
  • gears/bss/ledger/ledger/tests/postgres_tieout.rs
  • gears/bss/ledger/ledger/tests/rest_adjustments.rs
  • gears/bss/ledger/ledger/tests/rest_audit.rs
  • gears/bss/ledger/ledger/tests/rest_credit.rs
  • gears/bss/ledger/ledger/tests/rest_disputes.rs
  • gears/bss/ledger/ledger/tests/rest_journal_entries.rs
  • gears/bss/ledger/ledger/tests/rest_payments.rs
  • gears/bss/ledger/ledger/tests/rest_provisioning.rs
  • gears/bss/ledger/ledger/tests/rest_recognition.rs
  • gears/bss/ledger/ledger/tests/rest_refunds.rs
  • gears/bss/ledger/ledger/tests/sqlite_adjustment_repo.rs
  • gears/bss/ledger/ledger/tests/sqlite_chain_state.rs
  • gears/bss/ledger/ledger/tests/sqlite_debit_note_repo.rs
  • gears/bss/ledger/ledger/tests/sqlite_payment_refund_cap.rs
  • gears/bss/ledger/ledger/tests/sqlite_refund_repo.rs
  • gears/bss/ledger/ledger/tests/sqlite_repo.rs
  • gears/bss/ledger/ledger/tests/sqlite_scale_resolver.rs
  • gears/bss/libs/coord/Cargo.toml
  • gears/bss/libs/coord/README.md
  • gears/bss/libs/coord/src/lease.rs
  • gears/bss/libs/coord/src/lease/entity.rs
  • gears/bss/libs/coord/src/lease/error.rs
  • gears/bss/libs/coord/src/lease/guard.rs
  • gears/bss/libs/coord/src/lease/manager.rs
  • gears/bss/libs/coord/src/lease/sqlite_tests.rs
  • gears/bss/libs/coord/src/lib.rs
  • gears/bss/libs/coord/src/migration.rs
  • gears/bss/libs/coord/src/migration/m0001_create_coord_leases.rs
  • gears/bss/libs/coord/tests/postgres_fence.rs
  • testing/e2e/gears/bss/__init__.py
  • testing/e2e/gears/bss/ledger/__init__.py
  • testing/e2e/gears/bss/ledger/conftest.py
  • testing/e2e/gears/bss/ledger/test_ledger_seams.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bss/ledger

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

diffora added a commit that referenced this pull request Jul 6, 2026
Fixes the CI failures surfaced once the `coord` clippy break stopped
blocking the rest of the workspace check:

- **fmt**: `cargo fmt` on the ledger crate (long-line reflows in
  local_client / module / approval_repo / postgres_tieout, etc.).
- **clippy (coord)**: replace 3 `let _ = <#[must_use]>` with `_ = …`
  (guard.rs) and the non-ASCII `→` with `->` (sqlite_tests) —
  `let_underscore_must_use` / `non_ascii_literal` under `-D warnings`.
- **clippy (bss-ledger)**: the crate carried 148 workspace-lint violations
  never seen in CI (bss-ledger depends on coord, whose failure short-
  circuited the check). Allow the domain-inherent / stylistic lints
  crate-wide with a documented rationale (integer_division = deliberate
  minor-unit math with designed residual handling; unused_async = parked
  publisher kept async for the future broker; cognitive_complexity =
  deferred financial-logic refactor; non_ascii_literal / redundant_pub_crate
  / doc_markdown / … = cosmetic). Safety lints (cast_*, float_cmp,
  await_holding_*, unwrap/expect) stay enforced. Test targets get the same
  subjective allows; two real nits fixed (needless_collect → `.count()`,
  `&str.to_string()` → `.to_owned()`).
- **Test Suite**: the audit-chain canonical encoder relied on serde_json's
  default `BTreeMap` key ordering, which breaks when the monorepo build
  enables `serde_json/preserve_order` (an IndexMap). Make `canonical_json`
  sort object keys explicitly (recursively), so the audit `row_hash` is
  byte-reproducible regardless of the feature; the byte-repro vector is
  unchanged. Replace the obsolete `preserve_order_stays_off` guard with a
  direct `canonical_json` sorted-output assertion.
- **Security (cargo-deny)**: ignore RUSTSEC-2026-0194/0195 (quick-xml <0.41
  DoS) — transitive, no untrusted-XML hot path, no unified upgrade yet;
  same treatment as the existing lopdf/protobuf entries.
- **CFS**: ignore `gears/bss/libs` (grouping) + the `coord` utility library
  in the Constructor Studio autodetect — an infra crate with no PRD/DESIGN,
  mirroring the other non-SDLC-documented modules.

Signed-off-by: Diffora <ddiffora@gmail.com>
diffora added a commit that referenced this pull request Jul 6, 2026
Fixes the CI failures surfaced once the `coord` clippy break stopped
blocking the rest of the workspace check:

- **fmt**: `cargo fmt` on the ledger crate (long-line reflows in
  local_client / module / approval_repo / postgres_tieout, etc.).
- **clippy (coord)**: replace 3 `let _ = <#[must_use]>` with `_ = …`
  (guard.rs) and the non-ASCII `→` with `->` (sqlite_tests) —
  `let_underscore_must_use` / `non_ascii_literal` under `-D warnings`.
- **clippy (bss-ledger)**: the crate carried 148 workspace-lint violations
  never seen in CI (bss-ledger depends on coord, whose failure short-
  circuited the check). Allow the domain-inherent / stylistic lints
  crate-wide with a documented rationale (integer_division = deliberate
  minor-unit math with designed residual handling; unused_async = parked
  publisher kept async for the future broker; cognitive_complexity =
  deferred financial-logic refactor; non_ascii_literal / redundant_pub_crate
  / doc_markdown / … = cosmetic). Safety lints (cast_*, float_cmp,
  await_holding_*, unwrap/expect) stay enforced. Test targets get the same
  subjective allows; two real nits fixed (needless_collect → `.count()`,
  `&str.to_string()` → `.to_owned()`).
- **Test Suite**: the audit-chain canonical encoder relied on serde_json's
  default `BTreeMap` key ordering, which breaks when the monorepo build
  enables `serde_json/preserve_order` (an IndexMap). Make `canonical_json`
  sort object keys explicitly (recursively), so the audit `row_hash` is
  byte-reproducible regardless of the feature; the byte-repro vector is
  unchanged. Replace the obsolete `preserve_order_stays_off` guard with a
  direct `canonical_json` sorted-output assertion.
- **Security (cargo-deny)**: ignore RUSTSEC-2026-0194/0195 (quick-xml <0.41
  DoS) — transitive, no untrusted-XML hot path, no unified upgrade yet;
  same treatment as the existing lopdf/protobuf entries.
- **CFS**: ignore `gears/bss/libs` (grouping) + the `coord` utility library
  in the Constructor Studio autodetect — an infra crate with no PRD/DESIGN,
  mirroring the other non-SDLC-documented modules.

Signed-off-by: Diffora <ddiffora@gmail.com>
diffora added a commit that referenced this pull request Jul 6, 2026
Fixes the CI failures surfaced once the `coord` clippy break stopped
blocking the rest of the workspace check:

- **fmt**: `cargo fmt` on the ledger crate (long-line reflows in
  local_client / module / approval_repo / postgres_tieout, etc.).
- **clippy (coord)**: replace 3 `let _ = <#[must_use]>` with `_ = …`
  (guard.rs) and the non-ASCII `→` with `->` (sqlite_tests) —
  `let_underscore_must_use` / `non_ascii_literal` under `-D warnings`.
- **clippy (bss-ledger)**: the crate carried 148 workspace-lint violations
  never seen in CI (bss-ledger depends on coord, whose failure short-
  circuited the check). Allow the domain-inherent / stylistic lints
  crate-wide with a documented rationale (integer_division = deliberate
  minor-unit math with designed residual handling; unused_async = parked
  publisher kept async for the future broker; cognitive_complexity =
  deferred financial-logic refactor; non_ascii_literal / redundant_pub_crate
  / doc_markdown / … = cosmetic). Safety lints (cast_*, float_cmp,
  await_holding_*, unwrap/expect) stay enforced. Test targets get the same
  subjective allows; two real nits fixed (needless_collect → `.count()`,
  `&str.to_string()` → `.to_owned()`).
- **Test Suite**: the audit-chain canonical encoder relied on serde_json's
  default `BTreeMap` key ordering, which breaks when the monorepo build
  enables `serde_json/preserve_order` (an IndexMap). Make `canonical_json`
  sort object keys explicitly (recursively), so the audit `row_hash` is
  byte-reproducible regardless of the feature; the byte-repro vector is
  unchanged. Replace the obsolete `preserve_order_stays_off` guard with a
  direct `canonical_json` sorted-output assertion.
- **Security (cargo-deny)**: ignore RUSTSEC-2026-0194/0195 (quick-xml <0.41
  DoS) — transitive, no untrusted-XML hot path, no unified upgrade yet;
  same treatment as the existing lopdf/protobuf entries.
- **CFS**: ignore `gears/bss/libs` (grouping) + the `coord` utility library
  in the Constructor Studio autodetect — an infra crate with no PRD/DESIGN,
  mirroring the other non-SDLC-documented modules.

Signed-off-by: Diffora <ddiffora@gmail.com>
@diffora
diffora force-pushed the bss/ledger branch 2 times, most recently from e7cabbf to 3d382ff Compare July 7, 2026 06:21
…gn docs

The double-entry posting foundation and its handler slices (invoice
posting, audit/immutability, payments & allocation, ASC 606 recognition,
adjustments/notes/refunds, FX/multi-currency, reconciliation & close),
plus the `bss-ledger-sdk` contract crate, the shared `coord` lease
library, the full design set (PRD, slices 01–07, ADR-0001), SeaORM
entities + migrations, and unit/SQLite/Postgres/e2e test suites. Wired
into cf-gears-example-server as an opt-in cargo feature.

Signed-off-by: Diffora <ddiffora@gmail.com>
@diffora
diffora force-pushed the bss/ledger branch 2 times, most recently from d0d6a47 to 353d4d0 Compare July 7, 2026 10:04
…ign, panic, actor spoof, boundary validation

Address findings from the bss/ledger branch review (codex CLI + review
agents), verified with Postgres tests.

coord lease fence (HIGH, reproduced):
- `with_ack_in_tx` fenced with a snapshot SELECT under SERIALIZABLE: a peer
  steal committed after the ack tx's snapshot stayed invisible and the commit
  was not guaranteed to abort (a lone rw-antidependency does not trip SSI), so
  a stolen lease could ack successfully.
- Fence is now a no-op self-touch UPDATE (ww-conflict ⇒ first-updater-wins
  40001 on a peer steal) with a wall-clock `live_filter_clock` for a
  lapsed-but-unstolen lease. New `tests/postgres_fence.rs` reproduces the
  scenario: red before the fix, green after.

coord lease acquire clock (MEDIUM):
- The free-slot INSERT wrote `locked_until` from the worker clock while
  steal/renew bump it on the DB clock; a worker whose clock ran ahead stamped
  an expiry into the future, so peers (comparing against DB `NOW()`) saw the
  lease live long past its TTL and were blocked. Acquire now INSERTs the epoch
  sentinel (no worker clock) then claims the row it created with the shared
  DB-clock steal-UPDATE (`claim_expired_slot`), so no worker-clock value ever
  lands in `locked_until`.

ledger FX rate sign (HIGH):
- A non-positive FX rate could reach the unrealized-revaluation post path:
  `translate_amount` (single-amount) lacked the `rate_micro > 0` guard
  `translate_entry` already has, the provider-sync upsert and the raw store had
  no gate (only the REST ingest DTO validated), and there was no DB CHECK. A
  zero/negative provider quote would zero out or flip the sign of the translated
  position and post a wrong FX entry. Guarded at four layers: `translate_amount`,
  `RateSource::resolve` (skip poisoned rows so a valid fallback wins),
  provider-sync upsert (drop + warn, never poison the store), and a
  `CHECK (rate_micro > 0)` on `ledger_fx_rate` / `ledger_fx_rate_snapshot`
  (pg + sqlite).

ledger (HIGH):
- Reject negative invoice item / tax amounts at the DTO boundary — a negative
  `amount_minor_ex_tax` drove `deferred.clamp(0, amount)` into `min > max`
  (panic); `.max(0)` belt in the builder as defense-in-depth.
- Stamp `posted_by_actor_id` from `ctx.subject_id()` in the local client so an
  in-process ClientHub caller cannot spoof the audit actor.

ledger (MEDIUM):
- Functional-FX columns must be a consistent pair on the direct post path
  (`Some`/`None` mismatch ⇒ 400) — no RateLocker there to derive one.
- Route every request DTO `currency` field through `check_currency_code`.
- Reject a wholly-empty invoice (no items and no tax).
- Cap unbounded free-text at the boundary — `reason` (4096) / `reason_code`
  (64) — for both the DTOs that lower via `into_domain` and the four
  handler-lowered DTOs (reversal, annotation, reidentify, audit-pack) via a
  `pub(crate) validate()` the handler calls.

e2e:
- Rewrite the BOLA/no-existence-leak tests to genuinely cross tenants (seed a
  real entry as one tenant, assert another gets the same 404), with an
  owner-200 baseline. Refresh stale conftest docs (the gear is already wired
  into cf-gears-example-server).

Verified: coord sqlite (5) + fence pg test green; ledger fx unit tests pass;
15 Postgres tests green over Docker (fence, migration-idempotency, and the
revaluation / allocate / invoice-post / refund / chargeback / settlement-return
FX suites); clippy clean on both crates.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant