# Graph Report - /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec (2026-04-22) ## Corpus Check - 85 files · ~29,014 words - Verdict: corpus is large enough that graph structure adds value. ## Summary - 792 nodes · 1381 edges · 66 communities detected - Extraction: 65% EXTRACTED · 35% INFERRED · 0% AMBIGUOUS · INFERRED: 482 edges (avg confidence: 0.71) - Token cost: 0 input · 0 output ## Community Hubs (Navigation) - [[_COMMUNITY_Community 0|Community 0]] - [[_COMMUNITY_Community 1|Community 1]] - [[_COMMUNITY_Community 2|Community 2]] - [[_COMMUNITY_Community 3|Community 3]] - [[_COMMUNITY_Community 4|Community 4]] - [[_COMMUNITY_Community 5|Community 5]] - [[_COMMUNITY_Community 6|Community 6]] - [[_COMMUNITY_Community 7|Community 7]] - [[_COMMUNITY_Community 8|Community 8]] - [[_COMMUNITY_Community 9|Community 9]] - [[_COMMUNITY_Community 10|Community 10]] - [[_COMMUNITY_Community 11|Community 11]] - [[_COMMUNITY_Community 12|Community 12]] - [[_COMMUNITY_Community 13|Community 13]] - [[_COMMUNITY_Community 14|Community 14]] - [[_COMMUNITY_Community 15|Community 15]] - [[_COMMUNITY_Community 16|Community 16]] - [[_COMMUNITY_Community 17|Community 17]] - [[_COMMUNITY_Community 18|Community 18]] - [[_COMMUNITY_Community 19|Community 19]] - [[_COMMUNITY_Community 20|Community 20]] - [[_COMMUNITY_Community 21|Community 21]] - [[_COMMUNITY_Community 22|Community 22]] - [[_COMMUNITY_Community 23|Community 23]] - [[_COMMUNITY_Community 24|Community 24]] - [[_COMMUNITY_Community 25|Community 25]] - [[_COMMUNITY_Community 26|Community 26]] - [[_COMMUNITY_Community 27|Community 27]] - [[_COMMUNITY_Community 28|Community 28]] - [[_COMMUNITY_Community 29|Community 29]] - [[_COMMUNITY_Community 30|Community 30]] - [[_COMMUNITY_Community 31|Community 31]] - [[_COMMUNITY_Community 32|Community 32]] - [[_COMMUNITY_Community 33|Community 33]] - [[_COMMUNITY_Community 34|Community 34]] - [[_COMMUNITY_Community 35|Community 35]] - [[_COMMUNITY_Community 36|Community 36]] - [[_COMMUNITY_Community 37|Community 37]] - [[_COMMUNITY_Community 38|Community 38]] - [[_COMMUNITY_Community 39|Community 39]] - [[_COMMUNITY_Community 40|Community 40]] - [[_COMMUNITY_Community 41|Community 41]] - [[_COMMUNITY_Community 42|Community 42]] - [[_COMMUNITY_Community 43|Community 43]] - [[_COMMUNITY_Community 44|Community 44]] - [[_COMMUNITY_Community 45|Community 45]] - [[_COMMUNITY_Community 46|Community 46]] - [[_COMMUNITY_Community 47|Community 47]] - [[_COMMUNITY_Community 48|Community 48]] - [[_COMMUNITY_Community 49|Community 49]] - [[_COMMUNITY_Community 50|Community 50]] - [[_COMMUNITY_Community 51|Community 51]] - [[_COMMUNITY_Community 52|Community 52]] - [[_COMMUNITY_Community 53|Community 53]] - [[_COMMUNITY_Community 54|Community 54]] - [[_COMMUNITY_Community 55|Community 55]] - [[_COMMUNITY_Community 56|Community 56]] - [[_COMMUNITY_Community 57|Community 57]] - [[_COMMUNITY_Community 58|Community 58]] - [[_COMMUNITY_Community 59|Community 59]] - [[_COMMUNITY_Community 60|Community 60]] - [[_COMMUNITY_Community 61|Community 61]] - [[_COMMUNITY_Community 62|Community 62]] - [[_COMMUNITY_Community 63|Community 63]] - [[_COMMUNITY_Community 64|Community 64]] - [[_COMMUNITY_Community 65|Community 65]] ## God Nodes (most connected - your core abstractions) 1. `create()` - 71 edges 2. `Candidate` - 54 edges 3. `make_bank_line()` - 41 edges 4. `MultiInvoiceStrategy` - 37 edges 5. `AmountExactStrategy` - 36 edges 6. `FIFOStrategy` - 35 edges 7. `BankRecStatementLine` - 33 edges 8. `BankReconciliationService` - 31 edges 9. `reconcile_one()` - 30 edges 10. `BankRecButtonList` - 29 edges ## Surprising Connections (you probably didn't know these) - `reconcile_manual()` --calls--> `reconcile_one()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/controllers/bank_rec_controller.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/models/fusion_reconcile_engine.py - `bulk_reconcile()` --calls--> `reconcile_batch()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/controllers/bank_rec_controller.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/models/fusion_reconcile_engine.py - `4-pass confidence scoring pipeline. Pass 1: SQL filter — partner match + reconc` --uses--> `Candidate` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/services/confidence_scoring.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/services/matching_strategies.py - `Score and rank candidate matches for a statement line. Args: env: O` --uses--> `Candidate` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/services/confidence_scoring.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/services/matching_strategies.py - `How well does this candidate fit the partner's typical pattern?` --uses--> `Candidate` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/services/confidence_scoring.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_bank_rec/services/matching_strategies.py ## Communities ### Community 0 - "Community 0" Cohesion: 0.03 Nodes (52): create(), suggest_matches(), FusionBulkReconcileWizard, Bulk reconcile wizard — operates on user-selected records. Reads active_ids fro, _ensure_test_product(), make_bank_journal(), make_bank_line(), make_bank_statement() (+44 more) ### Community 1 - "Community 1" Cohesion: 0.09 Nodes (42): FusionReconcileEngine, The reconcile engine — orchestrator for all bank-line reconciliations. Public A, Bulk-reconcile a recordset using the chosen strategy. Returns: ``{'reco, Compute and persist AI suggestions per line. Returns: dict mapping ``li, User clicked Accept on a suggestion -> reconcile via its proposal. Retu, Create a write-off move + reconcile the bank line against it. Returns:, Reverse a reconciliation. Handles full vs. partial chains. Because ``re, Phase 2: structural + safety checks. (+34 more) ### Community 2 - "Community 2" Cohesion: 0.04 Nodes (3): BankRecButtonList, BankRecLineToReconcile, BankRecReconciledLineName ### Community 3 - "Community 3" Cohesion: 0.04 Nodes (5): AiAlternativesPanel, AiSuggestionStrip, BankRecKanbanController, BankReconciliationService, BatchActionBar ### Community 4 - "Community 4" Cohesion: 0.06 Nodes (25): _ai_rerank(), _build_reasoning(), _get_provider(), _pattern_score(), _precedent_score(), 4-pass confidence scoring pipeline. Pass 1: SQL filter — partner match + reconc, How similar is this candidate to past precedents?, Look up provider name from per-feature config; instantiate adapter. Returns (+17 more) ### Community 5 - "Community 5" Cohesion: 0.08 Nodes (23): accept_suggestion(), _adapter(), bulk_reconcile(), FusionBankRecController, list_unreconciled(), HTTP controller: 10 JSON-RPC endpoints for the OWL bank-rec widget. All endpoin, Resolve the bank-rec data adapter from fusion_accounting_ai., JSON-RPC surface consumed by the OWL bank-reconciliation widget. All routes (+15 more) ### Community 6 - "Community 6" Cohesion: 0.08 Nodes (22): make_reconcileable_pair(), Create a bank line + a customer invoice with the same partner+amount. Return, accept_suggestion(), reconcile_batch(), reconcile_one(), write_off(), Tests verifying legacy tools route through fusion.reconcile.engine when present., When engine is present, match_bank_line_to_payments must produce a parti (+14 more) ### Community 7 - "Community 7" Cohesion: 0.06 Nodes (2): useBankReconciliation(), BankRecStatementLine ### Community 8 - "Community 8" Cohesion: 0.11 Nodes (6): AccountReconcileModel, Apply the reconciliation model lines to the statement line passed as parameter., FusionAutoReconcileWizard, Auto-reconcile wizard. Lets the user pick filters (journal, date range, strateg, The fusion.reconcile.suggestion state machine + computed band., TestSuggestionLifecycle ### Community 9 - "Community 9" Cohesion: 0.09 Nodes (13): Tests for BankRecAdapter's fusion paths., Smoke tests for the 5 new fusion bank-rec AI tools., Tests for fusion.bulk.reconcile.wizard., Tests for the fusion bank-rec HTTP controller (Task 26). Uses ``HttpCase`` so w, Smoke tests for the cron handler methods. We don't test the Odoo cron scheduler, Smoke tests verifying the factories produce usable records. Not testing factory, _detect_local_llm(), Local LLM compatibility test (LM Studio, Ollama, etc.). Skips if no local OpenA (+5 more) ### Community 10 - "Community 10" Cohesion: 0.15 Nodes (9): _cron_refresh_mv(), FusionBankRecCron, Cron handler model for fusion_accounting_bank_rec. Three scheduled jobs: - _cro, _amounts_concentrated(), extract_pattern_for_partner(), Aggregate per-partner reconciliation patterns from precedent rows. Computes typ, Compute the pattern aggregate for one (company, partner) pair. Returns vals, True if amounts cluster around a few values (suggests exact-amount strategy). (+1 more) ### Community 11 - "Community 11" Cohesion: 0.13 Nodes (9): create(), FusionReconcileSuggestion, Persisted AI suggestions for bank line reconciliations. One row per (statement_, Best-effort MV refresh; never poison the originating transaction. Uses, FusionUnreconciledBankLineMV, Materialized view exposing pre-aggregated unreconciled-bank-line data. The MV i, Create the MV if missing. Reads create_mv_unreconciled_bank_line.sql an, _refresh() (+1 more) ### Community 12 - "Community 12" Cohesion: 0.12 Nodes (1): BankReconciliationService ### Community 13 - "Community 13" Cohesion: 0.2 Nodes (9): AccountAutoReconcileWizard, default_get(), _get_default_wizard_values(), Auto-reconcile with one-to-one strategy: We will reconcile 2 amls togeth, Auto-reconcile with zero balance strategy: We will reconcile all amls gr, Automatically reconcile amls given wizard's parameters. :return: an acti, Get the current configuration of the wizard as a dict of values. :return, This wizard is used to automatically reconcile account.move.line. It is acce (+1 more) ### Community 14 - "Community 14" Cohesion: 0.22 Nodes (8): compute_exchange_diff(), ExchangeDiffResult, Exchange-difference calculation helper. Pure-Python FX gain/loss computation. T, Compute whether an exchange-diff move is needed and its magnitude. Args:, USD invoice posted at 1.35, USD bank line settled at 1.40 -> diff exists., USD invoice at 1.40, settled at 1.35 -> loss, Tiny FX rounding under 0.005 should NOT trigger a diff move., TestExchangeDiff ### Community 15 - "Community 15" Cohesion: 0.16 Nodes (6): Coexistence tests: fusion_accounting_bank_rec menus only visible when Enterprise, When account_accountant is installed, group should be empty., When account_accountant is uninstalled, all internal users get the group., The fusion bank-rec root menu must have the coexistence group attached., The reconcile engine must work even when Enterprise is installed (it's t, TestCoexistence ### Community 16 - "Community 16" Cohesion: 0.17 Nodes (1): BankRecLineInfoPopOver ### Community 17 - "Community 17" Cohesion: 0.22 Nodes (6): FusionMigrationWizard, Bank-rec specific migration step. Hooks into fusion.migration.wizard (defined b, Override the migration entry-point to add the bank-rec step. Calls supe, _identify_bank_side(), Pure-Python helpers for backfilling fusion.reconcile.precedent from existing acc, Return (bank_move_line, counterpart_move_line, statement_line_id) or (None, ### Community 18 - "Community 18" Cohesion: 0.25 Nodes (2): Python wrappers that run the OWL tours via HttpCase.start_tour. Tours require a, TestBankRecTours ### Community 19 - "Community 19" Cohesion: 0.25 Nodes (2): BankRecListController, BankRecListRenderer ### Community 20 - "Community 20" Cohesion: 0.29 Nodes (1): BankRecSelectCreateDialog ### Community 21 - "Community 21" Cohesion: 0.4 Nodes (2): BankRecEditLineFormController, BankRecFormDialog ### Community 22 - "Community 22" Cohesion: 0.4 Nodes (1): BankRecWidgetApplyAmountHtmlField ### Community 23 - "Community 23" Cohesion: 0.33 Nodes (2): BankRecReconcileDialogListController, BankRecReconcileDialogListRenderer ### Community 24 - "Community 24" Cohesion: 0.4 Nodes (2): AccountBankStatementLine, Inherit account.bank.statement.line to add Phase 1 widget compute fields. These ### Community 25 - "Community 25" Cohesion: 0.4 Nodes (3): FusionBankRecWidget, Per-request widget state. Holds the kanban-load response shape so the controller, Return a window action opening the OWL kanban for this journal. ### Community 26 - "Community 26" Cohesion: 0.5 Nodes (1): ReconcileModelPicker ### Community 27 - "Community 27" Cohesion: 0.5 Nodes (1): AttachmentStrip ### Community 28 - "Community 28" Cohesion: 0.5 Nodes (1): BankRecFileUploader ### Community 29 - "Community 29" Cohesion: 0.5 Nodes (2): BankRecQuickCreate, BankRecQuickCreateController ### Community 30 - "Community 30" Cohesion: 0.5 Nodes (1): PartnerHistoryPanel ### Community 31 - "Community 31" Cohesion: 0.5 Nodes (2): FusionMigrationAuditReport, QWeb PDF report: summary of bank-rec migration outcomes. Triggered from the mig ### Community 32 - "Community 32" Cohesion: 0.67 Nodes (2): FusionReconcilePrecedent, Per-historical-decision reconciliation memory. One row per past reconciliation. ### Community 33 - "Community 33" Cohesion: 0.67 Nodes (2): FusionReconcilePattern, Per-partner bank reconciliation pattern aggregate. One row per (company_id, par ### Community 34 - "Community 34" Cohesion: 0.67 Nodes (2): AccountReconcileModel, Inherit account.reconcile.model to add Phase 1 AI integration hooks. This is a ### Community 35 - "Community 35" Cohesion: 0.67 Nodes (1): AiReasoningTooltip ### Community 36 - "Community 36" Cohesion: 0.67 Nodes (1): BankRecChatter ### Community 37 - "Community 37" Cohesion: 0.67 Nodes (1): BankRecButton ### Community 38 - "Community 38" Cohesion: 0.67 Nodes (1): BankRecStatementSummary ### Community 39 - "Community 39" Cohesion: 0.67 Nodes (1): BankRecMany2OneMultiID ### Community 40 - "Community 40" Cohesion: 1.0 Nodes (1): BankRecLineCard ### Community 41 - "Community 41" Cohesion: 1.0 Nodes (0): ### Community 42 - "Community 42" Cohesion: 1.0 Nodes (0): ### Community 43 - "Community 43" Cohesion: 1.0 Nodes (0): ### Community 44 - "Community 44" Cohesion: 1.0 Nodes (0): ### Community 45 - "Community 45" Cohesion: 1.0 Nodes (0): ### Community 46 - "Community 46" Cohesion: 1.0 Nodes (0): ### Community 47 - "Community 47" Cohesion: 1.0 Nodes (0): ### Community 48 - "Community 48" Cohesion: 1.0 Nodes (1): For each unreconciled bank line that doesn't have a recent pending sugge ### Community 49 - "Community 49" Cohesion: 1.0 Nodes (1): For each (company, partner) pair with precedents, recompute and upsert t ### Community 50 - "Community 50" Cohesion: 1.0 Nodes (1): Refresh the materialized view CONCURRENTLY using an autocommit cursor. ### Community 51 - "Community 51" Cohesion: 1.0 Nodes (1): Refresh the MV. If ``concurrently=True`` (default), uses REFRES ### Community 52 - "Community 52" Cohesion: 1.0 Nodes (1): Derive a preset configuration based on amls. For example if all amls hav ### Community 53 - "Community 53" Cohesion: 1.0 Nodes (0): ### Community 54 - "Community 54" Cohesion: 1.0 Nodes (0): ### Community 55 - "Community 55" Cohesion: 1.0 Nodes (0): ### Community 56 - "Community 56" Cohesion: 1.0 Nodes (1): Return the journal summary that seeds the kanban widget. ### Community 57 - "Community 57" Cohesion: 1.0 Nodes (1): Return enriched, paginated unreconciled bank lines. ### Community 58 - "Community 58" Cohesion: 1.0 Nodes (1): Return full detail for one line including pending suggestions. ### Community 59 - "Community 59" Cohesion: 1.0 Nodes (1): Trigger AI suggest for one or more statement lines. ### Community 60 - "Community 60" Cohesion: 1.0 Nodes (1): Accept a fusion suggestion. Returns the partial IDs created. ### Community 61 - "Community 61" Cohesion: 1.0 Nodes (1): Reconcile a line against an explicit set of journal items. ### Community 62 - "Community 62" Cohesion: 1.0 Nodes (1): Reverse one or more partial reconciles. ### Community 63 - "Community 63" Cohesion: 1.0 Nodes (1): Apply a write-off against a bank statement line. ### Community 64 - "Community 64" Cohesion: 1.0 Nodes (1): Batch auto-reconcile. Returns counts + per-line errors. ### Community 65 - "Community 65" Cohesion: 1.0 Nodes (1): Return a partner's reconcile history + learned pattern. ## Knowledge Gaps - **115 isolated node(s):** `Smoke tests for the fusion_unreconciled_bank_line_mv materialized view. Notes o`, `Tests for fusion.bulk.reconcile.wizard.`, `Local LLM compatibility test (LM Studio, Ollama, etc.). Skips if no local OpenA`, `Return (base_url, model_name) tuple, or (None, None) if no server. Tries LM`, `Smoke tests for the 5 new fusion bank-rec AI tools.` (+110 more) These have ≤1 connection - possible missing edges or undocumented components. - **Thin community `Community 40`** (2 nodes): `BankRecLineCard`, `bank_rec_kanban_renderer.js` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 41`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 42`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 43`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 44`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 45`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 46`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 47`** (1 nodes): `__manifest__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 48`** (1 nodes): `For each unreconciled bank line that doesn't have a recent pending sugge` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 49`** (1 nodes): `For each (company, partner) pair with precedents, recompute and upsert t` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 50`** (1 nodes): `Refresh the materialized view CONCURRENTLY using an autocommit cursor.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 51`** (1 nodes): `Refresh the MV. If ``concurrently=True`` (default), uses REFRES` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 52`** (1 nodes): `Derive a preset configuration based on amls. For example if all amls hav` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 53`** (1 nodes): `bank_rec_tours.js` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 54`** (1 nodes): `bank_reconciliation_service.js` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 55`** (1 nodes): `bank_rec_kanban_view.js` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 56`** (1 nodes): `Return the journal summary that seeds the kanban widget.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 57`** (1 nodes): `Return enriched, paginated unreconciled bank lines.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 58`** (1 nodes): `Return full detail for one line including pending suggestions.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 59`** (1 nodes): `Trigger AI suggest for one or more statement lines.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 60`** (1 nodes): `Accept a fusion suggestion. Returns the partial IDs created.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 61`** (1 nodes): `Reconcile a line against an explicit set of journal items.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 62`** (1 nodes): `Reverse one or more partial reconciles.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 63`** (1 nodes): `Apply a write-off against a bank statement line.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 64`** (1 nodes): `Batch auto-reconcile. Returns counts + per-line errors.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 65`** (1 nodes): `Return a partner's reconcile history + learned pattern.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. ## Suggested Questions _Questions this graph is uniquely positioned to answer:_ - **Why does `create()` connect `Community 0` to `Community 1`, `Community 4`, `Community 5`, `Community 6`, `Community 8`, `Community 10`, `Community 11`, `Community 18`?** _High betweenness centrality (0.179) - this node is a cross-community bridge._ - **Why does `useBankReconciliation()` connect `Community 7` to `Community 2`?** _High betweenness centrality (0.112) - this node is a cross-community bridge._ - **Are the 69 inferred relationships involving `create()` (e.g. with `.setUp()` and `.setUp()`) actually correct?** _`create()` has 69 INFERRED edges - model-reasoned connections that need verification._ - **Are the 53 inferred relationships involving `Candidate` (e.g. with `TestConfidenceScoring` and `When no AI provider config, score_ai_rerank stays at 0.0.`) actually correct?** _`Candidate` has 53 INFERRED edges - model-reasoned connections that need verification._ - **Are the 37 inferred relationships involving `make_bank_line()` (e.g. with `.test_mv_includes_unreconciled_line()` and `.test_mv_confidence_band_high_for_high_conf_suggestion()`) actually correct?** _`make_bank_line()` has 37 INFERRED edges - model-reasoned connections that need verification._ - **Are the 33 inferred relationships involving `MultiInvoiceStrategy` (e.g. with `TestMatchingStrategyInvariants` and `TestReconcileEngineInvariants`) actually correct?** _`MultiInvoiceStrategy` has 33 INFERRED edges - model-reasoned connections that need verification._ - **Are the 33 inferred relationships involving `AmountExactStrategy` (e.g. with `TestMatchingStrategyInvariants` and `TestReconcileEngineInvariants`) actually correct?** _`AmountExactStrategy` has 33 INFERRED edges - model-reasoned connections that need verification._