# Graph Report - /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai (2026-04-22) ## Corpus Check - 61 files · ~40,430 words - Verdict: corpus is large enough that graph structure adds value. ## Summary - 602 nodes · 894 edges · 40 communities detected - Extraction: 79% EXTRACTED · 21% INFERRED · 0% AMBIGUOUS · INFERRED: 192 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]] ## God Nodes (most connected - your core abstractions) 1. `FusionChatPanel` - 38 edges 2. `DataAdapter` - 38 edges 3. `get_adapter()` - 37 edges 4. `FollowupAdapter` - 28 edges 5. `ReportsAdapter` - 27 edges 6. `FusionAccountingAgent` - 22 edges 7. `FusionInteractiveTable` - 21 edges 8. `BankRecAdapter` - 20 edges 9. `AssetsAdapter` - 15 edges 10. `AdapterMode` - 14 edges ## Surprising Connections (you probably didn't know these) - `Community shape + fusion AI fields (top suggestion, band, attachments).` --uses--> `DataAdapter` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/bank_rec.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/base.py - `Return AI suggestions per bank line. Shape: ``{line_id: [{'id', 'rank',` --uses--> `DataAdapter` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/bank_rec.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/base.py - `Accept a fusion AI suggestion and reconcile against its proposal. Retur` --uses--> `DataAdapter` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/bank_rec.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/base.py - `Reverse a reconciliation by partial IDs. Returns ``{'unreconciled_line_` --uses--> `DataAdapter` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/bank_rec.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/base.py - `Engine-free unreconcile for installs without fusion_accounting_bank_rec.` --uses--> `DataAdapter` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/bank_rec.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_ai/services/data_adapters/base.py ## Communities ### Community 0 - "Community 0" Cohesion: 0.04 Nodes (6): FusionApprovalCard, FusionChatPanel, inlineFormat(), mdToHtml(), parseFusionTableBlock(), FusionInteractiveTable ### Community 1 - "Community 1" Cohesion: 0.05 Nodes (21): _compute_display_label(), _compute_tool_display_name(), FusionAccountingMatchHistory, FusionAccountingRule, FusionAccountingAgent, Build a one-line summary of what a tool call did, for the collapsed tool log., Build a rich approval payload so the UI can show exactly what's being approved., Smart model routing: Haiku for routine tool calling, Sonnet for complex analysis (+13 more) ### Community 2 - "Community 2" Cohesion: 0.04 Nodes (39): BankRecAdapter, Return AI suggestions per bank line. Shape: ``{line_id: [{'id', 'rank',, Accept a fusion AI suggestion and reconcile against its proposal. Retur, Reverse a reconciliation by partial IDs. Returns ``{'unreconciled_line_, Engine-free unreconcile for installs without fusion_accounting_bank_rec., Community shape + fusion AI fields (top suggestion, band, attachments)., check_recurring_pattern(), _extract_partner_from_ref() (+31 more) ### Community 3 - "Community 3" Cohesion: 0.05 Nodes (37): get_ap_aging(), Return AP aging buckets. Routed through FollowupAdapter for tri-mode consistency, get_ar_aging(), get_followup_report(), get_overdue_invoices(), get_partner_balance(), Return the follow-up report HTML for a partner. Routed through FollowupAdapter., Return overdue customer invoices. Routed through FollowupAdapter. (+29 more) ### Community 4 - "Community 4" Cohesion: 0.07 Nodes (30): Assets data adapter — routes asset queries through fusion engine if installed., Bank reconciliation data adapter. Routes bank-rec data lookups across: - FUSION, Return unreconciled bank statement lines. All filter params are optiona, AdapterMode, DataAdapter, Base class. Subclasses set FUSION_MODEL and ENTERPRISE_MODULE class attrs an, Pick FUSION if the model is loaded, else ENTERPRISE if the module is ins, Follow-up data adapter. Routes follow-up / aged-balance / collections data look (+22 more) ### Community 5 - "Community 5" Cohesion: 0.05 Nodes (27): audit_account_balances(), audit_reconciliation_integrity(), audit_tax_compliance(), check_hash_chain(), check_sequence_gaps(), get_audit_report(), run_full_audit(), fusion_generate_followup_text() (+19 more) ### Community 6 - "Community 6" Cohesion: 0.07 Nodes (14): Look up _via_ on self and call it. E.g. method_name=, _company_id(), fusion_compare_periods(), fusion_drill_down_report_line(), fusion_generate_commentary(), fusion_get_anomalies(), fusion_run_report(), Fusion-engine-routed AI tools for financial reports. These 5 tools route throug (+6 more) ### Community 7 - "Community 7" Cohesion: 0.08 Nodes (14): LLMProvider, LLMProvider contract - every adapter must conform. Phase 1 generalisation: make, Contract every LLM backend must satisfy. Adapters declare capabilities as cl, Plain text completion. Required for ALL providers. Returns: {'content':, Tool-calling completion. Optional - caller checks supports_tool_calling first., Embeddings. Optional - caller checks supports_embeddings first. Returns, ClaudeAdapter, FusionAccountingAdapterClaude (+6 more) ### Community 8 - "Community 8" Cohesion: 0.11 Nodes (13): FusionAccountingSession, get_execution_state(), Get the current execution state for a session (called by polling endpoint)., approve_action(), approve_all(), chat(), chat_status(), close_session() (+5 more) ### Community 9 - "Community 9" Cohesion: 0.1 Nodes (13): AccountMoveAuditHook, create_vendor_bill(), find_similar_bank_lines(), Search for partners/vendors by name keyword., Find past reconciled bank lines with similar description to suggest coding patte, [Tier 3] Create a vendor bill (account.move with move_type='in_invoice'). Re, [Tier 3] Register payment on a posted vendor bill and optionally reconcile to ba, register_bill_payment() (+5 more) ### Community 10 - "Community 10" Cohesion: 0.13 Nodes (3): _bucket_for_days(), FollowupAdapter, Shared aging-bucket implementation for receivable/payable accounts. Ret ### Community 11 - "Community 11" Cohesion: 0.12 Nodes (5): fusion_dispose_asset(), fusion_suggest_asset_useful_life(), Fusion-engine-routed AI tools for asset management., AssetsAdapter, DataAdapter ### Community 12 - "Community 12" Cohesion: 0.14 Nodes (10): create_payroll_journal_entry(), get_cra_remittance_due(), get_cra_remittance_status(), get_payroll_cost_report(), get_payroll_entries(), prepare_cra_payment(), Resolve an account code or ID to a valid account ID. Accepts: integer ID, st, _resolve_account_id() (+2 more) ### Community 13 - "Community 13" Cohesion: 0.2 Nodes (1): FusionAccountingDashboard ### Community 14 - "Community 14" Cohesion: 0.25 Nodes (2): Register payments for a batch of ADP invoices from a remittance advice. Tak, register_adp_batch_payment() ### Community 15 - "Community 15" Cohesion: 0.33 Nodes (1): FusionDashboard ### Community 16 - "Community 16" Cohesion: 0.4 Nodes (2): get_inventory_turnover(), get_stock_valuation() ### Community 17 - "Community 17" Cohesion: 0.5 Nodes (2): FusionVendorTaxProfile, Rebuild all vendor tax profiles from posted bill history. Called by cron ### Community 18 - "Community 18" Cohesion: 0.5 Nodes (2): FusionRecurringPattern, Scan reconciled bank lines for recurring patterns and cache how they were coded. ### Community 19 - "Community 19" Cohesion: 0.5 Nodes (1): FusionHealthCard ### Community 20 - "Community 20" Cohesion: 0.5 Nodes (3): build_prompt(), Bank reconciliation AI re-rank prompt. Used by fusion_accounting_bank_rec/servi, Build (system_prompt, user_prompt) for AI re-rank. Args: statement_ ### Community 21 - "Community 21" Cohesion: 0.67 Nodes (1): Reassign ir_model_data ownership from fusion_accounting to fusion_accounting_ai. ### Community 22 - "Community 22" Cohesion: 0.67 Nodes (1): FusionRuleWizard ### Community 23 - "Community 23" Cohesion: 1.0 Nodes (0): ### Community 24 - "Community 24" Cohesion: 1.0 Nodes (1): FusionAccountingTool ### Community 25 - "Community 25" Cohesion: 1.0 Nodes (1): ResConfigSettings ### Community 26 - "Community 26" Cohesion: 1.0 Nodes (0): ### Community 27 - "Community 27" Cohesion: 1.0 Nodes (0): ### Community 28 - "Community 28" Cohesion: 1.0 Nodes (0): ### Community 29 - "Community 29" Cohesion: 1.0 Nodes (0): ### Community 30 - "Community 30" Cohesion: 1.0 Nodes (0): ### Community 31 - "Community 31" Cohesion: 1.0 Nodes (0): ### Community 32 - "Community 32" Cohesion: 1.0 Nodes (0): ### Community 33 - "Community 33" Cohesion: 1.0 Nodes (0): ### Community 34 - "Community 34" Cohesion: 1.0 Nodes (0): ### Community 35 - "Community 35" Cohesion: 1.0 Nodes (1): Poll the live execution state of a running chat — returns thinking text, ### Community 36 - "Community 36" Cohesion: 1.0 Nodes (1): Live search for matching journal items — called directly by the reconcil ### Community 37 - "Community 37" Cohesion: 1.0 Nodes (1): List recent sessions for the session picker dropdown. ### Community 38 - "Community 38" Cohesion: 1.0 Nodes (1): Automatically reconcile inter-account credit card payments. When a paym ### Community 39 - "Community 39" Cohesion: 1.0 Nodes (1): Reconcile payroll cheque bank lines using writeoff to Payroll Liabilities (2201) ## Knowledge Gaps - **86 isolated node(s):** `Reassign ir_model_data ownership from fusion_accounting to fusion_accounting_ai.`, `Verify ir_model_data ownership transferred from fusion_accounting to fusion_acco`, `No fusion-related model/view/data record should still claim module='fusion_accou`, `Spot-check that key xml-ids are reachable under the new module name.`, `FusionAccountingTool` (+81 more) These have ≤1 connection - possible missing edges or undocumented components. - **Thin community `Community 23`** (2 nodes): `get_db_param()`, `test_claude_api.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 24`** (2 nodes): `FusionAccountingTool`, `accounting_tool.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 25`** (2 nodes): `ResConfigSettings`, `accounting_config.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 26`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 27`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 28`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 29`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 30`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 31`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 32`** (1 nodes): `__init__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 33`** (1 nodes): `__manifest__.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 34`** (1 nodes): `test_api_live.py` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 35`** (1 nodes): `Poll the live execution state of a running chat — returns thinking text,` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 36`** (1 nodes): `Live search for matching journal items — called directly by the reconcil` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 37`** (1 nodes): `List recent sessions for the session picker dropdown.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 38`** (1 nodes): `Automatically reconcile inter-account credit card payments. When a paym` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 39`** (1 nodes): `Reconcile payroll cheque bank lines using writeoff to Payroll Liabilities (2201)` 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 `get_audit_report()` connect `Community 5` to `Community 1`?** _High betweenness centrality (0.205) - this node is a cross-community bridge._ - **Why does `FusionInteractiveTable` connect `Community 0` to `Community 1`?** _High betweenness centrality (0.184) - this node is a cross-community bridge._ - **Why does `get_adapter()` connect `Community 3` to `Community 2`, `Community 4`, `Community 5`, `Community 6`, `Community 11`?** _High betweenness centrality (0.168) - this node is a cross-community bridge._ - **Are the 33 inferred relationships involving `DataAdapter` (e.g. with `TestDataAdapterBase` and `TestBankRecAdapter`) actually correct?** _`DataAdapter` has 33 INFERRED edges - model-reasoned connections that need verification._ - **Are the 35 inferred relationships involving `get_adapter()` (e.g. with `.test_list_unreconciled_returns_our_test_line()` and `.test_trial_balance_returns_rows_in_pure_community()`) actually correct?** _`get_adapter()` has 35 INFERRED edges - model-reasoned connections that need verification._ - **What connects `Reassign ir_model_data ownership from fusion_accounting to fusion_accounting_ai.`, `Verify ir_model_data ownership transferred from fusion_accounting to fusion_acco`, `No fusion-related model/view/data record should still claim module='fusion_accou` to the rest of the system?** _86 weakly-connected nodes found - possible documentation gaps or missing edges._ - **Should `Community 0` be split into smaller, more focused modules?** _Cohesion score 0.04 - nodes in this community are weakly interconnected._