# 2026-04-18 Daily Notes ## Location Cache & Hermes Integration — Completed - **location_cache.py** committed (`d54ca65`) — cache-first, goplaces CLI + Nominatim fallback + haversine - **Hermes integration** (`a718b2a`) — `enrich_location()` appends 📍 + travel time to event notifications - Known locations seeded: Golrusk (7 min), Aurora BayCare (5 min), Resurrection Church (12 min) - Google Places API key in `scripts/.env` (currently 403 — suspended). Nominatim is fallback. ## Google Account Suspended - SA + Gmail app password + Places API all dead (CONSUMER_SUSPENDED) - Crons disabled, then re-enabled after Radicale migration removed all Google deps ## Drop-Box Document Sorter — Built - `document_sorter.py` committed (`b615b9b`) — OCR + LLM + Drive pipeline - Blocked on Google account restoration for Drive API ## OpenClaw Quick Wins — Applied - Security: secrets to `.env` (chmod 600), `redactSensitive: "tools"` - Heartbeat: `lightContext` + `isolatedSession` + `activeHours 06:00-23:00 CST` - Fallback chain: kimi-k2.5:cloud → gemma4:latest → qwen2.5-coder:7b - Command logger hook enabled - Dreaming (3 AM CST) + Active Memory (DMs only, 30s timeout) enabled - sessionMemory experimental enabled ## Radicale CalDAV Migration — COMPLETED - Radicale 3.7.1 on `0.0.0.0:5232`, htpasswd bcrypt, 3 users (matt, aundrea, assistant) - `calendar_sync.py` fully rewritten — all Google API stripped, uses caldav+icalendar - 6 downstream modules updated, public API preserved - `process_webhook_email()` wired: webhook → LLM → Radicale → Brain → Hermes - Commit `a8f32d1` pushed ### Key Lessons - htpasswd MUST use bcrypt `$2b$` — `$apr1$` fails - Bind `0.0.0.0:5232` — Tailscale IPs are virtual/rotating - Rights file: permissive `RrWw` — per-user ACL caused 403 - iOS CalDAV discovery is per-user principal only → both phones use `assistant` account ## Cloudflare + Phone Setup - `cal.hoffdesk.com` Cloudflare Tunnel → `localhost:5232` (HTTPS for iOS) - `hook.hoffdesk.com` Cloudflare Tunnel → webhook FastAPI - Cloudflare Email Worker deployed: `assistant@hoffdesk.com` → Worker → webhook - iPhone CalDAV confirmed syncing (Matt's phone) ## Hermes + Location Hardening - `hermes_notify()` — fires on every Radicale write, direct Bot API (no CLI hang) - Day-of-week mismatch detection: LLM extracts `claimed_day_of_week`, pipeline cross-checks - LLM location hallucination fix: "Golrusk" → fuzzy cache match → "Golrusk Pet Care Center" - Nominatim fallback for when Google Places API is dead - Duplicate notification fix: removed event-creation from `push_pipeline_results()` ## Auth Circuit Breaker - 3 consecutive IMAP auth failures → circuit trips → ONE alert to Matt → silence - Auto-resets on success, manual reset via CLI or state file deletion - Webhook pipeline unaffected (no IMAP dependency) ## Backup Strategy - Daily 7 AM: tar Radicale + ChromaDB + config → `~/.hoffdesk_backups/` (7-day rolling) - Remote copy to Gaming PC via Tailscale SSH (`matt-pc.tail864e81.ts.net`) - Windows SCP workaround: Python pipe on remote side - `SKIP_REMOTE=true` env var for when Gaming PC is offline ## Security Fixes - `scripts/.env`: 664 → 600 - `htpasswd`: 664 → 600 - Location cache deduped: 11 → 6 entries - MagicDNS replacing hardcoded IPs in all config ## Outstanding (as of 4/18) - Aundrea phone CalDAV setup (deferred) - Auth circuit breaker (done 4/19) - Drop-Box Drive (blocked on Google) - command-logger.jsonl logrotate check in ~1 month