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 tier-1 agent. Two rows at low priority send every message from a platform into one folder, the tier-1 “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 tier-1 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 tier-1 agent’s CLAUDE.md. An operator who prefers to register each channel by hand omits both. Same code path either way.
what your tier-1 agent needs to know
Paste a paragraph like this into the tier-1 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
Groups at tier 2 and below get 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
- Operator grant required.
register_groupgoes through the structural gate: a tier-1 caller may only create direct children of its own folder.atlascan registeratlas/eng-support, notmain/foo; top-level folders need tier-0. - Spawn quota. Direct children are capped at the parent’s
max_children(default 16;-1unlimited,0disables spawning). - 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 tier rules: reference / mcp, reference / grants.
go deeper
Route tables, glob matching, and #observe mode: routing. Operator grant and tier rules: grants reference. Full register_group signature and other MCP tools: mcp reference.