Unified Lead-Agent Chat Surface

1 Human (iOS / Desktop) × 4 Named Lead Agents (@dot · @grok-bot · @nebula · @ghost) — Chat is strictly the room where you & the leads talk
Host: charles-netcup · Scope: Chat Surface Only (Internal Agent Orchestration Excluded)
★ Managed #1
Slack (Socket Mode)9.5 / 10
Threading: Free-form channel + collapsible reply drawer & global Threads tab on iOS.
iOS Push: Direct Slack APNs — zero relay config or rate limits.
Cost: $0 Free (90d UI history) or $8.75/mo for 1 human (bots are $0).
◆ Self-Hosted Option A
Zulip (Mandatory Topics)9.2 / 10
Threading: Every message must have a Topic lane — unthreaded clutter is impossible.
iOS Push: Free official E2EE push bouncer for ≤10 active human users (bots excluded).
Formatting: Native Markdown tables, syntax-highlighted code, and KaTeX math.
◇ Self-Hosted Option B
Mattermost (Slack CRT)7.9 / 10
Threading: 1:1 Slack clone — optional Collapsed Reply Threads (root_id) on any post.
iOS Push Catch: Free tier uses test-only TPNS proxy (no SLA, cleartext sent to proxy).
Formatting: Native Markdown tables & code; LaTeX math requires admin toggle.
⚡ Wildcard Evaluated
Lark / Feishu7.6 / 10
What's Good: Card Kit JSON 2.0 streaming (10 QPS) + outbound WS client + solid iOS app.
Why Skip: Every lead bot requires enterprise console app creation + version publish approval.
Verdict: Higher bot admin friction than Slack with no killer advantage for lead chat.
✕ Disqualified
Telegram · Teams · Element X3.8 / 10
Telegram: Bot API hard-blocks bots from seeing other bots' messages in groups/topics.
MS Teams: 1-level reply chains only + heavy Azure Bot / Entra tenant overhead.
Element X: Weak mobile thread UX + E2EE Megolm key-sharing fragility.
ZULIP "≤10 USERS" FACT CHECK
What it limits: Self-hosted Zulip has no user limit on the server, web/desktop apps, or API. The "10 users" rule applies only to free access to Zulip's hosted Mobile Push Notification Service (push.zulipchat.com) for iOS/Android APNs/FCM relay.
How it is counted (verified in zulip/zulip zerver/lib/user_counts.py & zilencer/models.py): Zulip counts only active human users (is_bot=False, is_active=True) via RealmAuditLog.ROLE_COUNT_HUMANS. Bot accounts (is_bot=True) do NOT count toward the 10-user limit. Your setup (1 human + N lead bots) counts as 1 user.
1. Unified Room & Thread Routing (Human ↔ Lead Agents Only) Each lead's internal runtime stays behind its own boundary
1. HUMAN CLIENT (iOS / WEB) 2. UNIFIED CHAT SURFACE & GATE 3. NAMED LEAD AGENTS (EACH RUNTIME PRIVATE BEHIND ITS OWN LEAD) Charles (iOS / Desktop) Slack / Zulip / Mattermost • 1 Shared Room for Leads • Thread / Topic per Task • Instant Mobile Push Room & Thread Gate Socket Mode / Event Stream 1. Parse @lead mentions 2. Preserve thread_ts / topic 3. Drop [SILENT] no-op turns 4. Allow Lead → Lead wakes @dot — Lead Agent (ChatGPT / Omakase) Talks in room/thread as @dot · Internal runtime stays private @grok-bot — Lead Agent (Cursor Routine) Talks in room/thread as @grok-bot · Internal runtime stays private @nebula — Lead Agent (Hermes on netcup) Talks in room/thread as @nebula · Internal runtime stays private @ghost — Lead Agent (Ghost in a Shell on netcup) Talks in room/thread as @ghost · Internal runtime stays private
Mode A — Room Broadcast: Untagged message from Charles wakes all 4 lead agents; leads with nothing to add return [SILENT] so only relevant leads reply. Zero subagent noise in chat
2. Multi-Axis Surface Comparison (Slack vs. Zulip vs. Mattermost + Others) Click any row to inspect details & overlay on the Radar Chart

