factoryflow / memory.md
oabolade23's picture
Update memory.md with post-hackathon project state
e2d42b5

FactoryFlow — Project Memory

Claude Code reads this file to understand current build state. Update the Status column and Notes after completing each component. Never delete rows — mark them DONE or BLOCKED.

Last updated: 2026-05-10 — Checkpoint 6 deployed to HF Spaces; awaiting build + OpenAI secret


Build status tracker

Component File Status Notes
ROCm check src/inference/rocm_check.py DONE Detects rocm/cuda/mps/cpu; AMD_DEVICE=cpu forces CPU; printable summary via python -m
Sensor simulator src/sensor/simulator.py DONE BearingFaultSimulator with normal/degrading/imminent_failure states; injects 85 Hz BPFO + 2x harmonic; 512-sample windows at 10 kHz
MCP server src/sensor/mcp_server.py DONE FastMCP SSE on :8765; resources latest/stream/history, tools set_state/get_stats; background emit loop every 5s, 60-window history deque
Model loader src/inference/model_loader.py DONE MOMENTPipeline singleton; fp16 on GPU, fp32 on CPU/MPS; logs load latency
Anomaly detector src/inference/anomaly_detector.py DONE 512-pt window → reconstruction MSE; running calibration_max → score in [0,1]; heuristic RUL
LLM config src/agents/llm_config.py DONE Single get_llm(); reads OPENAI_API_BASE for vLLM swap; default gpt-4o-mini
Sensor tool src/agents/tools/sensor_tool.py DONE In-process simulator + anomaly_detector; force_state() helper for UI
Parts lookup tool src/agents/tools/parts_lookup.py DONE Dominant-Hz band mapping (bearing/gear/imbalance) + urgency from RUL+score
Apify scraper tool src/agents/tools/apify_scraper.py DONE DEMO_MODE fixture fallback; 60s in-memory cache; live mode via apify-client
Engineer Agent src/agents/engineer_agent.py DONE role=Reliability Engineer; tools=read_sensor_anomaly + identify_part
Procurement Agent src/agents/procurement_agent.py DONE Cheapest-within-RUL with critical→fastest override; tool=scrape_suppliers
Orchestrator src/agents/orchestrator.py DONE Sequential Crew(eng→proc); run_cycle(force_state=...) returns merged JSON
MindsDB connector src/data/mindsdb_connector.py TODO
Proxlock auth src/auth/proxlock.py DONE Async request_authorization; budget check + auto-approve under $100; 3s mock in DEMO_MODE
Budget config src/auth/budget_config.py DONE AUTO_APPROVE_LIMIT_USD=100, HARD_BUDGET_CEILING_USD=5000, AUTHORIZED_APPROVERS list
X402 payments src/payments/x402_client.py DONE Async execute_purchase(auth); PaymentResult dataclass; sim_* txn id in DEMO_MODE
Gradio UI src/demo/app.py DONE 4-panel layout; gr.Timer auto-polls every 2s; run-cycle generator streams log + card
Demo components src/demo/components.py DONE DemoState dataclass, gauge formatter, supplier-card markdown builder
Demo script src/demo/demo_script.md DONE 3-min judge walkthrough + recovery cues
Dockerfile Dockerfile DONE python:3.12-slim, CPU torch, momentfm --no-deps, port 7860, DEMO_MODE=true
HF Space external DONE URL: https://huggingface.co/spaces/oabolade23/factoryflow (build in progress; needs OPENAI_API_KEY secret)
requirements.txt requirements.txt DONE momentfm note added; install separately with --no-deps
.env.example .env.example DONE Mirrored from env.example at repo root
README.md README.md DONE HF Space frontmatter, talking points, AMD evidence section, smoke tests

Decisions log

Record every architectural or implementation decision made during the build. This prevents re-litigating decisions under time pressure.

Decision Rationale Date
Use MOMENT-1-large for anomaly detection Handles anomaly detection directly without needing forecasting residuals pre-build
Use Qwen3-8B as agent LLM via vLLM Best tool-calling quality under 10B params; unlocks Qwen prize pre-build
DEMO_MODE=true for Proxlock + X402 Neither API confirmed available; mock is visually identical pre-build
Cache Apify results for 60s Prevents rate-limiting during rapid demo cycles pre-build
MCP SSE on port 8765 Avoids conflicts with vLLM (8000) and Gradio (7860) pre-build

Known issues / blockers

Record blockers here as they arise. Include the error message and what you tried.

Issue Status Resolution / Workaround
(none yet)

Environment status

Fill these in once verified:

AMD GPU detected:        [ ] yes  [ ] no   Device: ___________________
ROCm version:            ___________________
MOMENT model cached:     [ ] yes  [ ] no   Path: ___________________
Qwen3-8B vLLM serving:  [ ] yes  [ ] no   Endpoint: http://localhost:8000
Apify token valid:       [ ] yes  [ ] no
Proxlock API responding: [ ] yes  [ ] no
X402 API responding:     [ ] yes  [ ] no
MindsDB connected:       [ ] yes  [ ] no
HF Space URL:            ___________________

Key constants (fill in during calibration)

CALIBRATION_MAX = None          # set after warm-up in model_loader.py
ANOMALY_THRESHOLD = 0.75        # from .env
RUL_ALERT_HOURS = 48            # from .env
SENSOR_WINDOW_SIZE = 512        # FFT points per window
SENSOR_INTERVAL_SECONDS = 5     # emission rate
BEARING_FAULT_FREQ_HZ = 85.0    # BPFO for 6205 bearing at 1800 RPM

API endpoints in use

Service Endpoint Auth
vLLM (Qwen3-8B) http://localhost:8000/v1 OPENAI_API_KEY=fake
MCP server http://localhost:8765 none
Apify https://api.apify.com/v2 APIFY_API_TOKEN
Proxlock https://api.proxlock.io/v1 PROXLOCK_API_KEY
X402 https://api.x402.xyz/v1 X402_API_KEY
MindsDB cloud.mindsdb.com MINDSDB_USER / MINDSDB_PASSWORD
HF Hub https://huggingface.co HF_TOKEN

Demo fixture data

If Apify is unavailable, use this fixture in apify_scraper.py when DEMO_MODE=true:

APIFY_FIXTURE = {
    "SKU-BRG-6205": [
        {
            "supplier": "BearingPoint Industrial",
            "unit_price_usd": 47.00,
            "delivery_days": 2,
            "stock_status": "in_stock",
            "url": "https://bearingpoint.example.com/6205-2RS"
        },
        {
            "supplier": "GlobalBearings.com",
            "unit_price_usd": 39.50,
            "delivery_days": 5,
            "stock_status": "in_stock",
            "url": "https://globalbearings.example.com/catalog/6205"
        },
        {
            "supplier": "FastParts Express",
            "unit_price_usd": 62.00,
            "delivery_days": 1,
            "stock_status": "low_stock",
            "url": "https://fastparts.example.com/bearings/6205-2RS"
        }
    ]
}

MindsDB procurement history fixture:

MINDSDB_FIXTURE = {
    "SKU-BRG-6205": {
        "avg_delivery_days": 2.1,
        "best_price_usd": 39.50,
        "order_count": 4,
        "last_ordered": "2025-11-14"
    }
}

Submission links (fill in as ready)