What problem does it solve? Corrections, voids, and reissues in an event-sourced ledger can silently update one read-model (like money_lines) while leaving a sibling projection (like the invoices AR row) frozen at its issue-time state, causing AR reports and QB exports to disagree weeks later. ## Core Features & Use Cases - Fan-out enumeration discipline: Lists every read-model an event kind feeds (money_lines, invoices, status_cache, messages, passports) so no projection is missed when handling invoice.corrected or new event kinds. - Void/correction handling rules: Defines that a void must emit an invoices upsert with {total_cents: 0, status: 'void'} in the same db.batch() as the money_lines netting, not return an empty array. - Reconciliation test guidance: Requires asserting SUM(invoices.total_cents outstanding) equals SUM(money_lines net) across issue, reissue, and void shapes. - Use Case: When reviewing a change to packages/ledger/src/projection/money.ts that handles invoice.corrected, apply this Skill to verify both the money_lines credits and the invoices AR row are updated atomically. ## Quick Start Review my changes to the invoice.corrected handler in packages/ledger/src/projection/money.ts and check that every affected read-model is updated consistently with the ledger.