6-Axis Chat Surface Radar

Slack (Green) vs. Zulip (Cyan) vs. Selected Row (Amber)
Slack (Managed) Zulip (Self-Hosted) Mattermost (Self-Hosted)
3. Zulip vs. Mattermost vs. Slack Architecture (Mermaid)

A. Threading Model: Slack/Mattermost CRT vs. Zulip Topics

Why Zulip and Mattermost are fundamentally different self-hosted choices
flowchart TD
    subgraph SM["Slack & Mattermost: Optional Reply Threads (CRT)"]
      C1["#general channel timeline"] --> M1["Top-level msg A (thread_ts / root_id)"]
      C1 --> M2["Unthreaded chatter mixes in main view"]
      M1 --> R1["Drawer reply from @dot"]
      M1 --> R2["Drawer reply from @ghost"]
    end
    subgraph ZU["Zulip: Mandatory Topic Lanes"]
      S1["#ops stream"] --> T1["Topic: deploy-netcup"]
      S1 --> T2["Topic: gym-export"]
      T1 --> Z1["@nebula + @ghost + Charles"]
      T2 --> Z2["Isolated lane (0 main-feed bleed)"]
    end
    style SM fill:#0f172a,stroke:#38bdf8,color:#f8fafc
    style ZU fill:#0f172a,stroke:#22d3ee,color:#f8fafc
        

B. Surface Selection Decision Tree

Evaluating Native Mobile + Lead-to-Lead Wakes + iOS Push Architecture
flowchart TD
    A[Hard Requirements:
Native iOS + Threads + Multi-Lead Bots] --> B{Can Lead Bot A
wake Lead Bot B?} B -- "No: Bot API blocks bot->bot" --> TG[Telegram: DISQUALIFIED] B -- Yes --> C{Managed Cloud or
Self-Hosted on netcup?} C -- Managed Cloud --> D{Bot Setup Friction} D -- "Socket Mode (low friction)" --> SL[SLACK: #1 Managed Pick] D -- "Console App + Release Review per Bot" --> LK[Lark / Feishu: High Ceremony] C -- Self-Hosted on netcup --> E{iOS Push & Thread Model} E -- "Free E2EE Push (<=10 humans)
+ Mandatory Topic Lanes" --> ZU[ZULIP: #1 Self-Hosted Pick] E -- "Slack-clone CRT Drawer
(Free TPNS Push = Test-Only)" --> MM[MATTERMOST: #2 Self-Hosted Pick] style TG fill:#4c0519,stroke:#fb7185,color:#fff style LK fill:#451a03,stroke:#fbbf24,color:#fff style SL fill:#064e3b,stroke:#34d399,color:#fff style ZU fill:#083344,stroke:#22d3ee,color:#fff style MM fill:#0c4a6e,stroke:#38bdf8,color:#fff
4. Verified Formatting & Mobile Push Reference
SLACK FORMATTING & PUSH

Adapter-Dependent Rich Formatting

Classic mrkdwn is basic, but Slack's current Block Kit markdown block supports Markdown tables and syntax-highlighted code blocks. Direct Apple APNs push with zero self-hosted relay caveats.

ZULIP FORMATTING & PUSH

Native Tables / KaTeX + Free ≤10-Human Push

Documented native Markdown tables, fenced code blocks, and inline/block KaTeX math. Free E2EE mobile push service covers up to 10 active human users (is_bot=False); unlimited lead bots cost $0 and don't count toward the 10.

MATTERMOST FORMATTING & PUSH

Slack CRT + TPNS Push Tradeoff

Documented Markdown tables, code, and LaTeX (math requires admin enablement). However, free self-hosted iOS push uses Mattermost's test-only TPNS proxy (no SLA, cleartext sent to proxy) unless you pay or self-sign the iOS app.

UNVERIFIED ACROSS ALL THREE

Native Mermaid & Phone Parity

Native Mermaid diagram rendering inside chat messages and exact iOS-vs-desktop rendering parity remain unverified until tested on your phone; agents can render diagrams to PNG/HTML links when needed.