# samuelfriher/tfg-fraud-detection-gnn architecture

> Architecture diagram of the GitHub repository samuelfriher/tfg-fraud-detection-gnn, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-17). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/samuelfriher/tfg-fraud-detection-gnn
- Repository: https://github.com/samuelfriher/tfg-fraud-detection-gnn

## Overview

1. This repository is a benchmarking and experimentation framework for AML fraud detection, centered on two competing model families: traditional tabular ML and a custom graph neural network. The main architectural boundary is the pipeline layer, which orchestrates preprocessing, model training, evaluation, explainability, and experiment logging.

2. The entry point is a unified CLI in `src/cli.py`. It routes commands into separate workflows for:
- traditional model training,
- GNN training,
- GNN hyperparameter grid search,
- results retrieval/export.
This makes the CLI the top-level control plane for the whole repo.

3. Configuration is externalized in TOML files under `configs/` and parsed by `src/config/experiment_config.py`. The presence of separate small/large configs for traditional and GNN runs indicates the pipelines are parameterized for different dataset scales or experiment scopes rather than hard-coded around one setup.

##### The data subsystem in `src/data/` is split by responsibility
- preprocessing of the raw AML dataset,
- graph construction,
- node and edge feature extraction,
- Neo4j-based feature loading/extraction.
This suggests a two-path data flow: a tabular path for traditional models and a graph-enriched path for the GNN.

5. Neo4j is an important architectural dependency, but it is optional at runtime. The README and the `neo4j_loader` / `neo4j_feature_extractor` modules indicate the system can project graphs into Neo4j and pull graph analytics features such as PageRank, WCC, and FastRP. If Neo4j is unavailable, the pipeline falls back to basic statistics, so graph feature augmentation is a best-effort enrichment layer rather than a hard requirement.

6. Traditional ML lives in `src/models/traditional/` as separate wrappers for XGBoost, LightGBM, Random Forest, and SVM. This is a model-adapter design: the pipeline can treat each algorithm through a common interface while still allowing library-specific behavior, including GPU-accelerated cuML-backed execution for some models when available.

7. The GNN stack is custom and self-contained under `src/models/gnn/`. It includes model definition, layers, loss, evaluation, and data loading utilities. The README identifies the core architecture as a MEGA-PNA encoder with an edge classifier, which means the model predicts at the transaction-edge level rather than only node classes. This is the main differentiator from the traditional tabular models.

8. Pipeline orchestration is separated from model code in `src/pipelines/`. There are distinct orchestrators for traditional training, GNN training, and GNN grid search, plus a results exporter. This separation matters because experiment coordination, not model definition, owns cross-cutting concerns like data preparation order, metric aggregation, and artifact generation.

9. Explainability is a first-class subsystem in `src/explainability/`. Traditional models use SHAP-based explainers, while the GNN path uses GNNExplainer for edge-level interpretation. Visualizers are isolated from explainer logic, which implies the repo treats explanation generation and explanation presentation as separate concerns.

10. Experiment tracking is handled in `src/tracking/experiment_tracker.py`, with MLflow as the persistence layer and SQLite as the local backend according to the README. The tracking layer sits beside pipelines rather than inside models, so metrics, parameters, and artifacts are captured uniformly regardless of which algorithm family is running.

11. `src/utils/` provides supporting infrastructure rather than domain logic: filesystem/path helpers, logging, GPU availability checks, and data management. The GPU check is especially relevant because it influences runtime behavior in both the traditional SVM/Random Forest path and the GNN stack.

12. The repo is designed for reproducible local development through the `.devcontainer/` setup, which bundles Python and a Neo4j service. That means the expected runtime architecture is “single developer environment with local services,” not a distributed production deployment.

13. Tests mirror the source tree closely under `tests/`, which reinforces the intended boundaries: configuration, data preparation, models, pipelines, tracking, and utilities are all independently verifiable. This test layout is useful for diagramming because it reflects the actual module seams in the system.

