# Component Diagram — Semantic Detection System

```mermaid
graph TB
    subgraph External["External Systems"]
        YOLO["Existing YOLO Pipeline"]
        CAM["ViewPro A40 Camera"]
        GPS["GPS-Denied System"]
        OP["Operator Display"]
        NVME["NVMe Storage"]
    end

    subgraph Helpers["Common Helpers"]
        CFG["Config\n(YAML loader + validation)"]
        TYP["Types\n(shared dataclasses)"]
    end

    subgraph Core["Core Components"]
        SC["ScanController\n(py_trees BT orchestrator)"]
        T1["Tier1Detector\n(YOLOE TensorRT FP16)"]
        T2["Tier2SpatialAnalyzer\n(mask trace + cluster trace)"]
        VLM["VLMClient\n(NanoLLM IPC)"]
        GD["GimbalDriver\n(ViewLink + PID)"]
        OM["OutputManager\n(logging + recording)"]
    end

    subgraph VLMContainer["Docker Container"]
        NANO["NanoLLM\n(VILA1.5-3B)"]
    end

    %% Helper dependencies (all components use both)
    CFG -.-> T1
    CFG -.-> T2
    CFG -.-> VLM
    CFG -.-> GD
    CFG -.-> OM
    CFG -.-> SC
    TYP -.-> T1
    TYP -.-> T2
    TYP -.-> VLM
    TYP -.-> GD
    TYP -.-> OM
    TYP -.-> SC

    %% ScanController orchestrates all
    SC -->|"detect(frame)"| T1
    SC -->|"trace_mask / trace_cluster"| T2
    SC -->|"analyze(roi, prompt)"| VLM
    SC -->|"set_angles / follow_path / zoom_to_poi"| GD
    SC -->|"log_detection / record_frame"| OM

    %% VLM to NanoLLM container
    VLM -->|"Unix socket IPC"| NANO

    %% External integrations
    YOLO -->|"detections[]"| SC
    CAM -->|"HDMI/IP frames"| SC
    GD -->|"UART ViewLink"| CAM
    OM -->|"YOLO format output"| OP
    OM -->|"JPEG + JSON-lines"| NVME
    GPS -.->|"coordinates (optional)"| OM

    %% Styling
    classDef external fill:#f0f0f0,stroke:#999,color:#333
    classDef helper fill:#e8f4fd,stroke:#4a90d9,color:#333
    classDef core fill:#d4edda,stroke:#28a745,color:#333
    classDef container fill:#fff3cd,stroke:#ffc107,color:#333

    class YOLO,CAM,GPS,OP,NVME external
    class CFG,TYP helper
    class SC,T1,T2,VLM,GD,OM core
    class NANO container
```

## Component Dependency Graph (implementation order)

```mermaid
graph LR
    CFG["Config"] --> T1["Tier1Detector"]
    CFG --> T2["Tier2SpatialAnalyzer"]
    CFG --> VLM["VLMClient"]
    CFG --> GD["GimbalDriver"]
    CFG --> OM["OutputManager"]
    TYP["Types"] --> T1
    TYP --> T2
    TYP --> VLM
    TYP --> GD
    TYP --> OM

    T1 --> SC["ScanController"]
    T2 --> SC
    VLM --> SC
    GD --> SC
    OM --> SC

    SC --> IT["Integration Tests"]
```

## Data Flow Summary

```mermaid
flowchart LR
    Frame["Camera Frame"] --> T1["Tier1\nYOLOE detect"]
    T1 -->|"detections[]"| Eval["EvaluatePOI\n(scenario match)"]
    Eval -->|"POI queued"| L2["L2 Investigation"]
    L2 -->|"mask"| T2M["Tier2\ntrace_mask"]
    L2 -->|"cluster dets"| T2C["Tier2\ntrace_cluster"]
    T2M -->|"waypoints"| Follow["Gimbal\nPID follow"]
    T2C -->|"waypoints"| Visit["Gimbal\nvisit loop"]
    Follow -->|"ambiguous"| VLM["VLM\nanalyze"]
    Visit -->|"ambiguous"| VLM
    Follow -->|"detection"| Log["OutputManager\nlog + record"]
    Visit -->|"detection"| Log
    VLM -->|"tier3 result"| Log
    Log -->|"operator format"| OP["Operator Display"]
    Log -->|"JPEG + JSON"| NVME["NVMe Storage"]
```
