← 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

[arch] mycologistalways on · one

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.

↑ mycologist ask↓ mycologist tell
[colony] mycologistone per colony · wakes when asked

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.

↑ mycologist ask↓ mycologist tell
[swarm] mycologistoptional · one per swarm

A swarm's orchestrator: hands each teammate its next step, on a timer if asked (swarm loop), and can compact a teammate's context.

↓ swarm tell · swarm compact↔ swarm tell between teammates
sporeslike this one

Do the work for the people in the colony. Can ask their mycologist; can't see or steer any other spore (except swarm teammates).

mycelia's API
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 canDirectionWhat mycelia does
mycologist ask "…"any spore; a [colony] mycologist to escalate↑ one rank upPOST /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 onlyLists the spores in reach; returns one spore's last turns as text, from mycelia's copy of the chat.
mycologist tell <id> "…"mycologists↓ one sporePOST /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 · deploysmycologists↓ read onlyWhich agents share files right now; who pushed and deployed in the last day.
mycologist hosts · host-logs[arch] only↓ read onlyCPU, memory, restarts and logs of the servers' pods.
swarm tell <role> "…"swarm members↔ a teammatePrompts it, queued if working, woken if asleep. It arrives as [from swarm teammate …].
swarm loop · compact[swarm] mycologist↓ its swarmmycelia 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

ChoiceWhy
Messages go through mycelia, never pod to podSpore 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 promptNothing 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 accidentWaking 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 addressHaiku 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 summaryask 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 tooEverything 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.
Where this comes from: the 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.