System facts
Migrated verbatim from the injected freeform memory layer on 2026-11-05. These are operational facts about the estate — routing, backups, authorities, quirks — not personal facts about Joe; personal facts belong in USER and the guarded memory store. Each line below is one original entry.
- Memory architecture: Mnemosyne (source_guarded_mnemosyne, ~/.hermes/source-memory) holds durable personal facts; workspace files hold notes/tasks; skills own procedures. Built-in MEMORY.md/USER.md are a separate injected layer, not source-guarded. Pre-simplification archive: ~/.hermes/backups/simplification-20261030/personal-memory-finish/rollback/.
- Model routing: default and delegation are gpt-6-luna-900k on openai-codex; the wire model must be gpt-6-luna (the -900k picker alias 400s) with store:false, stream:true. On HTTP 429 the gateway falls back silently to open-design/deepseek-v4.1-flash — check state.db gateway_runtime.fallback_active and session_model_usage.billing_provider for which model actually answered.
- Backups: homelab-backup.py (Sundays 21:05) → ~/.hermes/backups/homelab/; system-b2-backup.py (daily 03:35) syncs to B2 immich-crypt:system-backups/. Simple Tasks bundles: ~/.hermes/backups/simple-tasks (48 hourly, 30 daily, verified by ops.py). Memory bundles: ~/.hermes/backups/mnemosyne. Restore runbook simple-tasks/RESTORE.md; latest drill evidence ~/.hermes/state/remediation-20261104/restore-proof.json.
- Cloudflared add-on (9074a9fa_cloudflared) needs explicit additional_hosts per subdomain — wildcards do not route between services. external_hostname=00000041.xyz; frigate→http://frigate:5000, doorbell→http://homeassistant:8123. A config with none of tunnel_token/external_hostname/additional_hosts fails FATAL. nginx-proxy-manager serves local .local names (mealie.local → 192.168.0.182:8648).
- Doorbell: three automations (button_pressed, person_alert, person_describe_ai) on Frigate doorbell/person events, sharing timer.doorbell_mute, input_text.doorbell_last_alerted, input_datetime.doorbell_last_alert_at, counter.doorbell_suppressed_known. Detail lives in the frigate-nvr skill.
- Proxmox host reachable from joe-host: ssh root@192.168.0.200 with ~/.ssh/id_ed25519. joe-host is VM 101; USB pass-through qm set 101 -usbN host=VID:PID, detach with -delete usbN.
- Codex 5-hour window: cron 86ca9de88be0 runs codex-window-poke.py daily 06:30 (no_agent), opening 06:30–11:30; a 429 there means the window was already open.
- /home/joe/workspace is a symlink into /home/joe/Downloads/workspace-20260625T191839Z-3-001/workspace/workspace; long absolute paths are expected.
- Memory state (4 Nov 2026): guarded store serves 9 working memories / 2 facts / 0 episodic. Read-dependency coverage began 2 Nov, so older sessions report history_out_of_coverage rather than being searchable. Capture is not yet evidenced for ordinary turns — see ~/.hermes/state/memory-capture-accounting.json. Do not describe the memory repair as complete.
- Task authority: the Simple Tasks SQLite database (~/.local/share/simple-tasks/tasks.sqlite3, schema 5) owns tasks, watches and review templates. ~/.hermes/state/task-authority.json holds authority=sqlite|markdown and is the one-line reverse path; daily-tick and timed-close-of-day read it through simple-tasks/selection.py. Normative contract: ~/workspace/.hermes/plans/2026-11-04-tracker-contract.md, which supersedes TRACKER-STANDARD.md where they differ. Markdown trackers are frozen evidence, not task truth. The calendar mirror keeps an ownership ledger in calendar_events and verifies writes by readback; —resolve-duplicates keeps the lowest event id. The 03:35 B2 sync now includes verified simple-tasks bundles as a required source (missing or older than 6h fails).
- Task authority (since 4 Nov 2026): SQLite ~/.local/share/simple-tasks/tasks.sqlite3, schema 5, owns task state; Markdown trackers are frozen evidence, not truth. ~/.hermes/state/task-authority.json switches daily-tick.py and timed-close-of-day.py between sqlite and markdown. New tasks go through POST http://127.0.0.1:8672/api/items (ring-reminder already does); never write task rows into general-todo. Migration contract: ~/workspace/.hermes/plans/2026-11-04-tracker-contract.md; staging/migration tools in simple-tasks/migrate/.
- simple-tasks-backup.service ExecStart must pass
take --db /home/joe/.local/share/simple-tasks/tasks.sqlite3 --tag auto— ops.py now requires a subcommand and silently failed hourly with exit 2 when it did not. ops.py retention keeps 48 hourly bundles plus one automatic bundle per day for 30 days. Todo bundles (~/.hermes/backups/simple-tasks) are a required source in system-b2-backup.py. - Calendar mirror (simple-tasks/calendar_sync.py): calendar_events is the ownership ledger; every write is proven by a scoped readback, never by prose;
--resolve-duplicateskeeps the lowest event id and reports removals. The listing window must span every desired date — capping it at ~3 years hid a 2051 mortgage maturity, so readback reported ‘absent’ and a duplicate was created. - Two session_search guards are registered (source_guarded_mnemosyne and source_memory_policy). Each must MERGE downstream source_policy_filtered, filtered_reasons and complete/partial instead of replacing them — replacing turned an honest history_out_of_coverage refusal into complete:true with no reason. Plugin edits only take effect after Joe restarts the gateway from his own shell.
- Task authority since 4 Nov 2026: SQLite (~/.local/share/simple-tasks/tasks.sqlite3, schema and user_version 5) owns task/watch/record/review state. App, 08:00 daily-tick, 21:00 close, Pulse and renewal-watchdog all read it through simple-tasks/selection.py; the switch is ~/.hermes/state/task-authority.json (authority: sqlite|markdown). Markdown trackers are frozen evidence, not truth; generated compatibility views go to ~/workspace/generated/ via simple-tasks/publish.py, which runs as ExecStartPost on the hourly simple-tasks-backup unit. Normative contract: ~/workspace/.hermes/plans/2026-11-04-tracker-contract.md
- Tracker estate: SQLite owns task state; contract at .hermes/plans/2026-11-04-tracker-contract.md; task-authority.json switches digest/close; generated/ views rebuilt hourly.
Related
- USER — how Joe wants to be worked with
- system-map — what runs where