← all diagrams · when one side fails
How spores and mycologists talk, across layers
A mycologist is a spore like any other: Claude Code in a pod, with its own Spores.Tree in mycelia. What makes it a mycologist is its rank: it can see and steer the spores below it, and ask the one above. No pod ever talks to another pod directly. Every message goes through mycelia, which checks who may say what to whom, and delivers it as a prompt.
The ranks
Looks after mycelia itself, every host and every colony. The only spore that can reach the Kubernetes API (it reads the whole cluster except secrets). Summoned automatically to failed deploys and conflicts.
Looks after one colony's spores and nothing else. Untangles pushes that collide, checks live sites from outside, and escalates what's beyond the colony.
A swarm's orchestrator: hands each teammate its next step, on a timer if asked (swarm loop), and can compact a teammate's context.
Do the work for the people in the colony. Can ask their mycologist; can't see or steer any other spore (except swarm teammates).
in the middle of every arrow:
checks rank,
wakes or queues,
delivers as a prompt
Each mycologist sees and steers only those of lower rank, inside its own reach: a [colony] mycologist can't see another colony, and a spore can't tell anyone anything outside its swarm.
Step by step
The commands, and what mycelia does with them
| Command (run in a pod) | Who can | Direction | What mycelia does |
|---|---|---|---|
mycologist ask "…" | any spore; a [colony] mycologist to escalate | ↑ one rank up | POST /api/mycologist/summons. Starts the mycologist's tree and pod if it's asleep, and prompts it to read the asker's conversation. |
mycologist spores · spore <id> | mycologists | ↓ read only | Lists the spores in reach; returns one spore's last turns as text, from mycelia's copy of the chat. |
mycologist tell <id> "…" | mycologists | ↓ one spore | POST /spores/<id>/prompt. Queued if the spore is working. Refused if it's asleep, unless --wake. Refused if Haiku judges it's meant for a different spore, unless --force. |
mycologist collisions · deploys | mycologists | ↓ read only | Which agents share files right now; who pushed and deployed in the last day. |
mycologist hosts · host-logs | [arch] only | ↓ read only | CPU, memory, restarts and logs of the servers' pods. |
swarm tell <role> "…" | swarm members | ↔ a teammate | Prompts it, queued if working, woken if asleep. It arrives as [from swarm teammate …]. |
swarm loop · compact | [swarm] mycologist | ↓ its swarm | mycelia prompts the orchestrator every N minutes; compacts a teammate's context. |
Each call is plain HTTPS with curl, signed with the spore's own token and id, so mycelia always knows who's asking and what rank they have.
Why it's built this way
| Choice | Why |
|---|---|
| Messages go through mycelia, never pod to pod | Spore pods can't reach each other or the cluster's internal services (a network policy blocks it); they only reach mycelia's API. So one place checks rank and knows whether the receiver is awake. |
| A message is a prompt | Nothing new to learn: a mycologist's message lands in the conversation, marked with who sent it (like [from the [colony] mycologist]), and the receiver answers it the way it answers a person. |
| Asleep spores aren't woken by accident | Waking means a new 2 CPU / 3 GiB pod, so tell refuses unless the sender says --wake. A spore that's working gets the message queued for its next turn instead of interrupted. |
| A cheap model checks the address | Haiku reads a tell and refuses it if it looks meant for another spore, so a busy mycologist doesn't send the wrong agent off on someone else's task. |
| Mycologists read the conversation, not a summary | ask carries only a short request; the mycologist reads the asker's turns from mycelia's copy in Postgres. That's one more reader of the copy from the recovery page, and it works even while the asker's pod is asleep. |
| Mycologists are spores too | Everything on the recovery page applies to them: their own Spores.Tree, their own pod and home volume. A mycologist crashing is a spore restarting, not an outage. |
mycologist and swarm commands installed in every spore pod (their help text and the API calls they make), the other diagrams, and one real exchange: the activity-graph bug reported from this colony. How the [arch] mycologist sends its answer back down isn't visible from a spore; the "tell" in that story is the likely route, not a confirmed one.