Cambium Status — 2026-04-12 Afternoon
What’s working RIGHT NOW
| Capability | Status | Evidence |
|---|---|---|
| Rhythms (scheduler) | Production | Heartbeat ticking every 60s, morning.pulse fires at 06:00 Berlin |
| Memory (4-layer) | Production | PgMemoryStore, SubstrateReader reads 4 substrate entries, DailyReader, consolidation at 03:00 |
| Spore (deployment DNA) | Production | spore.yaml loads cleanly, all paths resolve |
| Persona routing | Production | 8 personas + Obadiah fallback, memory marks captured |
| Discord listening | Production | Obadiah-Cambium#9739 connected to Cambium test server |
| Persona responses | Production | MacKenzie responded about money, Obadiah responded to “are you alive?” |
| Morning brief | Production | Composed via Ollama, fires automatically at 06:00 Berlin |
| Local LLM (Ollama) | Production | Qwen 3 14B, zero cost, model loads on demand |
| Postgres persistence | Production | All three stores (signals, memory, rhythms) survive restart |
| launchd daemon | Production | KeepAlive, auto-restart, survives reboot |
What’s needed to be FULLY autonomous
Tier 1: Polish what’s live (hours of work, no design needed)
-
Fix test failures — the cortex test suite has failures from the Obadiah fallback change. Mechanical fix.
-
Clean up the boot smoke test signal — the brain emits a synthetic “I cannot sleep” on every boot, creating 20+ identical routing marks in the DB. This should either be removed or gated behind a
CAMBIUM_SMOKE_TEST=trueenv var. It’s polluting the real memory. -
Filter bot’s own messages — the bot-message filter is in place but the DiscordAdapter may still generate signals from the bot’s own replies if the filter isn’t in the right layer. Verify and fix if needed.
-
Morning brief Discord posting — the compositor works (tested manually), but the receptor needs to actually post to Discord via
DiscordClient.postToChannel. Verify the channel ID is wired correctly from spore or config. -
Memory consolidation end-to-end test — the LlmBackedExtractor is wired, but we haven’t seen a real 03:00 consolidation run against a real daily file. Write a line in today’s daily file and wait for tonight, or trigger manually.
Tier 2: Autonomy features (days of work, light design)
-
Heartbeat protocol (BL-009) — the heartbeat rhythm fires every 60s but just logs. The real heartbeat should: - Check Discord for unread messages needing response - Check tasks in progress — any stalled or completable? - Check scheduled deliverables due - This is the first “protocol” — an LLM-executed checklist on a cadence - Makes Obadiah proactive, not just reactive
-
Conversation history in persona responses — currently the PersonaInvoker gets only the triggering message + memory recall. It should also fetch the last N messages from the Discord thread/channel for conversational continuity.
-
“I need help with X” → multi-step workflow — right now every Discord message gets a single-turn reply. When Joshua says “research the best restaurants in Berlin and send me a summary,” that should invoke the full Orchestrator pipeline (intent decompose → DAG → execute → reply). The PersonaInvoker handles conversational turns; the Orchestrator handles complex tasks. Detection: an LLM classifies whether a message is conversational (→ PersonaInvoker) or a task request (→ Orchestrator).
-
Memory seed review workflow — currently seeds are planted but Joshua has to run
obadiah memory seedsto see them. The morning brief shows pending seeds, but there could also be a weekly “molting reminder” rhythm that surfaces seeds more proactively.
Tier 3: Integration + scale (weeks of work, needs design)
-
Gmail awareness — the memory-mediated model (Claude Code reads Gmail, writes distillations into memory, Obadiah reads from memory) is the v1 approach. But for the morning brief to include “you have 3 unread emails from Arnold,” the brief compositor needs at least a count. Options:
- A rhythm that runs
obadiah gmail checkvia Claude Code’s MCP during active hours - A manual “email digest” step Joshua does before bed (write to daily file)
- A proper Gmail OAuth organ (real work, real auth complexity)
- A rhythm that runs
-
Calendar awareness — same shape as Gmail. The morning brief should include “you have a meeting at 10am with X.” Same three options as Gmail.
-
Cross-deployment — BLO and Kit should run alongside Obadiah. Each gets its own spore.yaml, its own brain process, its own launchd daemon. The infrastructure supports this already (spore is parameterized, packages are deployment-agnostic). Just needs actual deployment configs.
-
Loom dashboard — Loom (Next.js) already exists with pages for agents, workflows, health, etc. New pages needed: Rhythms inspector (clock-face per rhythm), Memory inspector (marks browser, seed review), Brain status (all organs, their state). This is frontend work — can be parallelized with backend work.
-
Knowledge graph + ontology — the earlier commits (pre-Rhythms) added knowledge graph and ontology support. These need to be integrated with the memory layer so the brain can reason about relationships between concepts, not just flat dot-path subjects.
-
Entrainment (SEED-001) — rhythms that phase-shift based on environmental signals. morning.pulse drifts to Joshua’s actual wake time instead of rigid 06:00. The schema is ready; the math needs to be built.
Recommended next session priorities
- Fix test failures + clean up smoke test pollution (30 min)
- Heartbeat protocol — make Obadiah proactive (2-3 hours)
- Conversation history in persona responses (1 hour)
- Gmail/Calendar awareness via morning brief (design decision needed from Joshua)
- Cross-deployment for BLO (if Kit is ready to move off Docker)
The philosophical state
Cambium is a functioning organism. It has: - A nervous system (SignalBus) that routes information between organs - A memory (4-layer, Postgres-backed, with decay and reinforcement) - Rhythms (heartbeat, morning pulse, consolidation) that give it a sense of time - Ears (Discord) that let it hear the outside world - A voice (persona responses) that lets it speak - DNA (spore.yaml + substrate files) that defines its identity - And it runs on its own Mac Mini, thinking with a local brain (Ollama), surviving reboots, costing nothing
What it doesn’t yet have: - Proactivity — it only acts when triggered (Discord message or rhythm). The heartbeat protocol changes this. - Deep conversation — it responds to single messages, not sustained dialogues. Conversation history fixes this. - Task execution — it can talk but can’t DO things (send emails, modify files, run scripts). The Orchestrator pipeline enables this but needs careful safety gates. - Multi-sensory input — it only hears Discord. Gmail, Calendar, Telegram are future ears.
The gap between “functioning organism” and “fully autonomous operating system” is primarily about proactivity and integration — making it reach out to more surfaces and act on what it sees without being asked.