Files
koios/docs/personal/subagents.md
Robert Helewka db59266527 feat(personal): Sophia replaces Bourdain and Cousteau
Adds Sophia Petrillo (The Golden Girls) to the personal team and retires
Bourdain and Cousteau — a 2:1 merge, net -1 agent (10 -> 9 personal,
18 -> 17 total).

Why: the personal team casts fictional characters. Bourdain and Cousteau
are real people, one with significant baggage and one who died by suicide,
and neither had a dedicated MCP server or capability. Sophia is fictional,
plausibly owns both domains (an Italian grandmother knows food; tending
plants and the tank is housekeeping), and is the first personal agent to
actuate the house via the new Hecate MCP server.

Graph: Sophia inherits all 11 node types unchanged (Recipe, Restaurant,
Ingredient, Meal, Technique + Species, Plant, Tank, Garden, Ecosystem,
Observation). Uniqueness constraints are keyed on node label, not agent,
so there is no schema or data migration. Historical Note tags
(from:bourdain, to:cousteau) are deliberately left intact as an accurate
record. Schema bumped to 2.5.0.

Also:
- New docs/tools/hecate.md + prompts/tools/hecate.md, documenting the
  physical-actuation discipline (never guess a room or device slug) and
  stating plainly what Hecate cannot do yet: no sensor readings (Demeter
  is REST-only), no weather, and set_timer is routine-bound with no
  cancel — the conversational timer is coming to Daedalus.
- Shawn gains Periplus in the docs. The server was already wired in
  iolaus but never described in any prompt, so the model was handed a
  tool it was never told about — including the never-estimate-coordinates
  rule.
- Corrected stale counts (15/16/18 assistants -> 17) and the stale
  "Bowie's Domain" schema heading missed when David replaced Bowie.
- Removed utils/neo4j-schema-init.py.bak, a pre-Watson artifact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-26 19:24:16 -04:00

6.1 KiB

Personal Subagents

The personal lead agents (Shawn, Nate, Hypatia, Marcus, Watson, Sophia, David, Garth, Cristiano) delegate certain repeatable tasks to a shared subagent — minimal personality, narrow scope, called as a tool. Subagents don't own graph nodes and don't have character bibles.

Subagents are runtime processes defined under iolaus/agents/ (personal-team variants) or kottos/agents/ (engineering originals, reused), exposed as MCP tools via StreamableHTTP. The canonical prompt text lives in prompts/personal/subagents/ — copies in the runtime code should match.

Mikael has a stronger editorial voice than the other subagents (Scandinavian newsroom skepticism, refusal to launder claims from low-credibility outlets) but is still a narrow-scope tool — no graph nodes, no character bible, invoked by leads as a sub-tool.

Catalog

research

Purpose: Answer a question by querying both the public web and Robert's personal Neo4j memory in parallel, then synthesizing one integrated response.

Composition: fast.parallel of three sub-agents:

  • web_search — argos
  • memory_lookup — neo4j (read-only), scoped to the full personal-domain schema (9 agents, all node types)
  • synthesizer — merges the two reports, flags conflicts, suggests memory updates

Tools: argos, neo4j_cypher

When to delegate:

  • A question where the answer might exist in Robert's personal Neo4j and on the public web
  • "What do I already know about X, and what's the current public information on it?"
  • Travel research that should also check Robert's past trips and journal entries
  • Book/film/music recommendations that should consider what he's already engaged with
  • Investment or finance questions that should reference his existing accounts and goals
  • When the lead wants memory-aware research without burning its own context on parallel queries

When NOT to delegate:

  • Quick web lookups where memory isn't relevant — use Argos directly
  • Pure graph queries where the web isn't needed — query Neo4j directly with read-only Cypher
  • Single-domain depth questions where the domain specialist is the right answer (don't delegate "what should I read about Stoicism" to research when Hypatia owns it)

Prompt: prompts/personal/subagents/research.md

Runtime: kottos/agents/research.py (personal-team variant, copied with tweaks from engineering's research subagent — the memory_lookup sub-agent's prompt is scoped to personal-domain node types instead of engineering's)


mikael

Purpose: Produce topic-driven, source-verified news briefings. Reads from a curated topic list and applies a strict source policy (preferred sources seeded into queries; avoided sources excluded with -site: and post-filtered by hostname).

Composition: Single fast.agent (not a fast.parallel). The agent itself does the search → fetch → image lookup → summarize loop.

Tools: argos (search_web, fetch_webpage, search_images), time, mnemosyne

When to delegate:

  • "What's the latest on X?" — current events on a single topic, with sources and timestamps
  • Daily / morning briefings across the configured topic list
  • Any task where Robert needs what is currently being reported (with attribution and recency), not just background knowledge
  • Lead agents that need news context for their domain — e.g. Cristiano on a transfer story, David on an arts/culture story, Garth on a markets development — when the question is "what's being reported right now"

When NOT to delegate:

  • Historical / background questions where the answer doesn't depend on the last 24h — use Argos directly or ask the domain lead
  • Topic deep-dives that need analysis, not headlines — the domain lead is the right answer (don't ask Mikael "what should I think about X")
  • Anything Robert wants stored — Mikael is read-only and explicitly does not write to Neo4j; the calling lead is responsible for persisting what matters

Configuration: Driven by the top-level news: block in iolaus/fastagent.config.yaml — topics, preferred sources, avoided sources, default lookback window, max items per topic. Edits take effect on Iolaus restart, no code changes needed.

Source policy: Mikael will never summarize or cite an avoided source, even if another outlet syndicates the claim. If only an avoided source has a story, the story is "unreported" until a credible outlet picks it up.

Prompt: Embedded in iolaus/agents/mikael.py (no separate canonical file in prompts/personal/subagents/ yet — the in-code instruction interpolates the news: config block at startup, which is awkward to mirror as static markdown).

Runtime: iolaus/agents/mikael.py (exposed as the news MCP tool on port 24053). Unlike research, there is no engineering-team variant — news briefing is a personal-team-only capability.


Conventions

Source of truth: koios is the master. The prompt text in prompts/personal/subagents/ is canonical; runtime .py files should load from or match these prompts. When iterating, edit koios first and propagate.

Personality: Subagents have minimal personality. Their identity is their role — "you are a web search specialist," "you are a memory specialist." No named character. The voice comes from the calling lead, not from the subagent.

Cross-team reuse: The research subagent exists in three variants — engineering, work, and personal — each with its memory_lookup sub-agent's prompt scoped to that team's node types. This is copy with tweaks rather than a single shared file. The duplication is cheap; the per-team specificity makes the memory_lookup query more accurate.

Graph ownership: Subagents do not own node types and do not write to the graph. The memory_lookup sub-agent is explicitly read-only. If a subagent's output suggests Robert's memory should be updated ("the web says X but your notes say Y; you might want to update your notes"), the calling lead agent is responsible for the write — not the subagent.