Verifies the bank_rec_bootstrap migration step (a) creates precedents
from existing partial.reconcile rows, (b) is idempotent on re-run, and
(c) refreshes the MV without erroring.
Three TransactionCase tests:
- test_bootstrap_creates_precedents_from_existing_reconciles seeds two
reconciles via the engine, wipes the auto-recorded precedents, then
asserts the bootstrap produces source='backfill' precedents.
- test_bootstrap_step_idempotent runs the bootstrap twice and asserts
the second pass creates zero new precedents.
- test_bootstrap_refreshes_mv_without_error runs the bootstrap on a
clean partner and asserts no exception is raised and the result dict
reports MV + pattern refresh outcomes.
Implementation fixes uncovered by these tests:
- precedent_backfill.backfill_precedents now pre-filters
account.partial.reconcile to rows that touch a bank statement line on
either side. Previously it walked every partial in the DB; on the
westin-v19 dev DB that's 16k rows and the default limit=10000 missed
the newest test fixtures (highest IDs).
- backfill skips the periodic env.cr.commit() when running under a
TestCursor, since committing inside a test breaks the rollback.
Test count: 139 -> 142.
Made-with: Cursor
Adds bank_rec_bootstrap step that backfills fusion.reconcile.precedent
from existing account.partial.reconcile rows during migration. This
gives the AI memory from past Enterprise reconciles. Also triggers
pattern refresh + MV refresh for immediate UI readiness.
- New service services/precedent_backfill.py walks
account.partial.reconcile rows, identifies the bank-statement-line
side, and creates a precedent per qualifying partial. Idempotent via
(statement_line, account, amount, source='backfill') signature.
- New model models/fusion_migration_wizard.py inherits
fusion.migration.wizard, exposes _bank_rec_bootstrap_step() (callable
from tests/audit), and overrides action_run_migration() to call
super() + the bootstrap.
- Adds 'backfill' to fusion.reconcile.precedent.source selection.
- Adds fusion_accounting_migration to depends.
Made-with: Cursor
Task 11 of Phase 1 Bank Reconciliation. Adds the brain that ranks
candidate journal-item matches for a bank statement line.
Pass 1 — SQL filter (done by caller's _fetch_candidates).
Pass 2 — Statistical scoring: weighted blend of amount-delta,
partner pattern fit, and precedent similarity.
Pass 3 — Optional AI re-rank when an LLM provider is configured;
gracefully no-ops when provider missing, prompt module not
yet present (Task 20), or the JSON response is malformed.
Pass 4 — Persistence (handled by engine.suggest_matches).
Returns top-K ScoredCandidate dataclasses with per-feature scores
exposed for transparency and future learning.
7 new tests added; full module suite green (51 tests, 0 failures).
Made-with: Cursor
Scaffold the fusion_accounting_bank_rec sub-module with directory
tree, manifest, empty package __init__ files, empty ACL CSV, icon,
and Enterprise reference snapshots. No models, controllers, or
business logic yet — installs cleanly on V19 westin-v19 dev DB.
Made-with: Cursor