πŸ“„ 2026-05-08.md 5,253 bytes Yesterday 16:56 πŸ“‹ Raw

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
  4. Test end-to-end: email β†’ IMAP β†’ tripwire β†’ extraction β†’ event graph
  5. 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/<name>/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)