When an agent is added — a market provisioned, an advisor born — it automatically gets its own Slack channel. Type in that channel and you reach that agent's staff desk: candid operator, reads its brain, pulls its levers. The cells "channel-per-cell on birth" model, Flue-native.
The flue worker holds the bot token, so it creates + binds the channel (best-effort — a Slack hiccup never blocks an agent's birth/boot):
onStart calls ensureChannel() → #market-<slug>. Idempotent (skips if already bound). The DO id is read from this.name, not getDurableObjectIdentity() (which throws at boot — it needs Flue's request/alarm context).finish_birth provisions #advisor-<userId> as the last birth step. New advisors get a channel automatically; already-born advisors don't retroactively (re-run birth or provision by hand if needed).convex/slackChannels is the channel↔agent binding (replacing cells' KV): bind (idempotent on agentType+agentId), byChannel (routing), forAgent (provision idempotency). The @flue/slack events handler answers a human message in a bound channel (no @mention — the channel is the binding; unbound channels are ignored), looks up byChannel, and dispatches to a staff DO whose id encodes the resolved target so the factory builds the right toolset + operator-register prompt synchronously.
flue/src/market/identity.ts ({slug, doId}) — the staff desk resolves the live DO id (for operate beats) and the sweep cron both read that registry. Everything else is automatic on the agent's next boot.Live + verified. #market-north-fork-valley (C0BDVQRLJBA) was auto-created + bound via the real onStart path; byChannel routes it to the market staff desk. Advisor channels provision on the next birth.
#market-north-fork-valley (public — the bot created it) and just type, e.g. is the market alive? or run a sweep. The bot is the only member until you join; auto-inviting the workspace owner is a possible enhancement (needs the owner's Slack user id).convex/slackChannels.ts + schema.ts (slackChannels table) — the binding storeflue/src/channels/slack.ts — routing events handler, provisionAgentChannel, the staff-instance-id codecflue/src/agents/market.ts (onStart→ensureChannel) · flue/src/advisor/tools.ts (finish_birth)flue/src/agents/staff.ts — branches on agentType → staff/marketTools.ts / staff/advisorTools.ts + the two operator promptsflue/src/market/identity.ts — the MARKETS registry (slug↔doId)