autoviv
Onboarding admits a new person into a group. Autoviv handles the other case: a new chat — a Slack channel, a Discord guild, a Telegram group — that should get its own folder the first time it talks to you. The point worth noticing is that this needs no new code: it’s the same group-creation primitive onboarding uses, triggered by a catch-all route and one MCP tool call instead of an invite. No daemon, no env var, no magic.
the recipe
Three primitives, composed:
- Catch-all routes to a world agent. Two rows at low priority send every message from a platform into one folder, the “world” agent (call it
atlas):
Theseq match target 100 chat_jid=slack:*/channel/* verb=mention atlas 200 chat_jid=slack:*/channel/* atlas#observe#observerow stores every channel message so the agent has context. The mention row fires a turn when someone calls@atlas. - The world agent notices an unrouted channel. When
atlasruns a turn, it sees the inbound message’schat_jid. If no specific child folder is wired to that JID and the sender holds operator grant, it calls the MCP toolregister_groupwith the JID and a sanitized folder name. register_groupdoes the rest.ipc/ipc.go:1309→routdwrites the group row, seeds the folder with skills and settings (SetupGroup), and inserts a high-priority routeroom=<jid-room> → <folder>in one step. The next message in that channel lands inatlas/eng-supportinstead ofatlas.
worked example
A teammate invites the bot to a new Slack channel #eng-support with JID slack:T1234/channel/C5678 and posts “@atlas can you help here?”
- Route table has no specific row for
C5678; the catch-all rule sends the message toatlaswithverb=mention. atlasruns a turn, sees the JID and the sender’s operator grant, and callsregister_group(jid="slack:T1234/channel/C5678", folder="atlas/eng-support").routdwrites the group, seedsgroups/atlas/eng-support/with the default skills, inserts routeroom=T1234/channel/C5678 → atlas/eng-supportatseq=0.- The agent replies in-thread from
atlas. The next message in that channel routes toatlas/eng-supportdirectly — its own folder, its own session, its own CLAUDE.md.
why no special env var or daemon
Autoviv is not a feature; it is the absence of a feature. The pieces already exist: glob route matching, the register_group MCP tool, group seeding via SetupGroup, the operator grant. An operator who wants per-channel folders writes a catch-all route and a paragraph in the world agent’s CLAUDE.md. An operator who prefers to register each channel by hand omits both. Same code path either way.
what your world agent needs to know
Paste a paragraph like this into the world agent’s CLAUDE.md or PERSONA.md:
When you receive a message from a Slack channel JID
(slack:*/channel/*) that does not yet have its own folder,
and the sender holds operator grant, call register_group
with folder="atlas/<short-name-derived-from-channel>" and
jid="<the channel JID>". Sanitize the channel name:
lowercase, replace spaces and punctuation with '-'.
Reply once in the new folder confirming the channel
is now registered. Do not register channels for non-operator
senders — ask the operator instead.
Tune it: auto-register channels matching a pattern, ask the operator first, only register on explicit request. The agent is making the policy decision; the platform just runs the call.
web slots
A group holding the web:publish grant gets two writable web slots bind-mounted into the container: ~/public_html/ and ~/private_html/ (Apache mod_userdir convention). The agent writes a file into ~/public_html/ and vited serves it at /pub/<folder>/ — one path segment per folder, no per-group subdomain. ~/private_html/ serves at /priv/<folder>/ behind an OAuth/JWT gate. An autoviv’d child atlas/eng-support serves at /pub/atlas/eng-support/; it shares the instance hostname with every other folder.
limits
- A delegated grant is required.
register_groupis not in the default role, soatlashas to be handedmcp:register_groupexplicitly. The row's scope glob is the whole containment rule: grantedatlas/**, it can registeratlas/eng-supportand anything else underatlas, but notother/foo. Widening its reach means editing that glob, not moving the folder. - Idempotency is partial. Re-registering the same folder is safe, but the route insert is unconditional — calling
register_grouptwice with the same JID writes a duplicate route row. Have the agent checklist_routesfirst. - Folder seeding is best-effort. If
SetupGroupfails, the group + route are still written androutdlogs a warning. Inspectgroups/<folder>/if the new agent acts blank.
Full register_group signature and the grant it needs: reference / mcp, reference / grants.
go deeper
Route tables, glob matching, and #observe mode: routing. Grants, roles and delegation: grants reference. Full register_group signature and other MCP tools: mcp reference.