# Graph Report - /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets (2026-04-22) ## Corpus Check - 71 files · ~16,325 words - Verdict: corpus is large enough that graph structure adds value. ## Summary - 467 nodes · 660 edges · 46 communities detected - Extraction: 73% EXTRACTED · 27% INFERRED · 0% AMBIGUOUS · INFERRED: 179 edges (avg confidence: 0.8) - 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]] ## God Nodes (most connected - your core abstractions) 1. `compute_depreciation_schedule()` - 37 edges 2. `TestFusionAssetEngine` - 14 edges 3. `post_depreciation_entry()` - 14 edges 4. `predict_useful_life()` - 13 edges 5. `TestAssetsController` - 12 edges 6. `straight_line()` - 11 edges 7. `TestFusionAsset` - 10 edges 8. `TestAssetAnomalyDetection` - 10 edges 9. `TestAssetEngineIntegration` - 10 edges 10. `AssetsService` - 10 edges ## Surprising Connections (you probably didn't know these) - `compute_schedule()` --calls--> `compute_depreciation_schedule()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/controllers/assets_controller.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/models/fusion_asset_engine.py - `suggest_useful_life()` --calls--> `predict_useful_life()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/controllers/assets_controller.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/services/useful_life_predictor.py - `test_straight_line_total_equals_cost_minus_salvage()` --calls--> `straight_line()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/tests/test_engine_property.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/services/depreciation_methods.py - `test_straight_line_book_value_decreasing()` --calls--> `straight_line()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/tests/test_engine_property.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/services/depreciation_methods.py - `test_declining_balance_never_below_salvage()` --calls--> `declining_balance()` [INFERRED] /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/tests/test_engine_property.py → /Users/gurpreet/Github/Odoo-Modules/fusion_accounting_assets/services/depreciation_methods.py ## Communities ### Community 0 - "Community 0" Cohesion: 0.09 Nodes (15): FusionDepreciationRunWizard, Manual depreciation run wizard. Operator picks a period_date and the wizard pos, compute_depreciation_schedule(), dispose_asset(), partial_sale(), pause_asset(), post_depreciation_entry(), The asset engine — orchestrator for all asset depreciation + lifecycle. 7-metho (+7 more) ### Community 1 - "Community 1" Cohesion: 0.07 Nodes (21): declining_balance(), DepreciationStep, Depreciation method primitives. Three methods supported: - straight_line: equal, Equal charge per period: (cost - salvage) / n_periods. Last period absorbs, Apply `rate` (e.g. 0.20 = 20%) to remaining book each period. Switches to s, Charge per period = (units_used / total_expected) * (cost - salvage)., straight_line(), units_of_production() (+13 more) ### Community 2 - "Community 2" Cohesion: 0.07 Nodes (19): AssetAnomaly, detect_low_utilization(), detect_schedule_variance(), Asset utilization anomaly detection. Flags assets where actual usage / posted d, Compare expected accumulated depreciation vs actual posted., For units-of-production assets: flag low actual usage., FusionAssetBookValuesMV, MV of per-asset book value snapshot. Refresh via cron or model._refresh(). (+11 more) ### Community 3 - "Community 3" Cohesion: 0.06 Nodes (10): AssetsAdapter wiring tests — fusion-mode dispatch., TestAssetsAdapter, TestAuditReport, TestFusionAssetCategory, TestFusionAssetDisposal, Integration tests verifying all 3 depreciation methods through the engine., TestDecliningBalanceIntegration, TestStraightLineIntegration (+2 more) ### Community 4 - "Community 4" Cohesion: 0.07 Nodes (5): AiUsefulLifePanel, AssetDashboard, AssetDetailPanel, AssetsService, DisposalDialog ### Community 5 - "Community 5" Cohesion: 0.08 Nodes (9): HttpCase, Controller tests using HttpCase., TestAssetsController, Python wrappers that run the OWL tours via HttpCase.start_tour. Tours require a, TestAssetsTours, Controller perf benchmarks tagged 'benchmark'. Engine-level benchmarks live in, TestAssetsControllerBenchmarks, Performance benchmarks tagged 'benchmark'. (+1 more) ### Community 6 - "Community 6" Cohesion: 0.09 Nodes (16): _detect_local_llm(), Local LLM compat smoke test for the useful_life_predictor service. Auto-detects, _server_reachable(), TestLocalLLMUsefulLife, TestUsefulLifePredictor, TestUsefulLifePrompt, _get_provider(), predict_useful_life() (+8 more) ### Community 7 - "Community 7" Cohesion: 0.12 Nodes (3): FusionAsset, Fusion Asset model. Lifecycle: draft -> running -> (paused -> running)* -> disp, TestFusionAsset ### Community 8 - "Community 8" Cohesion: 0.14 Nodes (6): FusionCreateAssetWizard, _onchange_category_id(), Create-asset-from-invoice-line wizard. Reads an account.move.line as the source, Create the fusion.asset record + link to source invoice line., Call AI useful-life predictor., TestCreateAssetWizard ### Community 9 - "Community 9" Cohesion: 0.23 Nodes (7): compute_salvage_value(), Salvage value (scrap value) calculation helpers. Most clients use straight % of, Compute end-of-life salvage value., Estimate remaining value if asset is sold/scrapped now., remaining_useful_life_value(), SalvageConfig, TestSalvageValue ### Community 10 - "Community 10" Cohesion: 0.22 Nodes (4): FusionAssetDepreciationLine, Per-period depreciation board lines for an asset., Mark this line as posted (without creating the journal entry yet — engin, TestFusionAssetDepreciationLine ### Community 11 - "Community 11" Cohesion: 0.21 Nodes (3): FusionAssetAnomaly, Persisted asset anomaly flags from the engine's variance detection., TestFusionAssetAnomaly ### Community 12 - "Community 12" Cohesion: 0.24 Nodes (4): prorate_factor(), Prorating helpers for first-period and last-period depreciation. When an asset, Return a 0..1 factor for how much of `period`'s depreciation applies to an a, TestProrate ### Community 13 - "Community 13" Cohesion: 0.2 Nodes (6): FusionMigrationWizard, Assets-specific migration step. Backfills fusion.asset from existing account.as, Backfill fusion.asset from account.asset (Enterprise) if it exists., Override to add assets-bootstrap step., When Enterprise account.asset is NOT installed, step is a no-op., TestAssetsMigrationRoundTrip ### Community 14 - "Community 14" Cohesion: 0.18 Nodes (4): _compute_gain_loss(), FusionDisposalWizard, Asset disposal wizard (sale, scrap, donation, lost)., TestDisposalWizard ### Community 15 - "Community 15" Cohesion: 0.2 Nodes (4): _compute_sold_cost(), FusionPartialSaleWizard, Partial sale wizard (sell a portion of an asset). Splits the asset into a child, TestPartialSaleWizard ### Community 16 - "Community 16" Cohesion: 0.2 Nodes (7): compute_schedule(), dispose(), FusionAssetsController, _parse_date(), post_depreciation(), HTTP controller: 8 JSON-RPC endpoints for the OWL asset dashboard. All endpoint, suggest_useful_life() ### Community 17 - "Community 17" Cohesion: 0.18 Nodes (3): AccountMoveLine, Inherit account.move.line to link to fusion.asset records. Lets us trace assets, TestAccountMoveLineFusionAsset ### Community 18 - "Community 18" Cohesion: 0.25 Nodes (2): Tests for the 5 fusion-asset AI tools., TestFusionAssetTools ### Community 19 - "Community 19" Cohesion: 0.25 Nodes (3): Coexistence tests: fusion_accounting_assets menu only visible when Enterprise ac, Engine is registered regardless of Enterprise install state., TestAssetsCoexistence ### Community 20 - "Community 20" Cohesion: 0.5 Nodes (2): FusionAssetCategory, Asset categories with default settings (used as templates). ### Community 21 - "Community 21" Cohesion: 0.5 Nodes (2): FusionAssetDisposal, Asset disposal records (sale, scrap, donation). ### Community 22 - "Community 22" Cohesion: 0.5 Nodes (2): FusionAssetsMigrationAuditReport, QWeb PDF: migration audit report for fusion_accounting_assets. ### Community 23 - "Community 23" Cohesion: 0.67 Nodes (1): AnomalyStrip ### Community 24 - "Community 24" Cohesion: 0.67 Nodes (1): DepreciationBoard ### Community 25 - "Community 25" Cohesion: 1.0 Nodes (1): AssetCard ### 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 (1): For each running asset, post any due un-posted depreciation lines. ### Community 35 - "Community 35" Cohesion: 1.0 Nodes (1): Refresh the per-asset book value MV (hourly). ### Community 36 - "Community 36" Cohesion: 1.0 Nodes (1): For each running asset, compare expected accumulated depreciation vs pos ### Community 37 - "Community 37" Cohesion: 1.0 Nodes (1): Compute (or re-compute) the depreciation board for an asset. If recompu ### Community 38 - "Community 38" Cohesion: 1.0 Nodes (1): Post the next-due un-posted depreciation line. If period_date provided, ### Community 39 - "Community 39" Cohesion: 1.0 Nodes (1): Dispose an asset (sale, scrap, donation, lost). ### Community 40 - "Community 40" Cohesion: 1.0 Nodes (1): Partially dispose: split asset into two — sold child + remaining parent. ### Community 41 - "Community 41" Cohesion: 1.0 Nodes (1): Pause depreciation. Wraps asset.action_pause for API symmetry and to log ### Community 42 - "Community 42" Cohesion: 1.0 Nodes (1): Resume a paused asset. ### Community 43 - "Community 43" Cohesion: 1.0 Nodes (1): Reverse a disposal (rare — recovery from accidental sale entry). ### Community 44 - "Community 44" Cohesion: 1.0 Nodes (0): ### Community 45 - "Community 45" Cohesion: 1.0 Nodes (0): ## Knowledge Gaps - **72 isolated node(s):** `Integration tests verifying all 3 depreciation methods through the engine.`, `Property-based invariant tests for the asset engine. Hypothesis generates rando`, `Local LLM compat smoke test for the useful_life_predictor service. Auto-detects`, `Python wrappers that run the OWL tours via HttpCase.start_tour. Tours require a`, `Tests for the per-asset book value MV.` (+67 more) These have ≤1 connection - possible missing edges or undocumented components. - **Thin community `Community 25`** (2 nodes): `AssetCard`, `asset_card.js` 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): `For each running asset, post any due un-posted depreciation lines.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 35`** (1 nodes): `Refresh the per-asset book value MV (hourly).` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 36`** (1 nodes): `For each running asset, compare expected accumulated depreciation vs pos` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 37`** (1 nodes): `Compute (or re-compute) the depreciation board for an asset. If recompu` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 38`** (1 nodes): `Post the next-due un-posted depreciation line. If period_date provided,` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 39`** (1 nodes): `Dispose an asset (sale, scrap, donation, lost).` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 40`** (1 nodes): `Partially dispose: split asset into two — sold child + remaining parent.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 41`** (1 nodes): `Pause depreciation. Wraps asset.action_pause for API symmetry and to log` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 42`** (1 nodes): `Resume a paused asset.` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 43`** (1 nodes): `Reverse a disposal (rare — recovery from accidental sale entry).` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 44`** (1 nodes): `assets_tours.js` Too small to be a meaningful cluster - may be noise or needs more connections extracted. - **Thin community `Community 45`** (1 nodes): `asset_dashboard_view.js` 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 `compute_depreciation_schedule()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 5`, `Community 14`, `Community 15`, `Community 16`?** _High betweenness centrality (0.101) - this node is a cross-community bridge._ - **Why does `TestEngineBenchmarks` connect `Community 0` to `Community 3`, `Community 5`?** _High betweenness centrality (0.057) - this node is a cross-community bridge._ - **Why does `TestFusionAssetEngine` connect `Community 0` to `Community 3`?** _High betweenness centrality (0.052) - this node is a cross-community bridge._ - **Are the 32 inferred relationships involving `compute_depreciation_schedule()` (e.g. with `.test_straight_line_5yr_no_salvage()` and `.test_straight_line_10yr_with_salvage()`) actually correct?** _`compute_depreciation_schedule()` has 32 INFERRED edges - model-reasoned connections that need verification._ - **Are the 12 inferred relationships involving `post_depreciation_entry()` (e.g. with `.test_post_depreciation_entry_marks_line_posted()` and `.test_post_depreciation_only_after_running()`) actually correct?** _`post_depreciation_entry()` has 12 INFERRED edges - model-reasoned connections that need verification._ - **Are the 9 inferred relationships involving `predict_useful_life()` (e.g. with `.test_useful_life_with_local_llm()` and `.test_fallback_computer()`) actually correct?** _`predict_useful_life()` has 9 INFERRED edges - model-reasoned connections that need verification._ - **What connects `Integration tests verifying all 3 depreciation methods through the engine.`, `Property-based invariant tests for the asset engine. Hypothesis generates rando`, `Local LLM compat smoke test for the useful_life_predictor service. Auto-detects` to the rest of the system?** _72 weakly-connected nodes found - possible documentation gaps or missing edges._