Mechanically
Merges four sources into one reconciliation ledger where some rows are derived (keyed by sourceKey) and others stored; confirmations attach to either, and soft-deletes stay findable under a Deleted status so they can be undone.
Merges four sources into one reconciliation ledger where some rows are derived (keyed by sourceKey) and others stored; confirmations attach to either, and soft-deletes stay findable under a Deleted status so they can be undone.
The settlement view over both invoicing domains. Largest single page component at 871 LOC.
src/pages/PaymentLog.tsxsrc/components/payment-log/paymentLog.tspaymentLogEntriespaymentLogConfirmationsrecurringExpensesconvex/schema.ts:103,132,153,393,703
convex/schema.ts
TRANSPLANT — his 871-LOC hand-rolled ledger → real double-entry engine. Preserve every existing operator capability; keep or replace the UI based on the simplest complete implementation. Highest-value block.
Double-entry ledger engine (Node/TS). Port behind PaymentLog; earnings = liability not revenue.
Postgres double-entry model — study, reimplement the account/journal shape in Convex.
Programmable ledger as a service if the money core outgrows Convex.
Integer minor units + allocate() — kills the float/rounding bug across all money math.
Append-only audit trail — none exists in 56 tables.
LIFT = copy the code into the fork · WRAP = run underneath as a service · STUDY = architecture only. Verdicts from the OFM sourcing campaign.
Research priority for this domain is medium. Agent findings splice in below this line and survive regeneration.