{
  "version": "2.1.0",
  "updated": "2026-05-13",
  "registry_url": "https://storage.googleapis.com/cognitum-apps",
  "binary_base_url": "https://storage.googleapis.com/cognitum-apps/cogs/arm",
  "cogs": [
    {
      "id": "sleep-apnea",
      "name": "Sleep Apnea Detector",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 4,
      "difficulty": "easy",
      "description": "🩺 Detects when someone stops breathing during sleep",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "a3a7b907cf9bdf8a1eb978f82f0bbb5798b69f5875483864a70c3072c483761b",
      "binary_size": 396368
    },
    {
      "id": "cardiac-arrhythmia",
      "name": "Cardiac Arrhythmia",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "hard",
      "description": "🩺 Spots irregular heartbeats and abnormal heart rhythms",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "121b1144865a5d627452c619a9db821add9b5166fb2c5f3bc661f45c57584120",
      "binary_size": 396368
    },
    {
      "id": "respiratory-distress",
      "name": "Respiratory Distress",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🩺 Alerts when breathing becomes labored or dangerously fast",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "f721a9c8114dbb8110b70b3081f35fedbe7316aa7a4f148065fa6e55e5d270f1",
      "binary_size": 396368
    },
    {
      "id": "gait-analysis",
      "name": "Gait Analysis",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🩺 Detects walking problems and scores fall risk",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "f8f3d34c9bf46230a2db481d6cf23839006b47596f8d4310c0e8a55996c0b125",
      "binary_size": 396368
    },
    {
      "id": "seizure-detect",
      "name": "Seizure Detection",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🩺 Recognizes seizures and sends immediate alerts",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 3,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "d8e70145f637ea6047f68fb1de9d0e1fa4749fdb49d7928fd7b0181f611200a5",
      "binary_size": 396368
    },
    {
      "id": "vital-trend",
      "name": "Vital Trend",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🩺 Tracks breathing and heart rate trends over weeks",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "breathing_low",
          "type": "float",
          "label": "Breathing filter low frequency",
          "description": "Lower bound of bandpass filter for breathing extraction",
          "default": 0.1,
          "min": 0.05,
          "max": 0.3,
          "unit": "Hz",
          "cli_arg": "--breathing-low",
          "advanced": true
        },
        {
          "key": "breathing_high",
          "type": "float",
          "label": "Breathing filter high frequency",
          "description": "Upper bound of bandpass filter for breathing extraction",
          "default": 0.5,
          "min": 0.3,
          "max": 1.0,
          "unit": "Hz",
          "cli_arg": "--breathing-high",
          "advanced": true
        },
        {
          "key": "hr_low",
          "type": "float",
          "label": "Heart rate filter low frequency",
          "default": 0.8,
          "min": 0.5,
          "max": 1.5,
          "unit": "Hz",
          "cli_arg": "--hr-low",
          "advanced": true
        },
        {
          "key": "hr_high",
          "type": "float",
          "label": "Heart rate filter high frequency",
          "default": 2.0,
          "min": 1.5,
          "max": 4.0,
          "unit": "Hz",
          "cli_arg": "--hr-high",
          "advanced": true
        },
        {
          "key": "tachypnea_threshold",
          "type": "float",
          "label": "Tachypnea alert threshold",
          "description": "Breathing rate above this triggers alert",
          "default": 30.0,
          "min": 20.0,
          "max": 60.0,
          "unit": "BPM",
          "cli_arg": "--tachypnea-threshold"
        },
        {
          "key": "tachycardia_threshold",
          "type": "float",
          "label": "Tachycardia alert threshold",
          "description": "Heart rate above this triggers alert",
          "default": 100.0,
          "min": 80.0,
          "max": 200.0,
          "unit": "BPM",
          "cli_arg": "--tachycardia-threshold"
        }
      ],
      "sha256": "1863420bc644b6858eac356a0b970c0d957c2d3e955fcbcf69112586d0105227",
      "binary_size": 396368
    },
    {
      "id": "dream-stage",
      "name": "Dream Stage",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🩺 Tracks your sleep stages — light, deep, and dreaming",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between sleep stage evaluations",
          "default": 60,
          "min": 10,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "7a127254cfcf3c7de326feb8ff5cd60f471edf6ab511100db8b845bbe5761746",
      "binary_size": 396368
    },
    {
      "id": "breathing-sync",
      "name": "Breathing Sync",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🩺 Detects when two people breathe in sync",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "69b60e65b891ef832e441d262fca05af40b6f0861fb46700f39cad533ca4b9ef",
      "binary_size": 461916
    },
    {
      "id": "intrusion",
      "name": "Intrusion Detection",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🔒 Alerts when an unauthorized person enters a room",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "default": 3,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "arm_after",
          "type": "integer",
          "label": "Arm after",
          "description": "Seconds of baseline learning before arming the detector",
          "default": 60,
          "min": 10,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--arm-after"
        },
        {
          "key": "detection_threshold",
          "type": "float",
          "label": "Detection threshold",
          "description": "Combined z-score threshold to trigger intrusion alert",
          "default": 3.0,
          "min": 1.5,
          "max": 6.0,
          "step": 0.5,
          "cli_arg": "--detection-threshold"
        },
        {
          "key": "trigger_count",
          "type": "integer",
          "label": "Consecutive triggers",
          "description": "Number of consecutive detections before alarm",
          "default": 2,
          "min": 1,
          "max": 10,
          "cli_arg": "--trigger-count"
        }
      ],
      "sha256": "1b05dfac0ba793515c4b948e1f86404dff5ebbcbcb9affcc3a176b8b56161fcd",
      "binary_size": 396368
    },
    {
      "id": "perimeter-breach",
      "name": "Perimeter Breach",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "medium",
      "description": "🔒 Guards multiple zones and shows entry direction",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "description": "Seconds between perimeter scans",
          "default": 2,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "threshold",
          "type": "float",
          "label": "Detection threshold",
          "description": "Z-score threshold to trigger zone breach detection",
          "default": 3.0,
          "min": 1.0,
          "max": 10.0,
          "step": 0.5,
          "cli_arg": "--threshold"
        }
      ],
      "sha256": "bcf769c80d85e9717c440be020139ce6ba7535483d8c0ed38a6ff5b17654e42a",
      "binary_size": 461904
    },
    {
      "id": "weapon-detect",
      "name": "Weapon Detection",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "hard",
      "description": "🔒 Detects concealed metal objects on a person",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "description": "Seconds between detection scans",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "1e7b32cde8d92770ad981c7663e3b81d95e46d4384962ad906f99d252a5cb0f9",
      "binary_size": 396368
    },
    {
      "id": "tailgating",
      "name": "Tailgating Detection",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🔒 Catches when someone sneaks in behind a badge holder",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "94d861507b29015c2c8c3bbbbd70055ca402ab1704bd8592a9312547a914629b",
      "binary_size": 396368
    },
    {
      "id": "loitering",
      "name": "Loitering Detection",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 3,
      "difficulty": "easy",
      "description": "🔒 Alerts when someone lingers too long in one spot",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "loiter_time",
          "type": "integer",
          "label": "Loiter time",
          "description": "Seconds of stationary presence before triggering an alert",
          "default": 120,
          "min": 10,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--loiter-time"
        }
      ],
      "sha256": "0f3380d0eee8fd2c7aa4ae87fc0182db0b9f8a9693db661a282229eae4837541",
      "binary_size": 396368
    },
    {
      "id": "panic-motion",
      "name": "Panic Motion",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🔒 Detects sudden panicked or erratic movement",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "1cd7491292ad63d19dedcee4886c8d9fc650e3ea74d7b0fa2d813a73f51e0c86",
      "binary_size": 396368
    },
    {
      "id": "prompt-shield",
      "name": "Prompt Shield",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "medium",
      "description": "🔒 Blocks signal replay and injection attacks on the seed",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "description": "Seconds between security scans",
          "default": 2,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "8649a383b3997dba7398658a63956a4aba5d39d62e5f7a501b54d6e30243434b",
      "binary_size": 396368
    },
    {
      "id": "behavioral-profiler",
      "name": "Behavioral Profiler",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🔒 Learns normal behavior and flags anything unusual",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "df2509237294eab5acf15ce49426e0d8c5dd5b8f93496fb370617ab9629f85f2",
      "binary_size": 396368
    },
    {
      "id": "fleet-auth",
      "name": "Fleet Authentication",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "medium",
      "description": "🔒 Manage device certificates and access across all seeds",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Auth check interval",
          "description": "Seconds between authentication verification rounds",
          "default": 30,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "6d2873230517555c811d013956fa882de411b16a3f884d044ccd92fd83c42ce0",
      "binary_size": 396368
    },
    {
      "id": "audit-logger",
      "name": "Audit Trail Logger",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "easy",
      "description": "🔒 Record every action for compliance — tamper-proof log",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between audit checks",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "cloud",
          "type": "string",
          "label": "Cloud endpoint",
          "description": "HTTP endpoint to forward audit events to (e.g. https://audit.example.com/ingest)",
          "default": "",
          "cli_arg": "--cloud",
          "advanced": true
        }
      ],
      "sha256": "f699fb0f24aa85cf693c8a43c0accbbc82fb466148f4b07a486c8e4f3f1a6ffe",
      "binary_size": 396368
    },
    {
      "id": "network-firewall",
      "name": "Network Firewall",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "easy",
      "description": "🔒 Block unauthorized network access per cog",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "description": "Seconds between network scans",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "c716fb35020f171967489928a51ba0b704961c9878732ce78298df070a7d7efa",
      "binary_size": 396368
    },
    {
      "id": "intrusion-detect-ml",
      "name": "ML Intrusion Detection",
      "category": "security",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🔒 Detect network attacks using machine learning",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "description": "Seconds between intrusion checks",
          "default": 3,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "63636083aff391e9772400aba69eac68326ef410015ca594aaa71528348f9345",
      "binary_size": 396368
    },
    {
      "id": "occupancy-zones",
      "name": "Occupancy Zones",
      "category": "building",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "🏢 Counts people in each room through walls",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "686b3a5ceeb2d35b08643c27e36e10a397a4af9011403b77a652d209cd0cc7c0",
      "binary_size": 396380
    },
    {
      "id": "hvac-presence",
      "name": "HVAC Presence",
      "category": "building",
      "version": "1.2.0",
      "size_kb": 3,
      "difficulty": "easy",
      "description": "🏢 Turns heating and cooling on when you arrive",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "28c842284a9fb60b31e749a01882c0b3a20721e3fb86ff44cc624f2d1cedcfa5",
      "binary_size": 396368
    },
    {
      "id": "lighting-zones",
      "name": "Lighting Zones",
      "category": "building",
      "version": "1.2.0",
      "size_kb": 4,
      "difficulty": "easy",
      "description": "🏢 Turns lights on and off as people move between rooms",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "982c997434a0231133ab6fafaaa591f2c7a36d04b610b92ff106eee178de110b",
      "binary_size": 396380
    },
    {
      "id": "elevator-count",
      "name": "Elevator Count",
      "category": "building",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "🏢 Counts how many people are in an elevator",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "bb41e7062f49b008a14f946d14927e98d7f36b156209b2216aef62d134a8fed6",
      "binary_size": 396368
    },
    {
      "id": "meeting-room",
      "name": "Meeting Room",
      "category": "building",
      "version": "1.2.0",
      "size_kb": 5,
      "difficulty": "easy",
      "description": "🏢 Shows if a meeting room is free or occupied",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "25c91b910101fcacb6ef69cbf9352f6aa0a2d57506a894b9a576038324add3e8",
      "binary_size": 396368
    },
    {
      "id": "energy-audit",
      "name": "Energy Audit",
      "category": "building",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🏢 Learns your schedule and cuts wasted energy",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 60,
          "min": 10,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "c8a8f6bb39d0061eeb239a63d35db5553e9890ea7a1bd0c40e2832f0ae6b0f6e",
      "binary_size": 396368
    },
    {
      "id": "queue-length",
      "name": "Queue Length",
      "category": "retail",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🛒 Estimates line length and wait time",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "f18e7464241c0fd8fdb7c8235f731f58b5a22bb4bcc0f6fdcf765327c0d79c8c",
      "binary_size": 396380
    },
    {
      "id": "dwell-heatmap",
      "name": "Dwell Heatmap",
      "category": "retail",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🛒 Shows where customers spend the most time",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "270bf96ebcf9ec6aebe81f35110b72392aa34551dbee4874b06405312864e5bf",
      "binary_size": 396380
    },
    {
      "id": "customer-flow",
      "name": "Customer Flow",
      "category": "retail",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "🛒 Counts foot traffic in and out of each entrance",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "d84ca468d9bb81d32af1ca7e61b93189f904eeecaf6308191eb5368472ed8cb2",
      "binary_size": 396380
    },
    {
      "id": "table-turnover",
      "name": "Table Turnover",
      "category": "retail",
      "version": "1.2.0",
      "size_kb": 4,
      "difficulty": "easy",
      "description": "🛒 Tracks which restaurant tables are free or occupied",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "a58fa5657c3570e41ea9fd86580f40185ef3d0bdf19677b75f7c30e3cce02311",
      "binary_size": 396380
    },
    {
      "id": "shelf-engagement",
      "name": "Shelf Engagement",
      "category": "retail",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🛒 Detects when customers interact with products",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "897c7d4eab8c736f67b702b997c5237c4f4215a20723f142fc9e9a97f02a5169",
      "binary_size": 396380
    },
    {
      "id": "forklift-proximity",
      "name": "Forklift Proximity",
      "category": "industrial",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🏭 Warns if a forklift gets too close to workers",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "25d8c15e454f4dddd92622b0479287b8fbc608349f728ddce1c8dba75b98762d",
      "binary_size": 396368
    },
    {
      "id": "confined-space",
      "name": "Confined Space",
      "category": "industrial",
      "version": "1.2.0",
      "size_kb": 5,
      "difficulty": "medium",
      "description": "🏭 Monitors workers in tight spaces for safety",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 2,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "93455045eac3cecab2d947805b89f415907bf3be03c94139bc4e49b66c67728c",
      "binary_size": 396368
    },
    {
      "id": "clean-room",
      "name": "Clean Room",
      "category": "industrial",
      "version": "1.2.0",
      "size_kb": 4,
      "difficulty": "easy",
      "description": "🏭 Enforces max headcount in controlled environments",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 3,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "max_occupancy",
          "type": "integer",
          "label": "Maximum occupancy",
          "description": "Maximum allowed number of people before alert triggers",
          "default": 4,
          "min": 1,
          "max": 50,
          "cli_arg": "--max-occupancy"
        }
      ],
      "sha256": "19a80fccf728c36ce449ee9da2b292a20a46643d5e0b95f726d547d955040912",
      "binary_size": 396368
    },
    {
      "id": "livestock-monitor",
      "name": "Livestock Monitor",
      "category": "industrial",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🏭 Monitors animals for distress, escape, or illness",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "1dc0aadc3f642479ee616b78bce4feefb263c9875e17e4aae6afb13cbcd2c804",
      "binary_size": 396368
    },
    {
      "id": "structural-vibration",
      "name": "Structural Vibration",
      "category": "industrial",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "hard",
      "description": "🏭 Detects dangerous vibrations in buildings or machines",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "threshold",
          "type": "float",
          "label": "RMS threshold",
          "description": "RMS energy level above which vibration is considered dangerous",
          "default": 50.0,
          "min": 5.0,
          "max": 500.0,
          "step": 5.0,
          "cli_arg": "--threshold"
        }
      ],
      "sha256": "4d872ccefef4598ad0f0a69c97c5ce548942598ebff9fae991018e953a5e3a2d",
      "binary_size": 461904
    },
    {
      "id": "emotion-detect",
      "name": "Emotion Detection",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🔬 Reads stress and calm from body language and breathing",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "393a8bbe6df119e1ab02cadc7769d5430e2b3d4943cb21aeedc14a6807c17493",
      "binary_size": 396368
    },
    {
      "id": "gesture-language",
      "name": "Gesture Language",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🔬 Recognizes sign language gestures in real time",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between gesture matching attempts",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "fdf20a5935b45ca0b526ae89dbf140e160c2b563a67859ecfef71d19d920be9b",
      "binary_size": 396368
    },
    {
      "id": "music-conductor",
      "name": "Music Conductor",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🔬 Reads a conductor's gestures for tempo and dynamics",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "sample_rate",
          "type": "float",
          "label": "Sample rate",
          "description": "Expected sensor sampling rate for tempo calculation",
          "default": 100.0,
          "min": 10.0,
          "max": 1000.0,
          "unit": "Hz",
          "cli_arg": "--sample-rate",
          "advanced": true
        }
      ],
      "sha256": "f2f645af36f51bcdea1df87343270408427a2a183730bb6b4e9abe1a731a3602",
      "binary_size": 461904
    },
    {
      "id": "plant-growth",
      "name": "Plant Growth",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "🔬 Tracks plant growth rate and day/night cycles",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 300,
          "min": 30,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "1c6985af4ec233186b49749104408a02b5a3a93fb3165df4d2edcb31f17caa09",
      "binary_size": 396368
    },
    {
      "id": "ghost-hunter",
      "name": "Ghost Hunter",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🔬 Finds unexplained environmental anomalies — for fun",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "03727d10d73dbe6f51b825aededfb80b08f8d99f563992b919b7a6195c9df96a",
      "binary_size": 396368
    },
    {
      "id": "rain-detect",
      "name": "Rain Detection",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🔬 Detects when rain starts, stops, and how heavy it is",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 30,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "ac04f093939762c6a3aaba7f1a48d07ae51577b555480272bb4882e57ed79438",
      "binary_size": 396368
    },
    {
      "id": "time-crystal",
      "name": "Time Crystal",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🔬 Experiments with repeating time-pattern symmetry",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "a944d5f227a99cf600c221c30aaa90f5d77af1bab3570272e5db25ba35dd795d",
      "binary_size": 396368
    },
    {
      "id": "hyperbolic-space",
      "name": "Hyperbolic Space",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🔬 Maps data into curved space for tree-like structures",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "1d448832b3b518564c02279c56ae976f1d9ce1b17a2afe140c281b558a95c6f5",
      "binary_size": 396368
    },
    {
      "id": "happiness-score",
      "name": "Happiness Score",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "🔬 Estimates well-being from movement and mood signals",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "b7a844fcb616ace6dc0ab8367d4ba6398263443ccd8c221986f4ae069fe3984f",
      "binary_size": 396368
    },
    {
      "id": "sound-classifier",
      "name": "Sound Classifier",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 16,
      "difficulty": "hard",
      "description": "🔬 Identify sounds like glass break, alarm, or baby cry",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between classifications",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "72fc8c391ee49aae89f5d9ab6f57e154494bbe45ed933eabebd10fe547d7ff4c",
      "binary_size": 396368
    },
    {
      "id": "flash-attention",
      "name": "Flash Attention",
      "category": "signal",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "medium",
      "description": "📡 Focuses sensing on specific areas for better accuracy",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "top_k",
          "type": "integer",
          "label": "Top-K channels",
          "description": "Number of highest-importance channels to focus on",
          "default": 4,
          "min": 1,
          "max": 16,
          "cli_arg": "--top-k"
        }
      ],
      "sha256": "62b21abdfd30db0a023f8c6e549d9fd516d594f4d8b4fbe3982ea01471107a45",
      "binary_size": 396368
    },
    {
      "id": "temporal-compress",
      "name": "Temporal Compress",
      "category": "signal",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "medium",
      "description": "📡 Shrinks old data to save memory without losing meaning",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Compression interval",
          "description": "Seconds between compression cycles",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "bc558a316f39df7ad86b5f98656a4e3928d8550f585e69918b9689e8f1f41b75",
      "binary_size": 396368
    },
    {
      "id": "coherence-gate",
      "name": "Coherence Gate",
      "category": "signal",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "📡 Filters out noisy signals and keeps clean ones",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "threshold",
          "type": "float",
          "label": "Coherence threshold",
          "description": "Minimum coherence level to pass signals through the gate",
          "default": 0.7,
          "min": 0.1,
          "max": 1.0,
          "step": 0.05,
          "cli_arg": "--threshold"
        }
      ],
      "sha256": "40377f9540ff2c3237d8cf2f49482e451299020648f75502cf9fccf8878da7a1",
      "binary_size": 461904
    },
    {
      "id": "sparse-recovery",
      "name": "Sparse Recovery",
      "category": "signal",
      "version": "1.2.0",
      "size_kb": 16,
      "difficulty": "hard",
      "description": "📡 Recovers missing signal data from partial readings",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "e69b39a16683bbb7f384d57803bdf82583920619eadbf711731f6b61c913c82c",
      "binary_size": 396368
    },
    {
      "id": "person-matching",
      "name": "Person Matching",
      "category": "signal",
      "version": "1.2.0",
      "size_kb": 18,
      "difficulty": "hard",
      "description": "📡 Tells apart multiple people in the same room",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "max_people",
          "type": "integer",
          "label": "Maximum people",
          "description": "Maximum number of distinct people to track simultaneously",
          "default": 5,
          "min": 2,
          "max": 20,
          "cli_arg": "--max-people"
        }
      ],
      "sha256": "a1263dc75a7a0aa0dfeedddf30238382222dddd0f6849cc7f43ecdfc2fc60b91",
      "binary_size": 396368
    },
    {
      "id": "optimal-transport",
      "name": "Optimal Transport",
      "category": "signal",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "📡 Measures motion using shape-aware signal comparison",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "c312a8be92ba3827f6f92b611e58303e0a2cd106dcbe9a930de6cba2bbf3905f",
      "binary_size": 396368
    },
    {
      "id": "dtw-gesture-learn",
      "name": "DTW Gesture Learn",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "medium",
      "description": "🤖 Teach custom hand gestures by showing examples",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between gesture matching attempts",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "5dae735bc73f7a9b3f1bba5451f8fab4a4a2917b89f59d4e7d344d02a8c78f36",
      "binary_size": 396368
    },
    {
      "id": "anomaly-attractor",
      "name": "Anomaly Attractor",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🤖 Learns what's normal and catches anything weird",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "da8ec8be3fa30bdfe56c088293581eb16717ba027ff8cc5c8945bda1895a7001",
      "binary_size": 396368
    },
    {
      "id": "meta-adapt",
      "name": "Meta Adapt",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "hard",
      "description": "🤖 Automatically tunes itself for best performance",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between optimization cycles",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "04cde5552b085d4fc846280f394674e2ae73c9ad9481742bae1b53ac0fbf4dc4",
      "binary_size": 396368
    },
    {
      "id": "ewc-lifelong",
      "name": "EWC Lifelong",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "hard",
      "description": "🤖 Learns new things without forgetting old lessons",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "4e135ac799013fcf020af7088322b6fe007117e84fc092e2aba62911542f1107",
      "binary_size": 396368
    },
    {
      "id": "pagerank-influence",
      "name": "PageRank Influence",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "medium",
      "description": "🤖 Finds the most influential person in a group",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "f99bdfd3972b97ffb9e5d605ce0abb2487cc9f05bfa5e26bcddc7b9fd5122e4a",
      "binary_size": 461916
    },
    {
      "id": "micro-hnsw",
      "name": "Micro HNSW",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "medium",
      "description": "🤖 Fast on-device fingerprinting and classification",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "118780dcef0caae25f57a3490ad163bedc194e4b54726139cc44079b7b169a4b",
      "binary_size": 396368
    },
    {
      "id": "spiking-tracker",
      "name": "Spiking Tracker",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 16,
      "difficulty": "hard",
      "description": "🤖 Brain-inspired tracker that runs on tiny hardware",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "c4343b5cfaf2d4ef8be3adad08b3031719c60b84371ea03613e6568cc68af8ea",
      "binary_size": 461916
    },
    {
      "id": "pattern-sequence",
      "name": "Pattern Sequence",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "medium",
      "description": "🤖 Detects daily routines and repeated habits",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 60,
          "min": 10,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "d70b7a769c4ab0f3cc71ddb35848f7998c3a86b71a32ae555ad917add3533a1d",
      "binary_size": 396368
    },
    {
      "id": "temporal-logic",
      "name": "Temporal Logic Guard",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🤖 Enforces safety rules on live event streams",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Check interval",
          "description": "Seconds between rule evaluation cycles",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "753031d0c576069e607c9f0ebb5d6d50403f3ea417ff2f565b362abb56bb92ec",
      "binary_size": 396380
    },
    {
      "id": "goap-autonomy",
      "name": "GOAP Autonomy",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🤖 Plans and executes goals on its own",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Planning interval",
          "description": "Seconds between planning cycles",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "c8e65d9688814b03813a1a145aa416f6e7379db7057e0f022ce91a73b58eb599",
      "binary_size": 461916
    },
    {
      "id": "federated-learning",
      "name": "Federated Learning",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 18,
      "difficulty": "hard",
      "description": "🤖 Train AI across seeds without sharing raw data",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sync interval",
          "description": "Seconds between federation rounds",
          "default": 30,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "da829e9d7e6f7d061747a0a04716bf594ee39ef41e89d924a6a512cb7276e6d9",
      "binary_size": 396368
    },
    {
      "id": "rag-local",
      "name": "Local RAG Engine",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "medium",
      "description": "🤖 Search your documents using AI — runs on the seed",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between index refresh cycles",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "a59e0d3167c4bf8f349a197da58d57e05c248d2b5fe6cd474d6771bf75aaff61",
      "binary_size": 461916
    },
    {
      "id": "time-series-forecast",
      "name": "Time Series Forecast",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "medium",
      "description": "🤖 Predict sensor trends using historical patterns",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between forecast updates",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "24953fedc9e7e326758f66a846f6ba31f4e0b891461cca3f929de4723b3992f4",
      "binary_size": 396368
    },
    {
      "id": "gesture",
      "name": "Gesture Recognition",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🛠️ Core gesture recognition building block for cogs",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between gesture checks",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "59854c1004205f83a05a03aaa2f112d4feb2d4e852989baea14a321410720ed5",
      "binary_size": 396368
    },
    {
      "id": "coherence",
      "name": "Coherence Monitor",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 4,
      "difficulty": "easy",
      "description": "🛠️ Monitors signal quality across multiple channels",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "2655b6b85175d772d135412fddd1732449bfb3ab50c81de3a9ed44a1ce4b5f1a",
      "binary_size": 461916
    },
    {
      "id": "adversarial",
      "name": "Adversarial Detection",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 4,
      "difficulty": "easy",
      "description": "🛠️ Detects tampered or spoofed sensor signals",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "c6adcd5bb27864f1cabfde915a2633899a3c6df3d74e33b71e8c8b4bf284f6c7",
      "binary_size": 396380
    },
    {
      "id": "quantum-coherence",
      "name": "Quantum Coherence",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 16,
      "difficulty": "hard",
      "description": "🛠️ Quantum-inspired model for advanced signal states",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "54b5a6ae23b3f646b58e1116f389af2eeae5c6dd1a18d4ed42161fd687f620f5",
      "binary_size": 396368
    },
    {
      "id": "interference-search",
      "name": "Interference Search",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🛠️ Searches many possibilities at once for fast answers",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "f2ae07ceeeb0eda15409c9b88e599c29380bef1f98a4dcc3a46da97486ea4ef8",
      "binary_size": 396368
    },
    {
      "id": "psycho-symbolic",
      "name": "Psycho-Symbolic",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 16,
      "difficulty": "hard",
      "description": "🛠️ Reasons over knowledge graphs with multiple styles",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between reasoning cycles",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "93eabc017bf8d265e64dfc201b849b9d1f35c5aa15e01b3e36085658f313fc59",
      "binary_size": 396380
    },
    {
      "id": "self-healing-mesh",
      "name": "Self-Healing Mesh",
      "category": "developer",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🛠️ Keeps sensor mesh running even when nodes drop out",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between mesh health checks",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "d75ac901c299b8fa215275600d357e665dc39efe339437c0dccd836876de72a8",
      "binary_size": 461916
    },
    {
      "id": "neural-trader",
      "name": "Neural Trader",
      "category": "ai",
      "version": "1.2.0",
      "size_kb": 20,
      "difficulty": "hard",
      "description": "🤖 Spot market patterns and trends from live data",
      "featured": true,
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Analysis interval",
          "description": "Seconds between market data analysis cycles",
          "default": 60,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "6ba5ced4408b2020db50fc1421aa78e63a7f762eca6306ff4e1ab12ff28d9362",
      "binary_size": 396368
    },
    {
      "id": "ruview-densepose",
      "name": "RuView WiFi DensePose",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 50,
      "difficulty": "hard",
      "description": "🔬 Full body pose tracking from WiFi — no cameras needed",
      "featured": true,
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between pose estimations",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "ccbf57fc2483037082d76a48d0576b9cb56acc82d1af9ac922498d503d922570",
      "binary_size": 396368
    },
    {
      "id": "health-monitor",
      "name": "Health Monitor",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 30,
      "difficulty": "medium",
      "description": "🩺 Contactless heart rate, breathing, sleep, and fall alerts",
      "featured": true,
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "b370fef6f7e879fb84538627a99040fecd029f48f983a3b35f9e79629993a8bc",
      "binary_size": 396368
    },
    {
      "id": "air-quality-index",
      "name": "Air Quality Monitor",
      "category": "health",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "easy",
      "description": "🩺 Track indoor air quality with CO2 and particle sensors",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 30,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "6a961f8b37f2a2775bf4a7a1a62c4b5463454cedfb8c165b36989cb69c623796",
      "binary_size": 461904
    },
    {
      "id": "energy-harvester",
      "name": "Energy Harvester",
      "category": "research",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "medium",
      "description": "🔬 Optimize solar and battery for off-grid seed deployment",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "description": "Seconds between measurements",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "89ef6e8e5c42ca3342d9dd68592f8aeb23b6c49b18d4b59103c2c63d5107c97c",
      "binary_size": 396368
    },
    {
      "id": "swarm-mesh-manager",
      "name": "Swarm Mesh Manager",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "easy",
      "description": "🐝 Find, connect, and monitor all seeds on your network",
      "featured": true,
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Scan interval",
          "description": "Seconds between network discovery scans",
          "default": 30,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        }
      ],
      "sha256": "160ae175ba36a135218cb4be27d622ed21064901f235e2ababf387161147368a",
      "binary_size": 396368
    },
    {
      "id": "swarm-delta-sync",
      "name": "Swarm Delta Sync",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "medium",
      "description": "🐝 Auto-sync data between seeds — only sends changes",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sync interval",
          "description": "Seconds between sync cycles",
          "default": 60,
          "min": 10,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peer",
          "type": "string",
          "label": "Peer address",
          "description": "IP address of the peer seed to sync with",
          "default": "169.254.42.1",
          "cli_arg": "--peer"
        }
      ],
      "sha256": "d6e02cf747200fb435a89a480d88a00c66e937b078dbc5de4ca106041a041365",
      "binary_size": 396368
    },
    {
      "id": "swarm-distributed-store",
      "name": "Distributed Vector Store",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🐝 Spread data across seeds and search them all at once",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sync interval",
          "description": "Seconds between distribution cycles",
          "default": 10,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds in the distributed store",
          "default": "",
          "cli_arg": "--peers"
        }
      ],
      "sha256": "6f90fe8f827ac4f637f49ad2b6d5351b0c6e1256e5ec82cda8dda3abc9a73020",
      "binary_size": 396368
    },
    {
      "id": "swarm-cluster-monitor",
      "name": "Cluster Health Monitor",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "easy",
      "description": "🐝 Live dashboard of every seed's health and status",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Poll interval",
          "description": "Seconds between health polls",
          "default": 15,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds to monitor",
          "default": "",
          "cli_arg": "--peers"
        }
      ],
      "sha256": "2462c5276320199fa0f0774a742c8e6cf6b0a78ff438111d26b58c2ed9d71161",
      "binary_size": 396368
    },
    {
      "id": "swarm-deploy",
      "name": "Swarm Deploy",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "medium",
      "description": "🐝 Install or remove cogs on all seeds at once",
      "config": [
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds to deploy to",
          "default": "",
          "cli_arg": "--peers"
        },
        {
          "key": "install",
          "type": "string",
          "label": "Install cog",
          "description": "Cog ID to install on all peers (e.g. cog-presence)",
          "default": "",
          "cli_arg": "--install"
        },
        {
          "key": "uninstall",
          "type": "string",
          "label": "Uninstall cog",
          "description": "Cog ID to uninstall from all peers",
          "default": "",
          "cli_arg": "--uninstall"
        }
      ],
      "sha256": "2aa64b1fe0ddfc90a73a87d7973f43b09b64d6336d54866b0323844aa61e6d8d",
      "binary_size": 396368
    },
    {
      "id": "swarm-witness-federation",
      "name": "Witness Chain Federation",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 12,
      "difficulty": "hard",
      "description": "🐝 Share tamper-proof audit trails across seeds",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Attestation interval",
          "description": "Seconds between federation rounds",
          "default": 30,
          "min": 5,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds in the federation",
          "default": "",
          "cli_arg": "--peers"
        }
      ],
      "sha256": "4176af68992e4a353da542689f0e255d2b59137efe15446c0baa6a965558a865",
      "binary_size": 396368
    },
    {
      "id": "swarm-load-balancer",
      "name": "Swarm Load Balancer",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 10,
      "difficulty": "medium",
      "description": "🐝 Spread queries across seeds so no single one overloads",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Balance interval",
          "description": "Seconds between load balancing cycles",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds in the load pool",
          "default": "",
          "cli_arg": "--peers"
        }
      ],
      "sha256": "c9a2cc9f5a7a4e5fac5ffc9e2d47095c7ff9453a473f8359e1db9bcdde1d2a46",
      "binary_size": 396368
    },
    {
      "id": "swarm-backup-restore",
      "name": "Swarm Backup & Restore",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 8,
      "difficulty": "easy",
      "description": "🐝 Auto-backup data to other seeds — one-click restore",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Backup interval",
          "description": "Seconds between backup cycles",
          "default": 120,
          "min": 10,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peer",
          "type": "string",
          "label": "Peer address",
          "description": "IP address of the peer seed to backup to or restore from",
          "default": "169.254.42.1",
          "cli_arg": "--peer"
        },
        {
          "key": "mode",
          "type": "select",
          "label": "Operation mode",
          "description": "Whether to backup local data to peer or restore from peer",
          "default": "backup",
          "options": "[\"backup\", \"restore\"]",
          "cli_arg": "--mode"
        }
      ],
      "sha256": "e428554a2f1fff29abecf1e55f69656471df692f7c4912c3923b31a4c9c7b87b",
      "binary_size": 396368
    },
    {
      "id": "swarm-consensus",
      "name": "Swarm Consensus",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 16,
      "difficulty": "hard",
      "description": "🐝 Seeds vote before making critical changes together",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Consensus interval",
          "description": "Seconds between consensus rounds",
          "default": 60,
          "min": 10,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds to vote with",
          "default": "",
          "cli_arg": "--peers"
        },
        {
          "key": "propose",
          "type": "string",
          "label": "Proposal",
          "description": "Action to propose for voting (e.g. enable-cog:presence)",
          "default": "",
          "cli_arg": "--propose"
        }
      ],
      "sha256": "6e91082b396aa406387ce65b08e25e2cebc3327dbd61b8b32ef0aa6eb77277fc",
      "binary_size": 396368
    },
    {
      "id": "swarm-edge-orchestrator",
      "name": "Edge Orchestrator",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 14,
      "difficulty": "hard",
      "description": "🐝 Manage all ESP32 sensor nodes from one place",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Poll interval",
          "description": "Seconds between node polls",
          "default": 2,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "udp_port",
          "type": "integer",
          "label": "UDP port",
          "description": "Port for ESP32 CSI data reception",
          "default": 5005,
          "min": 1024,
          "max": 65535,
          "cli_arg": "--udp-port",
          "advanced": true
        }
      ],
      "sha256": "6d93b99470c933312d62673c90d3198561c92174f58eefdbbfbff018b9678577",
      "binary_size": 396380
    },
    {
      "id": "swarm-mqtt-bridge",
      "name": "MQTT Bridge",
      "category": "swarm",
      "version": "1.2.0",
      "size_kb": 6,
      "difficulty": "easy",
      "description": "🐝 Share events between seeds over MQTT messaging",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Publish interval",
          "description": "Seconds between event publish cycles",
          "default": 5,
          "min": 1,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peers",
          "type": "string",
          "label": "Peer addresses",
          "description": "Comma-separated IP addresses of peer seeds to share events with",
          "default": "",
          "cli_arg": "--peers"
        }
      ],
      "sha256": "428494ccd8b3b5952ec71fc98602c677fbee87e0d5a0558b8650fee0c1b362a8",
      "binary_size": 396368
    },
    {
      "id": "fall-detect",
      "name": "Fall Detection",
      "category": "health",
      "version": "1.0.0",
      "size_kb": 402,
      "difficulty": "easy",
      "description": "Two-stage impact + stillness fall detector over ambient feature stream (ESP32 motion / mic). Optional ruview-mode for CSI-based pose reinforcement.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 10,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "impact_threshold",
          "type": "float",
          "label": "Impact threshold",
          "description": "Z-score of variance spike that flags an impact event",
          "default": 6.0,
          "min": 3.0,
          "max": 12.0,
          "step": 0.5,
          "cli_arg": "--impact-threshold"
        },
        {
          "key": "stillness_window",
          "type": "integer",
          "label": "Stillness window",
          "description": "Seconds after impact in which post-fall stillness must occur",
          "default": 8,
          "min": 3,
          "max": 30,
          "unit": "seconds",
          "cli_arg": "--stillness-window"
        },
        {
          "key": "cooldown",
          "type": "integer",
          "label": "Cooldown after fire",
          "description": "Seconds to suppress further firing after a detected fall",
          "default": 30,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--cooldown"
        },
        {
          "key": "ruview_mode",
          "type": "boolean",
          "label": "RuView mode",
          "description": "Reinforce impact stage with WiFi-CSI head-height proxy if present",
          "default": false,
          "cli_arg": "--ruview-mode"
        }
      ],
      "sha256": "038d0712e3b026b66bcbce8708c782a96aeb4c3f7c0b2838a9ce288df88bc77e",
      "binary_size": 411332
    },
    {
      "id": "cough-detect",
      "name": "Cough Detection",
      "category": "health",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Acoustic transient + spectral cough detector with 30s cluster aggregation. Early-warning signal for respiratory illness.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 10,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "transient_z",
          "type": "float",
          "label": "Transient z-score",
          "description": "Z-score spike threshold to flag a candidate cough",
          "default": 3.0,
          "min": 1.5,
          "max": 6.0,
          "step": 0.25,
          "cli_arg": "--transient-z"
        },
        {
          "key": "cluster_window",
          "type": "integer",
          "label": "Cluster window",
          "description": "Seconds to count clustered events",
          "default": 30,
          "min": 10,
          "max": 300,
          "unit": "seconds",
          "cli_arg": "--cluster-window"
        },
        {
          "key": "alert_count",
          "type": "integer",
          "label": "Cluster alert count",
          "description": "Events within window to fire cluster alert",
          "default": 3,
          "min": 2,
          "max": 20,
          "cli_arg": "--alert-count"
        }
      ],
      "sha256": "9581eb7ef78da87acc1550314208e7af5550319519b790a14a2884a4e6b342a6",
      "binary_size": 461904
    },
    {
      "id": "baby-cry",
      "name": "Baby Cry Detection",
      "category": "health",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Sustained mid-band energy detector for nursery / infant monitoring. Audio-only, no camera.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 5,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "cry_z",
          "type": "float",
          "label": "Cry z-score",
          "description": "Mid-band z-score threshold above baseline to count as elevated",
          "default": 2.5,
          "min": 1.0,
          "max": 5.0,
          "step": 0.25,
          "cli_arg": "--cry-z"
        },
        {
          "key": "cry_min_secs",
          "type": "integer",
          "label": "Minimum sustained seconds",
          "description": "Continuous elevated frames required to fire",
          "default": 2,
          "min": 1,
          "max": 30,
          "unit": "seconds",
          "cli_arg": "--cry-min-secs"
        },
        {
          "key": "cooldown",
          "type": "integer",
          "label": "Cooldown after fire",
          "default": 15,
          "min": 5,
          "max": 300,
          "unit": "seconds",
          "cli_arg": "--cooldown"
        }
      ],
      "sha256": "9a3ccc9b3427472e3363cc3d0a5120192a04094dd1a288f82e2ebacd49e6c7db",
      "binary_size": 461904
    },
    {
      "id": "snore-monitor",
      "name": "Snore Monitor",
      "category": "health",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Periodic low-band energy tracker for sleep-quality / apnea-risk trending. Companion to sleep-apnea cog.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 5,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "burst_z",
          "type": "float",
          "label": "Burst z-score",
          "default": 2.0,
          "min": 1.0,
          "max": 4.0,
          "step": 0.25,
          "cli_arg": "--burst-z"
        },
        {
          "key": "minimum_rate_hz",
          "type": "float",
          "label": "Min snore rate",
          "description": "Lower bound of expected snore repetition rate (Hz)",
          "default": 1.5,
          "min": 0.5,
          "max": 3.0,
          "step": 0.1,
          "cli_arg": "--minimum-rate-hz"
        },
        {
          "key": "maximum_rate_hz",
          "type": "float",
          "label": "Max snore rate",
          "description": "Upper bound of expected snore repetition rate (Hz)",
          "default": 4.0,
          "min": 2.0,
          "max": 8.0,
          "step": 0.1,
          "cli_arg": "--maximum-rate-hz"
        }
      ],
      "sha256": "5948dbd75295bc822a7a7059211ba882539492f721857eab1e5ee5d48320908b",
      "binary_size": 461904
    },
    {
      "id": "glass-break",
      "name": "Glass-Break Detection",
      "category": "security",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Two-phase bang + shatter acoustic detector. Distinguishes glass break from ordinary impulse noise.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 5,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "bang_z",
          "type": "float",
          "label": "Bang z-score",
          "default": 5.0,
          "min": 2.0,
          "max": 10.0,
          "step": 0.5,
          "cli_arg": "--bang-z"
        },
        {
          "key": "shatter_window_ms",
          "type": "integer",
          "label": "Shatter window",
          "description": "Milliseconds after bang within which shatter must be observed",
          "default": 500,
          "min": 100,
          "max": 2000,
          "unit": "ms",
          "cli_arg": "--shatter-window-ms"
        },
        {
          "key": "cooldown",
          "type": "integer",
          "label": "Cooldown after fire",
          "default": 30,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--cooldown"
        }
      ],
      "sha256": "1152021dc07ee102733495f55eb2119f9188c98363e109582ce9845549e354b9",
      "binary_size": 461904
    },
    {
      "id": "gunshot-detect",
      "name": "Gunshot Detection",
      "category": "security",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Saturating peak + exponential decay acoustic detector with optional ruview CSI motion-drop reinforcement.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 5,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "peak_threshold",
          "type": "float",
          "label": "Peak threshold",
          "description": "Normalized amplitude above which saturation gate fires",
          "default": 0.95,
          "min": 0.5,
          "max": 1.0,
          "step": 0.05,
          "cli_arg": "--peak-threshold"
        },
        {
          "key": "decay_frames",
          "type": "integer",
          "label": "Decay frames",
          "description": "Frames in which exponential decay must match",
          "default": 4,
          "min": 2,
          "max": 20,
          "cli_arg": "--decay-frames"
        },
        {
          "key": "cooldown",
          "type": "integer",
          "label": "Cooldown after fire",
          "default": 30,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--cooldown"
        },
        {
          "key": "ruview_mode",
          "type": "boolean",
          "label": "RuView mode",
          "description": "Reinforce detection with CSI motion-drop evidence in 5s post-peak window",
          "default": false,
          "cli_arg": "--ruview-mode"
        }
      ],
      "sha256": "598bce51c7e8ebf8028742139ac545216399925303db33b9b6dbf5da6430bd89",
      "binary_size": 461904
    },
    {
      "id": "package-detect",
      "name": "Package Arrival Detection",
      "category": "retail",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Sustained CSI-shift detector for porch / loading bay package arrivals and departures. Requires ESP32 CSI ruview input.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 2,
          "min": 1,
          "max": 30,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "persistence",
          "type": "integer",
          "label": "Persistence threshold",
          "description": "Seconds the shift must persist to count as package arrival",
          "default": 30,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--persistence"
        },
        {
          "key": "shift_z",
          "type": "float",
          "label": "Shift z-score",
          "description": "Z-score of CSI variance shift to enter transient state",
          "default": 2.5,
          "min": 1.0,
          "max": 5.0,
          "step": 0.25,
          "cli_arg": "--shift-z"
        }
      ],
      "sha256": "a9b669ff8421472cd2af833eb33a21d9c1f958a6333b80ba9e42d4bc573ae761",
      "binary_size": 461904
    },
    {
      "id": "ppe-compliance",
      "name": "PPE Compliance",
      "category": "industrial",
      "version": "1.0.0",
      "size_kb": 387,
      "difficulty": "easy",
      "description": "Cog-composition layer: alerts when ruview-densepose detects presence in a restricted zone without an accompanying PPE-camera-cog confirmation vector.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 5,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "zone",
          "type": "string",
          "label": "Restricted zone label",
          "default": "restricted",
          "cli_arg": "--zone"
        },
        {
          "key": "confirmation_window",
          "type": "integer",
          "label": "Confirmation window",
          "description": "Seconds within which PPE confirmation must be observed",
          "default": 60,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--confirmation-window"
        }
      ],
      "sha256": "0870f7e6926e90ccfe6c93fa21d32491233fa7b17017001e6d38b4b441bf71cf",
      "binary_size": 396368
    },
    {
      "id": "slip-fall-zone",
      "name": "Slip / Wet-Floor Zone",
      "category": "industrial",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Pre-fall risk detector. Fires when motion-variance drop, splash audio, and optional cautious-gait CSI all signal elevated slip risk.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 10,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "motion_drop_z",
          "type": "float",
          "label": "Motion drop z-score",
          "default": 1.5,
          "min": 0.5,
          "max": 5.0,
          "step": 0.25,
          "cli_arg": "--motion-drop-z"
        },
        {
          "key": "splash_z",
          "type": "float",
          "label": "Splash z-score",
          "default": 3.0,
          "min": 1.5,
          "max": 6.0,
          "step": 0.25,
          "cli_arg": "--splash-z"
        },
        {
          "key": "cooldown",
          "type": "integer",
          "label": "Cooldown after fire",
          "default": 600,
          "min": 60,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--cooldown"
        },
        {
          "key": "ruview_mode",
          "type": "boolean",
          "label": "RuView mode",
          "description": "Add cautious-gait CSI score to risk fusion",
          "default": false,
          "cli_arg": "--ruview-mode"
        }
      ],
      "sha256": "5c699e0924cf63164d96d0700491d36399a262f1a4cb7bfae5b6e513237edd80",
      "binary_size": 461904
    },
    {
      "id": "water-leak",
      "name": "Water Leak Detection",
      "category": "building",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Persistent low-amplitude hiss + periodic drip acoustic detector with multi-minute persistence gate. Two-stage likely → confirmed.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 2,
          "min": 1,
          "max": 30,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "hiss_z",
          "type": "float",
          "label": "Hiss z-score",
          "default": 1.5,
          "min": 0.5,
          "max": 4.0,
          "step": 0.25,
          "cli_arg": "--hiss-z"
        },
        {
          "key": "persistence",
          "type": "integer",
          "label": "Persistence threshold",
          "description": "Seconds the signature must hold to fire LEAK_CONFIRMED",
          "default": 300,
          "min": 30,
          "max": 3600,
          "unit": "seconds",
          "cli_arg": "--persistence"
        }
      ],
      "sha256": "f6273775bf0c88baa290e79062c85b8ee0603946c4028935b34bd77744ff4170",
      "binary_size": 461904
    },
    {
      "id": "smoke-fire",
      "name": "Smoke / Fire Detection",
      "category": "building",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Multi-signal smoke and fire detector. Fuses acoustic crackle, thermal drift proxy, and optional ruview CSI plume signature. Not a UL-listed replacement for code-required smoke alarms.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 10,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "crackle_z",
          "type": "float",
          "label": "Crackle z-score",
          "default": 2.5,
          "min": 1.0,
          "max": 5.0,
          "step": 0.25,
          "cli_arg": "--crackle-z"
        },
        {
          "key": "thermal_drift_z",
          "type": "float",
          "label": "Thermal drift z-score",
          "default": 1.5,
          "min": 0.5,
          "max": 4.0,
          "step": 0.25,
          "cli_arg": "--thermal-drift-z"
        },
        {
          "key": "cooldown",
          "type": "integer",
          "label": "Cooldown after fire",
          "default": 60,
          "min": 30,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--cooldown"
        },
        {
          "key": "ruview_mode",
          "type": "boolean",
          "label": "RuView mode",
          "description": "Add CSI plume signature as a third evidence stream",
          "default": false,
          "cli_arg": "--ruview-mode"
        }
      ],
      "sha256": "74ea45f4d389b0c9a8e950ad38a1dca30ad4a6eee5653717c331a07ec993586d",
      "binary_size": 461904
    },
    {
      "id": "frost-warning",
      "name": "Frost Warning",
      "category": "building",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Predicts frost 6 hours ahead via temperature trend + dewpoint-depression gate. Field/orchard agriculture.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 10,
          "min": 1,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "frost_threshold",
          "type": "float",
          "label": "Frost threshold (Celsius)",
          "default": 2.0,
          "min": -10.0,
          "max": 5.0,
          "step": 0.5,
          "unit": "C",
          "cli_arg": "--frost-threshold"
        },
        {
          "key": "projection_hours",
          "type": "integer",
          "label": "Projection horizon (hours)",
          "default": 6,
          "min": 1,
          "max": 24,
          "unit": "hours",
          "cli_arg": "--projection-hours"
        },
        {
          "key": "dewpoint_min_depression",
          "type": "float",
          "label": "Dewpoint depression min (Celsius)",
          "description": "Minimum (temp - dewpoint) below which frost-likely fires",
          "default": 3.0,
          "min": 0.0,
          "max": 10.0,
          "step": 0.5,
          "unit": "C",
          "cli_arg": "--dewpoint-min-depression"
        }
      ],
      "sha256": "7fb8e981520eeb1e5d20c15523e9a6a593a1763f1edabce731a2616321299137",
      "binary_size": 461904
    },
    {
      "id": "beehive-monitor",
      "name": "Beehive Monitor",
      "category": "building",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Acoustic hive state classifier. Detects healthy / chaotic / queenless / swarming / robbing via hum-band energy + chaos + piping autocorr.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 10,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "chaos_z",
          "type": "float",
          "label": "Chaos z-score",
          "default": 1.5,
          "min": 0.5,
          "max": 4.0,
          "step": 0.25,
          "cli_arg": "--chaos-z"
        },
        {
          "key": "robbing_z",
          "type": "float",
          "label": "Robbing z-score",
          "default": 3.0,
          "min": 1.5,
          "max": 6.0,
          "step": 0.25,
          "cli_arg": "--robbing-z"
        }
      ],
      "sha256": "5ada0bd8ca11bc4ea8af55c2a1b223e51b85140dc5ddcfd588237051153c8784",
      "binary_size": 461904
    },
    {
      "id": "predictive-maintenance",
      "name": "Predictive Maintenance",
      "category": "building",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Vibration harmonic analyzer for rotating equipment. Tracks F1 / 2×F1 / high-order / sideband energy to score degradation severity.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 1,
          "min": 1,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "baseline_mins",
          "type": "integer",
          "label": "Baseline learn period",
          "default": 5,
          "min": 1,
          "max": 60,
          "unit": "minutes",
          "cli_arg": "--baseline-mins"
        },
        {
          "key": "severity_warn",
          "type": "float",
          "label": "Severity warn threshold",
          "default": 0.4,
          "min": 0.1,
          "max": 0.9,
          "step": 0.05,
          "cli_arg": "--severity-warn"
        },
        {
          "key": "severity_alarm",
          "type": "float",
          "label": "Severity alarm threshold",
          "default": 0.7,
          "min": 0.3,
          "max": 1.0,
          "step": 0.05,
          "cli_arg": "--severity-alarm"
        }
      ],
      "sha256": "d87ae0e08642314e27d6b149bd6ab47d0cae43e23fdf2eb9033cc4956de6856f",
      "binary_size": 461904
    },
    {
      "id": "parking-occupancy",
      "name": "Parking Occupancy",
      "category": "retail",
      "version": "1.0.0",
      "size_kb": 451,
      "difficulty": "easy",
      "description": "Per-zone parking occupancy via ESP32 CSI subcarrier-amplitude shift. Tracks utilization and churn-per-hour. Requires ruview.",
      "config": [
        {
          "key": "interval",
          "type": "integer",
          "label": "Sampling interval",
          "default": 5,
          "min": 2,
          "max": 60,
          "unit": "seconds",
          "cli_arg": "--interval"
        },
        {
          "key": "zones",
          "type": "integer",
          "label": "Number of zones",
          "description": "Subcarrier groups; each is one parking-zone proxy",
          "default": 4,
          "min": 1,
          "max": 8,
          "cli_arg": "--zones"
        },
        {
          "key": "threshold",
          "type": "float",
          "label": "Occupancy threshold",
          "description": "Subcarrier-energy ratio above baseline-mean to count as occupied",
          "default": 0.4,
          "min": 0.1,
          "max": 1.0,
          "step": 0.05,
          "cli_arg": "--threshold"
        }
      ],
      "sha256": "15709c92cdc4aac2b0fb3946825f420ca88e984c3e21b8cb81e95d9211a9d401",
      "binary_size": 461904
    },
    {
      "id": "cognitive-pipeline",
      "name": "Cognitive Pipeline (FastGRNN + SmolLM2)",
      "category": "ai",
      "version": "0.1.1",
      "size_kb": 320,
      "difficulty": "hard",
      "description": "🧠 FastGRNN anomaly gate + SmolLM2 sparse-LLM inference for on-device Pi Zero 2W cognitive events",
      "hardware_requirements": [
        "pi-zero-2w",
        "v0-appliance"
      ],
      "config": [
        {
          "key": "model_id",
          "type": "string",
          "label": "GGUF model",
          "description": "smollm2-135m (fits Pi Zero) or qwen2.5-0.5b-q4 (Pi 5 only)",
          "default": "smollm2-135m",
          "allowed": [
            "smollm2-135m",
            "qwen2.5-0.5b-q4"
          ],
          "cli_arg": "--model"
        },
        {
          "key": "bind_port",
          "type": "integer",
          "label": "HTTP bind port",
          "description": "Cog binds 127.0.0.1:<this>",
          "default": 8033,
          "min": 8001,
          "max": 9999,
          "cli_arg": "--port"
        },
        {
          "key": "deadline_secs",
          "type": "integer",
          "label": "Decode deadline",
          "description": "Max seconds per /generate before truncating",
          "default": 90,
          "min": 5,
          "max": 600,
          "unit": "seconds",
          "cli_arg": "--deadline-secs"
        },
        {
          "key": "gate_threshold",
          "type": "float",
          "label": "FastGRNN threshold",
          "description": "Anomaly score above which SmolLM2 fires",
          "default": 1.0,
          "min": 0.1,
          "max": 10.0,
          "step": 0.1,
          "cli_arg": "--gate-threshold"
        },
        {
          "key": "event_ring_cap",
          "type": "integer",
          "label": "Event ring size",
          "description": "Events kept in memory",
          "default": 100,
          "min": 10,
          "max": 10000,
          "cli_arg": "--ring-cap"
        }
      ],
      "api": {
        "bind_port": 8033,
        "bind_loopback_only": true
      },
      "assets": [
        {
          "id": "smollm2-135m",
          "filename": "smollm2-135m/model.gguf",
          "gcs_path": "models/smollm2-135m-q4_k_m.gguf",
          "sha256": "8030f04528538d47bda434f6f0bdf3952c40a58123e4d5e755332f23731a8684",
          "bytes": 105454144,
          "required_when": "config.model_id == 'smollm2-135m'"
        },
        {
          "id": "smollm2-135m-tokenizer",
          "filename": "smollm2-135m/tokenizer.json",
          "gcs_path": "models/smollm2-135m-tokenizer.json",
          "sha256": "9ca9acddb6525a194ec8ac7a87f24fbba7232a9a15ffa1af0c1224fcd888e47c",
          "bytes": 2104556,
          "required_when": "config.model_id == 'smollm2-135m'"
        },
        {
          "id": "qwen2.5-0.5b-q4",
          "filename": "qwen2.5-0.5b-q4/model.gguf",
          "gcs_path": "models/qwen2.5-0.5b-q4_k_m.gguf",
          "sha256": "74a4da8c9fdbcd15bd1f6d01d621410d31c6fc00986f5eb687824e7b93d7a9db",
          "bytes": 491400032,
          "required_when": "config.model_id == 'qwen2.5-0.5b-q4'"
        },
        {
          "id": "qwen2.5-0.5b-q4-tokenizer",
          "filename": "qwen2.5-0.5b-q4/tokenizer.json",
          "gcs_path": "models/qwen2.5-0.5b-tokenizer.json",
          "sha256": "c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539",
          "bytes": 7031645,
          "required_when": "config.model_id == 'qwen2.5-0.5b-q4'"
        }
      ]
    },
    {
      "id": "tailscale",
      "sha256": "bc4c5560928d729ea621ce9af9da1d1c0368067e5173fef1cde0370172d266b1",
      "name": "Tailscale Mesh VPN",
      "category": "network",
      "version": "0.1.4",
      "size_kb": 700,
      "difficulty": "medium",
      "description": "🔒 Reach the seed from anywhere via a private WireGuard mesh (Tailscale). Userspace mode — no root.",
      "hardware_requirement": "pi-zero-2w",
      "config": [
        {
          "key": "auth_key",
          "type": "string",
          "label": "Auth key",
          "description": "One-time Tailscale auth key from https://login.tailscale.com/admin/settings/keys",
          "default": "",
          "cli_arg": "--auth-key",
          "secret": true
        },
        {
          "key": "hostname",
          "type": "string",
          "label": "Tailnet hostname",
          "description": "Defaults to the seed's hostname",
          "default": "",
          "cli_arg": "--hostname"
        },
        {
          "key": "serve_agent",
          "type": "boolean",
          "label": "Expose dashboard",
          "description": "Make https://localhost:8443 reachable via Tailscale",
          "default": true,
          "cli_arg": "--serve-agent"
        },
        {
          "key": "advertise_tags",
          "type": "string",
          "label": "Tailnet tags",
          "description": "Comma-separated Tailscale ACL tags",
          "default": "tag:seed",
          "cli_arg": "--advertise-tags"
        }
      ],
      "api": {
        "bind_port": 8044,
        "bind_loopback_only": true
      },
      "assets": [
        {
          "id": "tailscaled",
          "filename": "tailscaled",
          "gcs_path": "tailscale/0.1.0/tailscaled-armhf",
          "sha256": "0c9833f4969717475274d99106db97d2e563a4d3366d4f43f2cae0117f2d4d63",
          "bytes": 34971946,
          "executable": true
        },
        {
          "id": "tailscale_cli",
          "filename": "tailscale",
          "gcs_path": "tailscale/0.1.0/tailscale-armhf",
          "sha256": "4dbeacc22db9225b689efd24fa5462dccd0c8ba5db01942f176a370a80aa4f96",
          "bytes": 29257464,
          "executable": true
        }
      ]
    }
  ]
}
