# 2026-05-08 — Icarus V2 Rebuild Day ## Key Decision: The Map After a comprehensive architecture grill, Matt and I aligned on: **The Vision:** Icarus as a **standalone sovereign appliance** — an M4 Mac Mini running a bespoke daemon, no OpenClaw dependency, no Cloudflare, no cloud model for core loop. Three capabilities: inbox→calendar, ambient coordination (Telegram shadow), knowledge retrieval (ChromaDB RAG). **Three Director Verdicts:** 1. **Access** → Tailscale Funnel (not Cloudflare/domain). Dashboard = admin console, Telegram = product UI. 2. **Infrastructure** → Bespoke daemon (not OpenClaw). APScheduler + direct Telegram API calls. Kill the 8 OpenClaw cron dependencies. 3. **Config** → Template YAML (not hard-coded). Ship `template.yaml`, Hoffmann profile lives in `hoffmann.yaml`, engine reads dynamically. **Archived legacy Icarus (22K lines, 84 files)** → `~/archive/icarus-legacy-20260508/` **Created new Icarus V2 at** `~/icarus/` — 1,478 lines, 8 modules. ## Built Today - `icarus/config/loader.py` — YAML-based family config loader with inference rules - `icarus/tripwire.py` — V2.1 regex tripwire, 21-test validation, 0.35 threshold - `icarus/extractor.py` — Local LLM extraction (Ollama, adaptive model selection) - `icarus/event_graph.py` — Canonical family state store (SQLite, events + extractions tables) - `icarus/brain/__init__.py` — ChromaDB knowledge retrieval (single source of truth) - `icarus/daemon.py` — Bespoke daemon with IMAP poller, Telegram long-poll, internal scheduler - `icarus/config/families/template.yaml` — Template for new families - `setup.py` + `pyproject.toml` — Package structure **Gaming PC stays wired in** as M4 facsimile. If architecture hits a wall because dev != target, pivot noted. ## File Inventory (New Icarus) ``` ~/icarus/ ├── setup.py / pyproject.toml └── icarus/ ├── __init__.py # Package metadata ├── daemon.py # Bespoke daemon (652 lines) ├── tripwire.py # Regex signal detection ├── extractor.py # Local LLM extraction ├── event_graph.py # SQLite canonical store ├── config/ │ ├── loader.py # YAML family config loader │ └── families/ │ ├── template.yaml # For new families │ └── hoffmann.yaml # Hoffmann family config └── brain/ └── __init__.py # ChromaDB RAG ``` ## Remaining Work (in priority order) 1. Wire the HoffDesk IMAP proxy callback to new Icarus modules (replace dead `_on_email_received`) 2. Create optional FastAPI mounts in HoffDesk for Icarus dashboard endpoints 3. Migrate the 8 OpenClaw cron jobs to daemon's APScheduler 5. Test end-to-end: email → IMAP → tripwire → extraction → event graph 6. Write `install.sh` for the appliance one-command install ## Tripwire Calibration (v2.1) - 21 test messages: 16 positive + 5 negative - Fire threshold: 0.35 (down from 0.4 v2) - Name mention boost: +0.08 when family member name + other signal - Key fix: `name_mention` pattern needed `re.IGNORECASE`, `hour_only` pattern added for bare hour references - All 21 pass ## Cron Separation (afternoon session) **Shadow TTL Purge** and **Thoth Shadow Ingest** — dropped from scope. TTL purge was born of old data paranoia (ChromaDB is Icarus-native now, no shared infra concerns). Thoth is a candidate for the experiments workspace, not a cron. ### Midas & Daedalus Crons — Migrated to system crontab **Decision:** Market AM/PM briefs (Midas) and Bluesky crosspost (Daedalus) belong to their respective workflows, not OpenClaw's cron system. System crontab is more reliable for simple Python script execution (no 5-minute agent timeout, no DNS dependency on ollama.com). **Changes made:** - Disabled 3 OpenClaw crons: `market:am-brief`, `market:pm-brief`, `blog:bluesky-crosspost` - Added system crontab entries with correct script paths - Fixed bug: AM brief was calling `daily_briefing.py --am` (flag not supported); now calls `premarket_briefing.py` - PM brief DNS error (ollama.com resolution failure) was a transient issue, not code ### Experiments Directory Created `~/icarus/experiments/` for shadow-mode parallel testing: - `README.md` — rules and how-to - `thoth/adapter.py` — Thoth extractor shell, same interface as production - `llm-swaps/README.md` — LLM comparison testing guide - Wired into daemon via env vars: `ICARUS_EXPERIMENT`, `ICARUS_EXPERIMENT_NAME`, `ICARUS_EXPERIMENT_LOG`, `ICARUS_EXPERIMENT_PROMOTE` - Experiment runs alongside production, logs comparisons to `experiments//eval_results/` - Auto-promote defaults to **off** ### Remaining OpenClaw Crons (10) ``` Memory Dreaming — system (memory core) memory-distill — system (daily log distillation) memory-wiki-sync — system (wiki sync) family:daily-brief — Icarus (dev/test, HBM) shadow-ttl-purge — Icarus (dev/test, to be dropped) thoth-shadow-ingest — Icarus (dev/test, to be dropped) shadowbot-metrics — Icarus (dev/test) maintenance:daily — system healthcheck — system (Socrates) OpenClaw status — system (Socrates) ```