- docs/architecture/: god-node map + report (2026-05-06), workflows.json/html + analysis snapshot - docs/plans/2026-05-13-public-landing-routing-refactor.md - docs/tutorials/build-a-page.md - abc-feat-self-serve-signup-phase-2-design-20260507-112020.md (root) Core dumps (core.144926, core.145678, docs/architecture/core.1392564) and agent .remember/ state are intentionally left untracked. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
19 KiB
title, date, tags
| title | date | tags | |||
|---|---|---|---|---|---|
| God Node Architecture Report | 2026-05-06 |
|
God Node Architecture Report — 2026-05-06
Summary
This is a static dependency and churn report for backend/app and frontend/src.
The main finding: ResolutionFlow has several expected infrastructure hubs, plus a smaller set of behavioral hubs that deserve care when touched. The highest-risk candidates are not the most-imported files; they are the files that combine high size, high churn, and many outbound dependencies.
Highest-risk behavioral hubs:
frontend/src/pages/AssistantChatPage.tsxfrontend/src/pages/TreeNavigationPage.tsxfrontend/src/pages/ProceduralNavigationPage.tsxbackend/app/services/flowpilot_engine.pybackend/app/api/endpoints/ai_sessions.pybackend/app/api/endpoints/sessions.pybackend/app/api/endpoints/trees.pybackend/app/api/endpoints/admin.py
Expected infrastructure hubs:
frontend/src/lib/utils.tsfrontend/src/types/index.tsfrontend/src/api/index.tsfrontend/src/api/client.tsfrontend/src/lib/toast.tsbackend/app/core/database.pybackend/app/api/deps.pybackend/app/core/config.py- SQLAlchemy models such as
User,Tree,AISession, andAccount
Do not treat all high-degree nodes as bad. A utility, type barrel, API barrel, router, or ORM model can be central by design. The suspicious shape is: high outbound dependencies + high churn + large file + multiple unrelated reasons to change.
Method
Inputs:
- Source files:
backend/app/**/*.py,frontend/src/**/*.ts,frontend/src/**/*.tsx - Excluded: tests, docs, migrations, build output, env files
- Static imports:
- Python: regex import extraction for
import ...andfrom ... import ... - TypeScript/TSX: static
import/export fromplus dynamicimport(...)
- Python: regex import extraction for
- Churn:
git log --name-only --since='90 days ago' - Size: line count
Scoring used for triage, not truth:
score = inbound_edges * 2
+ outbound_edges * 1.5
+ min(churn_90d, 30) * 1.2
+ min(lines_of_code / 100, 20)
Caveats:
backend/app/__init__.pyappears as a very high inbound node because static imports throughapp.*resolve through the package root in this simple parser. Ignore it as a parser artifact.- Barrel files (
frontend/src/api/index.ts,frontend/src/types/index.ts) intentionally create cycles with the modules they export. This is a known TypeScript graph artifact, not automatically a design flaw. - Static graphs do not show runtime call volume. This report answers “where is the code structurally central?” not “what is hot in production?”
Visual Map
Primary visualization:
- Open
docs/architecture/god-node-map-2026-05-06.canvasin Obsidian. - This uses Obsidian Canvas, so no community plugin is required.
- The Canvas groups nodes by interpretation instead of drawing every import edge.
The dense dependency graph is intentionally not the default view anymore. For architecture review, the useful split is:
- Which nodes are high-risk behavioral hubs?
- Which central nodes are expected infrastructure?
- What should self-serve signup avoid touching?
Risk Overview
flowchart LR
Work["Self-serve signup work"] --> Boundaries["Keep changes at boundaries"]
Boundaries --> BillingStore["useBillingStore"]
Boundaries --> Guards["router/dependency guards"]
Boundaries --> BillingService["BillingService"]
Assistant["AssistantChatPage.tsx\nfrontend god node"] -. avoid unrelated edits .-> Work
FlowPilot["flowpilot_engine.py\nbackend god node"] -. avoid unrelated edits .-> Work
AISessions["ai_sessions.py\ncontroller + mapper"] -. do not add billing logic .-> Work
SessionsTrees["sessions.py / trees.py\nlarge endpoint hubs"] -. mount guards, avoid handler sprawl .-> Work
Utils["utils / toast / api client / database\nexpected infrastructure"] -. do not refactor just because central .-> Work
Frontend Hotspots
flowchart TB
Router["router.tsx\nroute hub"] --> Assistant["AssistantChatPage.tsx\nhighest risk"]
Router --> TreeNav["TreeNavigationPage.tsx"]
Router --> ProcNav["ProceduralNavigationPage.tsx"]
Router --> TreeLibrary["TreeLibraryPage.tsx"]
Router --> TreeEditor["TreeEditorPage.tsx"]
Router --> SessionDetail["SessionDetailPage.tsx"]
Assistant --> ExtractA["Extract one workflow at a time"]
TreeNav --> ExtractB["Extract orchestration hooks when touched"]
ProcNav --> ExtractB
Infra["utils.ts / toast.ts / api/client.ts / types/index.ts"]
Assistant --> Infra
TreeNav --> Infra
ProcNav --> Infra
Backend Hotspots
flowchart TB
Deps["api/deps.py\nboundary hub"] --> DB["database + models\nexpected infrastructure"]
AISessions["api/endpoints/ai_sessions.py"] --> FlowPilot["services/flowpilot_engine.py"]
Sessions["api/endpoints/sessions.py"] --> Export["services/export_service.py"]
Trees["api/endpoints/trees.py"] --> DB
Admin["api/endpoints/admin.py"] --> DB
SelfServe["Self-serve backend"] --> Deps
SelfServe --> Billing["BillingService + subscriptions"]
SelfServe -. avoid .-> AISessions
SelfServe -. avoid .-> Sessions
SelfServe -. avoid .-> Trees
SelfServe -. avoid .-> FlowPilot
Obsidian Visualization Options
Best default: use the generated Canvas file. Obsidian Canvas is a core plugin and stores diagrams as .canvas files, so it works without adding community plugin risk.
Optional plugins worth considering:
- Excalidraw: best if you want hand-edited architecture diagrams that feel like a whiteboard.
- Markmind: useful if you want this report as a mind map or outline-first view.
- Diagrams.net / draw.io plugin: useful for formal boxes-and-arrows diagrams, but heavier than Canvas for this use case.
Recommendation: start with Canvas. Add Excalidraw only if you want to manually sketch over the architecture map during planning sessions.
Top Centrality Candidates
| Rank | File | In | Out | 90d churn | LOC | Classification | Read |
|---|---|---|---|---|---|---|---|
| 1 | frontend/src/lib/utils.ts |
225 | 0 | 1 | 32 | Infrastructure hub | Good |
| 2 | frontend/src/types/index.ts |
137 | 32 | 22 | 103 | Barrel hub | Watch |
| 3 | backend/app/core/database.py |
110 | 2 | 2 | 47 | Infrastructure hub | Good |
| 4 | backend/app/models/user.py |
90 | 7 | 13 | 130 | Domain model hub | Watch |
| 5 | frontend/src/api/index.ts |
38 | 40 | 26 | 41 | API barrel hub | Watch |
| 6 | frontend/src/lib/toast.ts |
79 | 0 | 1 | 72 | Infrastructure hub | Good |
| 7 | frontend/src/router.tsx |
1 | 72 | 48 | 308 | Router hub | Watch |
| 8 | backend/app/api/deps.py |
56 | 9 | 13 | 292 | Auth/dependency hub | Watch |
| 9 | backend/app/core/config.py |
44 | 1 | 27 | 232 | Config hub | Good, but churny |
| 10 | frontend/src/pages/AssistantChatPage.tsx |
2 | 39 | 77 | 2493 | Behavioral hub | High risk |
| 11 | backend/app/models/tree.py |
43 | 10 | 11 | 233 | Domain model hub | Watch |
| 12 | frontend/src/api/client.ts |
51 | 2 | 5 | 173 | API client hub | Good |
| 13 | frontend/src/pages/TreeNavigationPage.tsx |
2 | 31 | 33 | 1385 | Behavioral hub | High risk |
| 14 | frontend/src/components/ui/Button.tsx |
43 | 2 | 6 | 65 | UI primitive | Good |
| 15 | backend/app/models/ai_session.py |
32 | 11 | 11 | 314 | Domain model hub | Watch |
| 16 | frontend/src/pages/ProceduralNavigationPage.tsx |
1 | 33 | 22 | 1021 | Behavioral hub | High risk |
| 17 | frontend/src/pages/TreeLibraryPage.tsx |
3 | 27 | 38 | 546 | Behavioral hub | Medium risk |
| 18 | backend/app/models/account.py |
29 | 11 | 8 | 70 | Domain model hub | Watch |
| 19 | backend/app/api/endpoints/sessions.py |
0 | 24 | 26 | 1186 | Endpoint hub | High risk |
| 20 | frontend/src/pages/TreeEditorPage.tsx |
2 | 20 | 28 | 928 | Behavioral hub | Medium risk |
| 21 | frontend/src/pages/SessionDetailPage.tsx |
2 | 21 | 28 | 623 | Behavioral hub | Medium risk |
| 22 | backend/app/api/endpoints/trees.py |
0 | 20 | 23 | 1332 | Endpoint hub | High risk |
| 23 | backend/app/api/endpoints/ai_sessions.py |
0 | 15 | 32 | 1173 | Endpoint hub | High risk |
| 24 | backend/app/services/flowpilot_engine.py |
1 | 17 | 20 | 1793 | Behavioral service hub | High risk |
Findings
1. AssistantChatPage.tsx Is The Clearest Frontend God Node
Evidence:
- 2,493 LOC
- 39 outbound dependencies
- 77 changes in 90 days
- Owns routing, chat selection, magic-moment pickup state, task-lane state, upload state, facts, suggested fixes, preview state, script-builder surfaces, modals, keyboard shortcuts, local/session storage, and message rendering orchestration.
Classification: behavioral god node.
This file has too many reasons to change. It is not dangerous because many files import it; it is dangerous because it imports many things, owns many workflows, and changes constantly.
Recommended response:
- Do not do a broad refactor in isolation.
- When touching it, extract one workflow at a time behind a hook or controller:
useTaskLaneStateusePilotPickupuseSuggestedFixPreviewuseSessionFactsuseScriptBuilderPanelState
- Keep the page as an orchestrator, but move state machines and async effects out.
- Before major changes, add narrow regression tests around task-lane ownership and session switching.
Priority: high, opportunistic refactor.
2. flowpilot_engine.py Is A Real Backend Behavioral Hub
Evidence:
- 1,793 LOC
- 17 outbound dependencies
- 20 changes in 90 days
- Owns prompts, structured output parsing, session start, step generation, confidence, close/resolve/escalate behaviors, and likely several persistence transitions.
Classification: behavioral service hub.
This is not surprising: FlowPilot is core product logic. The risk is that prompt text, model call orchestration, persistence, and business rules live close together.
Recommended response:
- Keep this file stable during unrelated work.
- Extract only when a change naturally creates a seam:
- prompt construction
- structured output validation
- session state transition persistence
- documentation/status update generation
- Avoid routing new self-serve billing or account logic through this service.
Priority: high, but avoid speculative refactor.
3. AI Session Endpoint Is Acting As A Controller Plus Mapper
File: backend/app/api/endpoints/ai_sessions.py
Evidence:
- 1,173 LOC
- 15 outbound dependencies
- 32 changes in 90 days
- Contains endpoint handlers, quota checks, response mapping, ownership behavior, chat wiring, and PSA retry integration.
Classification: endpoint god node.
The endpoint does more than route HTTP to services. Some helper logic is fine, but the mapper and ownership rules should stay stable and test-backed.
Recommended response:
- Keep endpoint handlers thin when adding new features.
- Move reusable mapping logic such as
_build_session_detailto a schema/service helper if it is touched again. - Do not add subscription or onboarding behavior directly here; mount dependencies at router level where possible.
Priority: high for change discipline, medium for refactor.
4. Classic Session And Tree Endpoints Are Large, But Mostly Expected
Files:
backend/app/api/endpoints/sessions.pybackend/app/api/endpoints/trees.py
Evidence:
sessions.py: 1,186 LOC, 24 outbound dependencies, 26 changestrees.py: 1,332 LOC, 20 outbound dependencies, 23 changes
Classification: endpoint hubs.
These files are not surprising in a CRUD-heavy FastAPI app, but they are large enough that behavioral additions should be routed through services or focused helpers.
Recommended response:
- For new subscription guards, mount dependencies instead of inserting repeated checks inside handlers.
- For new tree/session behavior, prefer service functions over adding more endpoint-local logic.
- Add regression tests before modifying export, sharing, ownership, or limit-check paths.
Priority: medium-high.
5. Frontend Page-Level Hubs Are The Main UI Risk
Files:
frontend/src/pages/TreeNavigationPage.tsxfrontend/src/pages/ProceduralNavigationPage.tsxfrontend/src/pages/TreeLibraryPage.tsxfrontend/src/pages/TreeEditorPage.tsxfrontend/src/pages/SessionDetailPage.tsx
Pattern:
- High outbound dependencies
- Meaningful churn
- Page components own orchestration plus rendering
Recommended response:
- Treat page components as shells where possible.
- Extract stable workflow hooks before adding another workflow.
- Keep design updates scoped to subcomponents.
- Avoid adding global state unless the state truly spans routes.
Priority: medium, with TreeNavigationPage.tsx and ProceduralNavigationPage.tsx highest.
6. Auth Store Is Central But Not Yet A Problem
File: frontend/src/store/authStore.ts
Evidence:
- 21 inbound dependencies
- 5 outbound dependencies
- 144 LOC
- 6 changes in 90 days
Classification: central state hub.
This is a normal app hub. It becomes risky if billing, onboarding, feature gates, and auth all accumulate here. The self-serve spec’s choice to create useBillingStore instead of embedding billing state in /auth/me is the right architectural direction.
Recommended response:
- Keep auth store focused on identity/session/account bootstrap.
- Put billing in
useBillingStore. - Put onboarding wizard state in a narrow API/hook, not in auth.
Priority: watch.
7. Barrels Are Creating A Large Frontend Cycle
Cycle:
- 42 files under
frontend/src/api/* - Driven by
frontend/src/api/index.tsexporting modules while some modules import from the barrel or shareapiClient.
Classification: barrel cycle / tooling artifact with some real coupling risk.
This is common and not urgent. It can confuse static tools and make imports less explicit.
Recommended response:
- Prefer direct imports from concrete API modules in new code:
- Good:
import { aiSessionsApi } from '@/api/aiSessions' - Avoid:
import { aiSessionsApi } from '@/api'
- Good:
- Keep
api/index.tsonly for broad convenience if it remains useful. - Do not spend time untangling old imports unless dependency tooling starts enforcing boundaries.
Priority: low.
8. Backend ORM Model Cycles Are Expected
Cycle:
- 17 files across account/user/tree/session/subscription/category/share models
- 5 files across AI session branch/handoff/step models
Classification: SQLAlchemy relationship cycle.
This is expected in an ORM with bidirectional relationships. It does not mean the model layer is broken.
Recommended response:
- Keep imports guarded with
TYPE_CHECKINGwhere possible. - Keep model methods thin.
- Put behavior in services, not model properties beyond simple derived flags.
Priority: low.
Ranked Action List
Do Now
No immediate large refactor is recommended before self-serve signup work. The report does not show a blocker.
Do During Self-Serve Work
- Keep
useBillingStoreseparate fromauthStore. - Mount subscription and email verification guards at router/dependency boundaries, not inside individual endpoint handlers.
- Keep new billing service behavior out of existing
ai_sessions.py,sessions.py, andtrees.pyexcept for dependency wiring. - Prefer direct frontend API imports over
@/apibarrel imports in new code.
Do Opportunistically
- Extract one workflow at a time from
AssistantChatPage.tsx. - Extract prompt construction or structured response validation from
flowpilot_engine.pywhen touched. - Move response mapping helpers out of
ai_sessions.pyif those helpers change again. - Split page-level orchestration hooks out of
TreeNavigationPage.tsxandProceduralNavigationPage.tsxas features touch them.
Avoid
- Do not split
utils.ts,toast.ts,api/client.ts, orcore/database.pyjust because they are central. - Do not refactor ORM model cycles unless they cause import/runtime issues.
- Do not start a broad barrel-file cleanup unless tooling or build performance requires it.
Raw Metrics Snapshot
Total analyzed files: 783
Total static import edges: 2,946
Top inbound hubs:
| File | Inbound | Outbound | 90d churn | LOC | Note |
|---|---|---|---|---|---|
frontend/src/lib/utils.ts |
225 | 0 | 1 | 32 | Healthy utility hub |
frontend/src/types/index.ts |
137 | 32 | 22 | 103 | Barrel hub |
backend/app/core/database.py |
110 | 2 | 2 | 47 | Healthy infrastructure hub |
backend/app/models/user.py |
90 | 7 | 13 | 130 | Domain model hub |
frontend/src/lib/toast.ts |
79 | 0 | 1 | 72 | Healthy utility hub |
backend/app/api/deps.py |
56 | 9 | 13 | 292 | Auth/dependency hub |
frontend/src/api/client.ts |
51 | 2 | 5 | 173 | API infrastructure hub |
backend/app/core/config.py |
44 | 1 | 27 | 232 | Config hub, high churn |
backend/app/models/tree.py |
43 | 10 | 11 | 233 | Domain model hub |
frontend/src/components/ui/Button.tsx |
43 | 2 | 6 | 65 | UI primitive |
Top outbound hubs:
| File | Inbound | Outbound | 90d churn | LOC | Note |
|---|---|---|---|---|---|
frontend/src/router.tsx |
1 | 72 | 48 | 308 | Router hub, acceptable |
frontend/src/api/index.ts |
38 | 40 | 26 | 41 | Barrel hub |
frontend/src/pages/AssistantChatPage.tsx |
2 | 39 | 77 | 2493 | High-risk behavioral hub |
frontend/src/pages/ProceduralNavigationPage.tsx |
1 | 33 | 22 | 1021 | High-risk behavioral hub |
frontend/src/pages/TreeNavigationPage.tsx |
2 | 31 | 33 | 1385 | High-risk behavioral hub |
frontend/src/pages/TreeLibraryPage.tsx |
3 | 27 | 38 | 546 | Medium-risk page hub |
backend/app/api/endpoints/sessions.py |
0 | 24 | 26 | 1186 | High-risk endpoint hub |
backend/app/api/endpoints/admin.py |
0 | 22 | 10 | 1430 | Admin endpoint hub |
frontend/src/pages/SessionDetailPage.tsx |
2 | 21 | 28 | 623 | Medium-risk page hub |
backend/app/api/endpoints/auth.py |
0 | 20 | 9 | 721 | Auth endpoint hub |
backend/app/api/endpoints/trees.py |
0 | 20 | 23 | 1332 | High-risk endpoint hub |
frontend/src/pages/ProceduralEditorPage.tsx |
1 | 20 | 16 | 475 | Medium-risk page hub |
frontend/src/pages/TreeEditorPage.tsx |
2 | 20 | 28 | 928 | Medium-risk page hub |
Detected cycles:
| Size | Area | Interpretation |
|---|---|---|
| 42 | frontend/src/api/* |
Barrel/export cycle. Low urgency. |
| 17 | backend ORM models | Expected SQLAlchemy relationship cycle. Low urgency. |
| 5 | backend AI session models | Expected relationship cycle. Low urgency. |
| 2 | tree preview components | Small component cycle; inspect only if these files become troublesome. |
How To Re-run
The current environment does not have native Python, so this report was generated with Node-based static parsing plus shell/git commands. A future repeat can use a dedicated script if this becomes a regular architecture check.
Suggested future command shape:
node scripts/architecture/god-node-report.mjs
If this becomes a recurring check, add:
scripts/architecture/god-node-report.mjsdocs/architecture/god-node-report-YYYY-MM-DD.md- optional
docs/architecture/god-node-graph-YYYY-MM-DD.mmd