AI / ML Capstone Project — built for $0

Logcat Intelligence Engine

A self-improving AI diagnostic system for Android OS logs: a ReAct agent diagnoses root causes from logcat/dmesg artifacts using specialized tools, every investigation becomes training data, a local 7B model gets fine-tuned with QLoRA + DPO, an eval harness gates deployment, and the model serves via an airgapped Docker image. This page replays real captured data from the project — nothing here is staged.

Architecture

Same diagram source as docs/ARCHITECTURE.md — rendered live in your browser, not a static image.

flowchart TD
    subgraph Input["Log Input"]
        LC[logcat file]
        DM[dmesg file]
        BR[bugreport ZIP]
    end

    subgraph Agent["Agentic Diagnosis Engine — IMPLEMENTED"]
        AG["DiagnosticAgent\nReAct loop (src/agent/diagnostic_agent.py)"]
        T1["LogcatParserTool"]
        T2["DmesgParserTool"]
        T3["PatternSearchTool"]
        T4["RAGRetrieverTool\n(FAISS + sentence-transformers)"]
        AG -->|Action| T1
        AG -->|Action| T2
        AG -->|Action| T3
        AG -->|Action| T4
        T1 -->|Observation| AG
        T2 -->|Observation| AG
        T3 -->|Observation| AG
        T4 -->|Observation| AG
    end

    subgraph LLM["Agent Backbone — IMPLEMENTED ($0)"]
        OLLAMA["Ollama, local\nqwen2.5:7b"]
    end

    subgraph Training["Training Data Pipeline — IMPLEMENTED"]
        TL["TraceRecorder\nJSON step recorder"]
        TC["TraceConverter\nShareGPT format"]
        DPO["DPOPairGenerator\nhuman vs model"]
        SFT["SFT Dataset"]
        PREF["Preference Dataset"]
    end

    subgraph FineTune["Fine-Tuning Pipeline — CODE READY, NOT YET RUN (cloud GPU)"]
        FT["QLoRA Fine-Tuning\nQwen2.5-7B"]
        DIST["Distillation\nGroq Llama-3.3-70B teacher"]
        DPOT["DPO Training"]
    end

    subgraph Eval["Eval Harness — IMPLEMENTED"]
        DE["DiagnosticEval\noutcome grader"]
        TG["TrajectoryGrader\ntool use checker"]
        LJ["LLMJudge\nreasoning quality (Ollama)"]
        RG{"Regression Gate\naccuracy threshold"}
    end

    subgraph Deploy["Deployment — MOSTLY VERIFIED (Phase 5)"]
        VLLM["vLLM Server\nOpenAI-compatible"]
        DOCK["Airgapped Docker\nno internet required"]
        VLLM --> DOCK
    end

    subgraph Review["Human Review — PLANNED"]
        HR["Engineer Review\napprove or correct"]
    end

    Input --> AG
    OLLAMA -.->|serves| AG
    AG --> Diag["Diagnosis\nroot cause + reasoning + confidence"]
    Diag --> HR
    Diag --> TL
    TL --> TC --> SFT
    HR --> DPO --> PREF
    SFT --> FT
    PREF --> DPOT
    DIST --> FT
    FT --> DE
    DPOT --> DE
    DE --> TG --> LJ --> RG
    RG -->|pass| VLLM
    RG -->|fail| FT
    VLLM -->|new cases| TL

Investigation Replay

Replaying real recorded ReAct traces captured by running the actual DiagnosticAgent against local Ollama (see data/sft/*.jsonl) — not a live agent. Pick a scenario and step through its reasoning.

—
Step 0 / 0

Eval Results

From eval_results_baseline.json, produced by scripts/run_eval.py against the zero-shot agent.

TaskExpectedPredictedCorrect Keyword Hit RateConfidenceTrajectoryJudge

Flywheel & Phase Status

All 6 capstone phases, current status (mirrors CONTEXT.md).

flowchart TD
    PROD["Deployed vLLM server\n(07-deployment-serving.md)"]
    NEWCASES["New investigations\n(production usage)"]
    TRACES["data/raw/traces.jsonl\n(growing)"]
    PROD --> NEWCASES --> TRACES

    subgraph Trigger["auto_trigger.py"]
        COUNT["count_new_examples()\ntotal - last_known_count"]
        CHECK{"new_count >= 100?"}
        COUNT --> CHECK
    end
    TRACES --> COUNT

    CHECK -->|no| WAIT["Not enough new examples\n(no-op)"]
    CHECK -->|yes| RETRAIN["scripts/weekly_retrain.sh"]

    subgraph Pipeline["weekly_retrain.sh (5 steps)"]
        S1["1. Convert traces\n-> data/sft/train.jsonl"]
        S2["2. QLoRA SFT training\n(train_sft.py)"]
        S3["3. Merge adapter\n(merge_adapter.py)"]
        S4["4. Run eval harness\n(run_eval.py)"]
        S5["5. Regression gate check"]
        S1 --> S2 --> S3 --> S4 --> S5
    end
    RETRAIN --> S1

    subgraph Gate["regression_gate.should_deploy()"]
        FLOOR{"accuracy >= 0.65\n(ACCURACY_FLOOR)?"}
        REGRESS{"accuracy >= prev_accuracy - 0.05\n(MAX_REGRESSION)?"}
        FLOOR -->|no| REJECT["Block deployment"]
        FLOOR -->|yes| REGRESS
        REGRESS -->|no| REJECT
        REGRESS -->|yes| ACCEPT["Approve deployment"]
    end
    S5 --> FLOOR

    ACCEPT --> BUILD["docker build\nnew tagged image\nlogcat-ie-serve:vN"]
    ACCEPT --> RECORD["version_tracker.py\nrecord_deployment()"]
    REJECT --> KEEPOLD["Keep serving current version\n(no image rebuild)"]

    BUILD --> PROD