Main entry points: [`src/pipelines/gnn_pipeline.py`](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/gnn_pipeline.py) (GNN train), [`src/cli.py`](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/cli.py) (CLI), [`src/models/gnn/model.py`](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/model.py) (GNN model), [`src/pipelines/traditional_pipeline.py`](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/traditional_pipeline.py) (Trad train)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_control["Control plane"]
  node_src_cli["CLI<br/>entrypoint<br/>[cli.py]"]
  node_experiment_config["Config"]
end

subgraph group_data["Data layer"]
  node_preprocessor["Preprocess<br/>data prep<br/>[preprocessor.py]"]
  node_graph_builder["Graph build<br/>graph construction<br/>[graph_builder.py]"]
  node_node_feature_extractor["Node feats<br/>feature extraction"]
  node_edge_feature_extractor["Edge feats<br/>feature extraction"]
  node_neo4j_loader[("Neo4j load<br/>graph export/import<br/>[neo4j_loader.py]")]
  node_neo4j_feature_extractor[("Neo4j feats<br/>graph analytics")]
end

subgraph group_models["Model layer"]
  node_traditional_models["Tabular ML<br/>model adapters"]
  node_xgboost_model["XGBoost<br/>tabular model<br/>[xgboost_model.py]"]
  node_lightgbm_model["LightGBM<br/>tabular model<br/>[lightgbm_model.py]"]
  node_random_forest_model["Random Forest<br/>tabular model"]
  node_svm_model["SVM<br/>tabular model<br/>[svm_model.py]"]
  node_gnn_model["GNN model<br/>MEGA-PNA<br/>[model.py]"]
  node_gnn_layers["GNN layers<br/>message passing<br/>[layers.py]"]
  node_gnn_loss["GNN loss<br/>objective<br/>[loss.py]"]
  node_gnn_evaluator["GNN eval<br/>metrics<br/>[evaluator.py]"]
  node_gnn_data_loader["GNN data<br/>data loader<br/>[data_loader.py]"]
end

subgraph group_pipelines["Pipelines"]
  node_traditional_pipeline["Trad train<br/>orchestrator"]
  node_gnn_pipeline["GNN train<br/>orchestrator<br/>[gnn_pipeline.py]"]
  node_gnn_grid_search["Grid search<br/>experiment search<br/>[gnn_grid_search.py]"]
  node_results_exporter["Results export<br/>artifact export"]
end

subgraph group_explainability["Explainability"]
  node_traditional_explainer["SHAP<br/>explanation"]
  node_gnn_explainer["GNNExplainer<br/>explanation<br/>[gnn_explainer.py]"]
  node_visualizers["Visuals<br/>presentation<br/>[visualizers.py]"]
end

subgraph group_tracking["Tracking"]
  node_experiment_tracker[("MLflow<br/>experiment tracking")]
end

subgraph group_utils["Utilities"]
  node_logger["Logger<br/>runtime support<br/>[logger.py]"]
  node_gpu_availability["GPU check<br/>runtime support"]
  node_paths["Paths<br/>filesystem support<br/>[paths.py]"]
end

subgraph group_runtime["Developer runtime"]
  node_devcontainer["Dev env<br/>local runtime<br/>[devcontainer.json]"]
end

node_src_cli -->|"loads"| node_experiment_config
node_src_cli -->|"runs"| node_traditional_pipeline
node_src_cli -->|"runs"| node_gnn_pipeline
node_src_cli -->|"runs"| node_gnn_grid_search
node_src_cli -->|"exports"| node_results_exporter
node_traditional_pipeline -->|"uses"| node_preprocessor
node_traditional_pipeline -->|"trains"| node_traditional_models
node_gnn_pipeline -->|"uses"| node_preprocessor
node_gnn_pipeline -->|"builds"| node_graph_builder
node_gnn_pipeline -->|"feeds"| node_gnn_data_loader
node_gnn_pipeline -->|"trains"| node_gnn_model
node_gnn_grid_search -->|"iterates"| node_gnn_pipeline
node_gnn_pipeline -->|"logs"| node_experiment_tracker
node_traditional_pipeline -->|"logs"| node_experiment_tracker
node_traditional_models -->|"includes"| node_xgboost_model
node_traditional_models -->|"includes"| node_lightgbm_model
node_traditional_models -->|"includes"| node_random_forest_model
node_traditional_models -->|"includes"| node_svm_model
node_gnn_model -->|"composes"| node_gnn_layers
node_gnn_model -->|"optimizes"| node_gnn_loss
node_gnn_model -->|"evaluates"| node_gnn_evaluator
node_graph_builder -->|"derives"| node_node_feature_extractor
node_graph_builder -->|"derives"| node_edge_feature_extractor
node_graph_builder -.->|"optional sync"| node_neo4j_loader
node_neo4j_loader -->|"enriches"| node_neo4j_feature_extractor
node_neo4j_feature_extractor -->|"augments"| node_graph_builder
node_traditional_models -->|"explains"| node_traditional_explainer
node_gnn_model -->|"explains"| node_gnn_explainer
node_traditional_explainer -->|"renders"| node_visualizers
node_gnn_explainer -->|"renders"| node_visualizers
node_gnn_pipeline -->|"checks"| node_gpu_availability
node_traditional_pipeline -->|"checks"| node_gpu_availability
node_src_cli -->|"resolves"| node_paths
node_src_cli -->|"logs"| node_logger
node_devcontainer -.->|"provides"| node_neo4j_loader

click node_src_cli "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/cli.py"
click node_experiment_config "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/config/experiment_config.py"
click node_preprocessor "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/preprocessor.py"
click node_graph_builder "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/graph_builder.py"
click node_node_feature_extractor "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/node_feature_extractor.py"
click node_edge_feature_extractor "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/edge_feature_extractor.py"
click node_neo4j_loader "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/neo4j_loader.py"
click node_neo4j_feature_extractor "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/neo4j_feature_extractor.py"
click node_xgboost_model "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/xgboost_model.py"
click node_lightgbm_model "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/lightgbm_model.py"
click node_random_forest_model "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/random_forest_model.py"
click node_svm_model "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/svm_model.py"
click node_gnn_model "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/model.py"
click node_gnn_layers "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/layers.py"
click node_gnn_loss "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/loss.py"
click node_gnn_evaluator "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/evaluator.py"
click node_gnn_data_loader "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/data_loader.py"
click node_traditional_pipeline "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/traditional_pipeline.py"
click node_gnn_pipeline "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/gnn_pipeline.py"
click node_gnn_grid_search "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/gnn_grid_search.py"
click node_results_exporter "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/results_exporter.py"
click node_traditional_explainer "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/explainability/traditional_explainer.py"
click node_gnn_explainer "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/explainability/gnn_explainer.py"
click node_visualizers "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/explainability/visualizers.py"
click node_experiment_tracker "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/tracking/experiment_tracker.py"
click node_logger "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/utils/logger.py"
click node_gpu_availability "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/utils/gpu_availability.py"
click node_paths "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/utils/paths.py"
click node_devcontainer "https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/.devcontainer/devcontainer.json"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_src_cli,node_experiment_config,node_logger,node_gpu_availability,node_paths toneBlue
class node_preprocessor,node_graph_builder,node_node_feature_extractor,node_edge_feature_extractor,node_neo4j_loader,node_neo4j_feature_extractor,node_devcontainer toneAmber
class node_traditional_models,node_xgboost_model,node_lightgbm_model,node_random_forest_model,node_svm_model,node_gnn_model,node_gnn_layers,node_gnn_loss,node_gnn_evaluator,node_gnn_data_loader toneMint
class node_traditional_pipeline,node_gnn_pipeline,node_gnn_grid_search,node_results_exporter toneRose
class node_traditional_explainer,node_gnn_explainer,node_visualizers toneIndigo
class node_experiment_tracker toneTeal
```

## Components

### Control plane

Entry points and configuration for experiment execution.

- [CLI](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/cli.py): entrypoint · Unified command-line control plane for all workflows. · `src/cli.py`
- [Config](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/config/experiment_config.py): experiment config · Parses and exposes TOML experiment settings. · `src/config/experiment_config.py`

### Data layer

Preprocessing, graph construction, and optional Neo4j enrichment.

- [Preprocess](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/preprocessor.py): data prep · Cleans and prepares raw AML data for downstream paths. · `src/data/preprocessor.py`
- [Graph build](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/graph_builder.py): graph construction · Builds graph representations used by the GNN pipeline. · `src/data/graph_builder.py`
- [Node feats](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/node_feature_extractor.py): feature extraction · Derives node-level features for graph workflows. · `src/data/node_feature_extractor.py`
- [Edge feats](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/edge_feature_extractor.py): feature extraction · Derives edge-level features for graph workflows. · `src/data/edge_feature_extractor.py`
- [Neo4j load](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/neo4j_loader.py): graph export/import · Loads graph data into Neo4j when available. · `src/data/neo4j_loader.py`
- [Neo4j feats](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/data/neo4j_feature_extractor.py): graph analytics · Pulls optional graph analytics features from Neo4j. · `src/data/neo4j_feature_extractor.py`

### Model layer

Traditional tabular models and the custom GNN stack.

- **Tabular ML**: model adapters · Common wrapper layer for traditional classification models.
- [XGBoost](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/xgboost_model.py): tabular model · Gradient-boosted tree classifier adapter. · `src/models/traditional/xgboost_model.py`
- [LightGBM](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/lightgbm_model.py): tabular model · LightGBM classifier adapter, including accelerated variants when available. · `src/models/traditional/lightgbm_model.py`
- [Random Forest](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/random_forest_model.py): tabular model · Random forest classifier adapter. · `src/models/traditional/random_forest_model.py`
- [SVM](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/traditional/svm_model.py): tabular model · Support vector machine adapter. · `src/models/traditional/svm_model.py`
- [GNN model](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/model.py): MEGA-PNA · Custom graph neural network for transaction-edge classification. · `src/models/gnn/model.py`
- [GNN layers](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/layers.py): message passing · Core GNN layers and encoder components. · `src/models/gnn/layers.py`
- [GNN loss](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/loss.py): objective · Training loss functions for the GNN stack. · `src/models/gnn/loss.py`
- [GNN eval](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/evaluator.py): metrics · Evaluation and scoring utilities for GNN runs. · `src/models/gnn/evaluator.py`
- [GNN data](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/models/gnn/data_loader.py): data loader · Builds GNN-ready batches and inputs from graph data. · `src/models/gnn/data_loader.py`

### Pipelines

Orchestrators that run training, search, and export workflows.

- [Trad train](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/traditional_pipeline.py): orchestrator · Coordinates preprocessing, model fitting, and evaluation for tabular ML. · `src/pipelines/traditional_pipeline.py`
- [GNN train](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/gnn_pipeline.py): orchestrator · Coordinates graph preparation, training, evaluation, and logging for GNN runs. · `src/pipelines/gnn_pipeline.py`
- [Grid search](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/gnn_grid_search.py): experiment search · Runs GNN hyperparameter sweeps over configured search spaces. · `src/pipelines/gnn_grid_search.py`
- [Results export](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/pipelines/results_exporter.py): artifact export · Retrieves and exports experiment results. · `src/pipelines/results_exporter.py`

### Explainability

Model interpretation for both model families.

- [SHAP](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/explainability/traditional_explainer.py): explanation · Explains traditional models with SHAP-based methods. · `src/explainability/traditional_explainer.py`
- [GNNExplainer](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/explainability/gnn_explainer.py): explanation · Explains GNN predictions at the edge level. · `src/explainability/gnn_explainer.py`
- [Visuals](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/explainability/visualizers.py): presentation · Renders explanation outputs for inspection. · `src/explainability/visualizers.py`

### Tracking

Experiment logging and persistence.

- [MLflow](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/tracking/experiment_tracker.py): experiment tracking · Persists metrics, parameters, and artifacts to the tracking backend. · `src/tracking/experiment_tracker.py`

### Utilities

Shared support code for runtime and filesystem concerns.

- [Logger](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/utils/logger.py): runtime support · Shared logging setup used across the repository. · `src/utils/logger.py`
- [GPU check](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/utils/gpu_availability.py): runtime support · Detects GPU availability and influences execution paths. · `src/utils/gpu_availability.py`
- [Paths](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/src/utils/paths.py): filesystem support · Central path and location helpers. · `src/utils/paths.py`

### Developer runtime

Local development environment and service composition.

- [Dev env](https://github.com/samuelfriher/tfg-fraud-detection-gnn/blob/main/.devcontainer/devcontainer.json): local runtime · Local development container with Python and Neo4j services. · `.devcontainer/devcontainer.json`

## Connections

- CLI → Config: loads · CLI reads experiment settings to route commands.
- CLI → Trad train: runs · CLI launches traditional training workflows.
- CLI → GNN train: runs · CLI launches GNN training workflows.
- CLI → Grid search: runs · CLI launches GNN hyperparameter search.
- CLI → Results export: exports · CLI exposes results retrieval and export commands.
- Trad train → Preprocess: uses · Tabular pipeline starts from shared preprocessing.
- Trad train → Tabular ML: trains · Pipeline dispatches to the selected traditional model adapter.
- GNN train → Preprocess: uses · GNN pipeline begins with shared preprocessing.
- GNN train → Graph build: builds · Pipeline constructs graph inputs for the GNN.
- GNN train → GNN data: feeds · Pipeline prepares model-ready graph batches.
- GNN train → GNN model: trains · Pipeline trains the custom graph model.
- Grid search → GNN train: iterates · Search wraps repeated GNN training runs.
- GNN train → MLflow: logs · Pipeline records parameters, metrics, and artifacts.
- Trad train → MLflow: logs · Traditional runs are tracked uniformly.
- Tabular ML → XGBoost: includes · Traditional family includes XGBoost.
- Tabular ML → LightGBM: includes · Traditional family includes LightGBM.
- Tabular ML → Random Forest: includes · Traditional family includes Random Forest.
- Tabular ML → SVM: includes · Traditional family includes SVM.
- GNN model → GNN layers: composes · Model is built from custom GNN layers.
- GNN model → GNN loss: optimizes · Training uses the GNN loss module.
- GNN model → GNN eval: evaluates · Evaluation is handled by the GNN evaluator.
- Graph build → Node feats: derives · Graph construction uses node features.
- Graph build → Edge feats: derives · Graph construction uses edge features.
- Graph build → Neo4j load: optional sync · Graphs may be projected into Neo4j.
- Neo4j load → Neo4j feats: enriches · Neo4j data supports graph analytics feature extraction.
- Neo4j feats → Graph build: augments · Optional graph analytics features feed back into graph inputs.
- Tabular ML → SHAP: explains · Traditional models are interpreted with SHAP.
- GNN model → GNNExplainer: explains · GNN predictions are interpreted with GNNExplainer.
- SHAP → Visuals: renders · Traditional explanations are visualized separately.
- GNNExplainer → Visuals: renders · GNN explanations are visualized separately.
- GNN train → GPU check: checks · GPU availability can alter runtime behavior.
- Trad train → GPU check: checks · GPU availability can affect some traditional backends.
- CLI → Paths: resolves · Shared paths support command execution.
- CLI → Logger: logs · CLI and workflows share logging setup.
- Dev env → Neo4j load: provides · Local container includes Neo4j for graph enrichment.
