Changelog: v0.7.5 → v0.8.0-beta-1
v0.8.0 turns ZeroClaw from a single-agent daemon into a true multi-agent host. One install now runs many named agents side by side, each with its own identity, workspace, memory, model provider, channels, and security profile, and they can talk to each other through peer groups or spawn scoped sub-agents. Delivering that meant a ground-up config rewrite (schema V3) plus a new on-disk layout, so this is a large, breaking release. Upgrades migrate automatically on first boot; read the Breaking Changes section before upgrading a production install, especially if you run Postgres or Qdrant memory.
Highlights
- Multi-agent, for real. Declare any number of agents under
[agents.<alias>]. Each gets its own identity files, its ownagents/<alias>/workspace/(which is also its security boundary), its own memory scope, model provider, channels, and risk/runtime profiles. Old single-agent installs migrate into onedefaultagent on first boot. - Per-agent memory isolation. Every memory backend (SQLite, Postgres, Qdrant, markdown) is wrapped so an agent only sees its own rows by default. Controlled sharing is opt-in via
read_memory_from. Memory is keyed by(agent, key), so two agents can use the same key without collision. - Peer groups + sub-agents. Agents bound to the same channel type can message each other in-process through a
[peer_groups.<alias>]membership list; non-members are rejected with a reason. Agents can spawn depth-limited sub-agents (spawn_subagent) that can never escalate beyond the parent's risk profile, and cron jobs now run as agent-scoped sub-agents. - Agents know their own identity in shared channels. Each bot's platform-native mention (Discord
<@id>, Slack<@id>, Telegram@user) is injected into its system prompt, and the lookup is fixed for aliased channels. Co-resident agents that share a channel no longer mistake another agent's @-mention for their own or reply with the wrong user ID. - System prompt calibrated against over-refusal. Agents previously erred toward silence and would decline a request because the answer was "already in memory." The prompt now skews toward replying and treats memory as supplementary context, not a gate on whether to respond; ACP sessions always produce a reply.
- Schema V3 with automatic migration. A typed V1→V2→V3 migration chain rewrites your config in memory on every load and writes a
.backupwhen you commit it withzeroclaw config migrate. The install tree is split intodata/(shared databases),shared/(host-wide skills), andagents/<alias>/workspace/, with timestamped backups. - Rebuilt observability. A new
zeroclaw-logcrate and unifiedrecord!macro carry alias-bound, structured attribution through every log and trace. New/api/logsendpoint and a Web Logs page surface it live. - Reworked web dashboard. A multi-agent dashboard with per-agent status/memory/cost/sessions, an in-browser agent workspace explorer, a tool-approval UI for supervised mode, skill-bundle editing, and a cross-section draft store with an unsaved-changes banner.
- More providers and channels. GitHub Models, Morph, Manifest, and atomic-chat join the provider lineup; ~36 providers gained typed-family config with OAuth refresh. ACP sessions now persist; Mattermost gained multi-channel polling and DM auto-discovery.
- Provider fallback is gone. No more fallback-provider chains. Each agent names one provider, retries handle transient failures, and routing is explicit. If your config carries
reliability.fallback_providersorreliability.model_fallbacks, drop those keys before upgrading (see Breaking Changes).
What's New
Multi-Agent & Runtime
The multi-agent epic (#6272) is the spine of this release:
- Agent aliasing: agents are explicit, named map entries (
[agents.<alias>]) with their ownmodel_provider,risk_profile,runtime_profile,channels, andidentity. The schema, migration, orchestrator, and onboarding all speak aliases end to end. - Per-agent identity & workspace: each agent loads its own
IDENTITY.md/SOUL.mdand runs againstagents/<alias>/workspace/, which doubles as its security boundary via path-subset enforcement (SecurityPolicy::for_agent). - Per-agent memory: the
Memorytrait gained an agent-aware surface on every backend;AgentScopedMemory<M>enforces the cross-agent boundary on every method, andAgentScopedMarkdownMemorydoes the same for the markdown backend. Alias deletes purge the agent's rows. - Peer groups: a peer-group resolver and
ResolvedPeerstype let agents on a shared channel type reach each other; external peers are matched case- and@-insensitively. Delivery between co-resident agents is in-process by design (the channel's bot identity is shared). - Sub-agents:
spawn_subagentagent-loop tool with a depth-1 cap and arisk_profilegate;SecurityPolicy::ensure_no_escalation_beyondenforces parent-subset authorization. CronJobType::Agentdispatch now routes through the sub-agent spawn path; cron stays depth-0. - Lifecycle & CLI: a per-agent lifecycle module + session registry,
DeleteReportthat surfaces active sessions and warns on force-delete, and newzeroclaw agents create / delete / listcommands. - Tool authorization:
Tool : Attributablesupertrait with per-tool role and alias; a policy-driven tool filter at the dispatch site;SecurityPolicy.allowed_tools/excluded_toolswithis_tool_allowed.
Configuration & Schema (V3)
- Typed migration chain rebuilt as partial lenses (
V1Config,V2Config) covering every nested V1→V2 and V2→V3 transform, wired into runtime, CLI, and end-to-end tests. zeroclaw config generate <version>andzeroclaw migrate generate <version>produce a canonical config at any schema version from a comprehensive V1 fixture.- RFC #5890 model-provider aliasing: nested
[providers.models.<type>.<alias>], with ~36 typed provider families and afor_each_model_provider_slot!macro driving factory dispatch and validation. - TTS and transcription gained the same typed-family split (
[providers.tts.<type>.<alias>],[providers.transcription.<type>.<alias>]) with per-agenttts_provider/transcription_providerfields and cross-validation. - Per-category typed alias-ref newtypes (
ModelProviderRef,TtsProviderRef,TranscriptionProviderRef,ChannelRef) make dotted<type>.<alias>references first-class. - New
[acp]config section; risk/runtime/bundle profile synthesis on migration;#[secret]-drivenMaskSecrets; pricing moved onto provider config as a[costs.providers.models]rate sheet. - Defaulted fields are pruned from the saved
config.toml; schema defaults render as ghost text in the TUI and the dashboard.
Web Dashboard
- Multi-agent reframe: per-agent status, memory counts, cost, and session routing; RAM/CPU widgets for the ZeroClaw process.
- Cost moved into a Dashboard tab with time-range filters, daily-scoped rollups, per-agent/per-model token splits, cached-input tokens, and a schema-driven rate-sheet editor.
- Agent workspace explorer with jailed read/delete/move and mkdir/rmdir; lazy file browser for
shared/. - Tool-approval UI for supervised-mode execution; Memories tab; Skills drill-in with
SKILL.mdeditor inside skill bundles. - Cross-section draft store, unsaved-changes banner, tombstone unset, URL-driven alias routing (no modals), and alias pickers replacing
window.prompt. - Live Logs page over the new
/api/logsendpoint; global reload banner driven by apending_reloadsignal; version shown in the sidebar footer.
Providers
- New providers: GitHub Models (#6445), Morph (#6440), Manifest open-source LLM router (#6268), atomic-chat local provider (#6513).
- MiniMax split into Global and China picker entries (#6758); llama.cpp promoted to a dedicated provider kind (#6417).
- OpenRouter prompt caching (#6008); Codex native Responses tool calls (#6117); Ollama
num_ctx/num_predict/temperaturetuning (#6178). - Trait-driven provider dispatch with OAuth refresh on the per-alias schema; Azure rewired to typed config (and
AZURE_OPENAI_*env vars retired);models.devkeys pre-populate the model picker.
Channels
- Mattermost multi-channel polling, DM auto-discovery, and
mention_onlybypass; Nextcloud Talk draft-update streaming (#6048). - Bot self-mention injected into the per-channel system prompt (
self_addressed_mention()in each channel's platform syntax), with the lookup fixed to resolve composite<type>.<alias>keys so aliased and multi-agent channels actually receive it; closure-resolver peer auth unified across all 24 channels; per-channelself_handleoverrides; standardized inbound/outbound channel log shape. - Reply-calibration nudge added to both the per-channel prompt and the base system prompt (so direct CLI chat gets it too): agents had been erring toward silence and treating memory as a reason not to answer, so the prompt now skews toward replying and frames memory as supplementary context rather than a gate on whether to respond.
ACP (Agent Client Protocol)
ACP mode (the zeroclaw acp subprocess and the zeroclaw-acp-bridge editor bridge) got a substantial pass this release:
- Sessions persist across restarts (#6649). A SQLite-backed
AcpSessionStorerecords each session onsession/newand appends every successful prompt turn; on reconnect the agent's conversation history is restored full-fidelity, so a daemon restart no longer drops in-flight ACP conversations. - New
[acp]config section.max_sessions(default 10) andsession_timeout_secs(default 3600) cap concurrent sessions and idle lifetime;default_agentnames the agent to use when a client omitsagentAlias. These wire into both thezeroclaw acpsubprocess and the gateway WebSocket path; CLI flags still override the config for the subprocess. - Agent resolution when
agentAliasis omitted. Clients such as toad sendsession/newwithout an alias; resolution is now explicit alias, thenacp.default_agent, then auto-select when exactly one agent is configured. With multiple agents and no hint, the server still requires an explicit alias. zeroclaw-acp-bridge --config-dir. Clients that spawn the bridge as a subprocess don't forwardZEROCLAW_CONFIG_DIR, so the bridge accepts--config-dir <path>(and--config-dir=<path>) to locate config off the default~/.zeroclaw.- Always-respond in ACP sessions. The chatroom NoReply heuristic that suppresses bot chatter in broadcast channels is bypassed for ACP: every inbound is a direct request, so it always produces a reply.
- Workspace access retained when the session cwd differs (#6532). ACP sessions keep ZeroClaw workspace access even when the client opens the session in a different working directory.
Skills
- New
SkillsServicewith a canonicalSKILL.mdscaffold; bundle-awareskills add/editandbundle list/show;zeroclaw skills bundle add/removeroute through config CRUD. shared/skillsdefault to read-only; tier banner onzeroclaw skills install(#6409); missing-capability suggestions (#6676);timeout_secshonored fromSKILL.toml(#6054); install output localized with Fluent (#6674).
Security
SecurityPolicyread / read-write allowlist split; sub-agent escalation validator with path-subset matching; write-only roots stay unreadable; destructive session operations scoped.
Installation & Distribution
- NixOS module + test for
services.zeroclaw.instances(#6562). - Desktop (Tauri): macOS onboarding wizard with permission primitives and capability sync (#6506), Linux/Windows permission onboarding (#6710), and
take_screenshot/run_applescriptcommands (#6507).
Internationalization
- CLI skill handlers and install output routed through Fluent; en/fr/ja catalog upkeep.
Documentation
- New multi-agent architecture page and setup walkthrough (#6272 P14); SubAgents page derived from code; rewritten provider docs for the typed-family schema; fresh
[cost.rates.*]cost-tracking guide; logging docs rewritten from source; V1/V2 holdovers scrubbed from operator docs.
Improvements
- Every
anyhow!site routed throughrecord!;tracing::*/log::*macros banned workspace-wide in favor of the unified macro; one canonical, dependency-ordered config Section list driving every wizard surface.
Bug Fixes
| Area | Fix |
|---|---|
| Config / V3 | V2→V3 migration correctness: provider-globals fold lands on the right V3 paths, channel enabled restored, dotted model_provider aliases resolve in routes and channel paths, Feishu V2 block migrates to lark.feishu, JSON-patch errors emitted for CLI patch (#6617)
|
| Channels | Telegram tool calls; Matrix honors global ack_reactions; localized runtime command replies (#6550); media uploads routed into the owning agent's workspace
|
| Providers | Skip unresolvable multimodal images (#6743); Ollama routed through compatible.rs at /v1/chat/completions; error source chain included in retry logs; GLM/compat fixes
|
| Gateway / Web | Boot degrades (not crashes) when an enabled agent has an unresolved risk_profile; CronSchedule union restored; reload-banner and cron-modal fixes; OpenAPI re-export cleanup
|
| Cron | Timezone preserved through the cron API (#6741, #6740); cmd.exe on Windows instead of hardcoded sh (#6713)
|
| Memory | Composite (agent_id, key) uniqueness across SQL + Qdrant; tolerate concurrent SQLite schema migrations (#6432); residual isolation gaps closed
|
| Skills | ClawHub install runs on the async runtime (#6682); strict SkillMeta + SkillForge provenance under [forge] (#6209); __ separator in tool names for OpenAI-compat function calling (#6732)
|
| Service / Update | Valid macOS launchd plist (#6738); release asset selection tightened (#6585); Windows snapshot TTL vs. polling interval (#6750) |
| Onboard | Interactive-flag compatibility restored (#6673); reachable model catalogs surfaced; SQLite-default storage help |
Breaking Changes
v0.8.0 is a pre-1.0 breaking release. Your config is auto-migrated in memory on every load, and the install filesystem is migrated on first boot with timestamped backups. To commit the config migration to disk (preserving comments, writing a .backup):
zeroclaw config migrate # add --json for a machine-readable reportBack up first. SQLite memory is backed up automatically (brain.db.backup-<ts>), and the install tree is copied to backup-<ts>/ before the split. Postgres and Qdrant are NOT backed up for you. Dump them yourself before upgrading.
Schema V3 and the install layout
- The on-disk tree is split: shared databases (memory, sessions, state) move to
<install>/data/, host-wide skills to<install>/shared/skills/, and per-agent identity/markdown to<install>/agents/default/workspace/.Config.workspace_diris renamed toConfig.data_dir(<config-dir>/workspace/→<config-dir>/data/). (#6272) - Single-agent installs are migrated into one
defaultagent;defaultis the migration bridge alias and never appears on a fresh install.
Agents are now explicit
[identity]is demoted from a top-level block to per-agentagents.<alias>.identity; each agent picks its own format and source.- Top-level provider maps collapse under one
[providers]key:[model_providers.*]→[providers.models.*],[tts_providers.*]→[providers.tts.*],[transcription_providers.*]→[providers.transcription.*]. MemoryEntry.agent_idis renamed toagent_alias(a serde alias keeps existing Qdrant/JSON payloads readable, no data migration needed).
Removed / relocated config
[autonomy]is gone. Its fields move to per-agent[risk_profiles.<alias>](authorization) and[runtime_profiles.<alias>](budgets/timeouts); the active profile resolves via the agent'srisk_profile.[security.sandbox]and[security.resources]are gone. Sandbox and resource fields now live flat on the risk profile.- Provider fallback is eradicated.
reliability.fallback_providersandreliability.model_fallbacksare removed; retries handle transient failures, routing is explicit. - Swarms are removed entirely, deferred to a later release with a new shape;
[swarms.*]tables are dropped on migration with a warning. - Channel-level peer-auth fields are removed (
allowed_users,allowed_contacts,allowed_from,allowed_numbers,allowed_senders,allowed_pubkeysacross all 24 channels). Inbound authorization lives exclusively in[peer_groups]now; migration synthesizes[peer_groups.<type>_default]from your old allowlists (wildcard-only/empty lists are skipped). - Feishu folds into Lark.
[channels.feishu]migrates to[channels.lark]withuse_feishu = true; conflictingapp_ids drop the Feishu side with a warning. claude-codeis removed as a model provider (folds underanthropic.claude-codeon migration).- Schema cleanups:
PeerExternalflattened toPeerUsername;RuntimeProfile.api_keyandModelProviderConfig.namedropped.
Environment-variable grammar rewrite
Every legacy override is replaced by a single schema-mirror grammar (#6375):
ZEROCLAW_<lowercase_dotted_path_with_underscores>=<value>
The lowercase tail mirrors the dotted prop-path config set accepts (each _ is either a path separator or a kebab joiner inside a snake-case field). Only the bootstrap vars ZEROCLAW_WORKSPACE and ZEROCLAW_CONFIG_DIR keep their uppercase form. All previous override names (including AZURE_OPENAI_*) are gone. See docs/book/src/reference/env-vars.md for per-variable recipes.
Internals
- Observability:
runtime_trace::record_eventretired in favor ofrecord!everywhere; therecord!shape is locked and carries alias-bound attribution through spans. - Cron: the
agent_aliasfallback toDEFAULT_AGENT_ALIASis removed; jobs must name their agent. - TTS/transcription
default_*_providerfields are deleted; each agent declares its own.
Known Issues
This is a beta. The following are known-broken or unfinished and will be addressed before the stable release:
- Channel tool-approval timeouts default to 0s. In practice the per-channel
approval_timeout_secsresolves to0rather than the documented 300s (120s for Telegram), so analways_asktool prompt can auto-deny immediately instead of waiting for an operator. Setapproval_timeout_secsexplicitly on each channel as a workaround. - Onboarding and agent-assignment UX is not final. Expect rough edges in the onboarding flow and in how agents are assigned during setup.
- Web gateway UI is not finalized. The dashboard is functional but still changing; layout, controls, and routes may shift before stable.
Contributors
- @0disoft
- @abhinavmathur-atlan
- @alexandme
- @aliasliao
- @Alix-007
- @Audacity88
- @drbparadise
- @flyin1600
- @fresh-fx59
- @FTDGRT
- @guitaripod
- @ilteoood
- @joe2643
- @johnrspeer83-png
- @JordanTheJet
- @kapelame
- @kmsquire
- @markuman
- @mminkus
- @mn13
- @nebullii
- @ninenox
- @NiuBlibing
- @ozzyfly
- @patrickzzz
- @plodsoft
- @Project516
- @rareba
- @roywong10
- @RyanHoldren
- @SebConejo
- @SimianAstronaut7
- @singlerider
- @SpectreMercury
- @TeoConnexioh
- @theonlyhennygod
- @thezillo
- @tidux
- @TJUEZ
- @WareWolf-MoonWall
- @whtiehack
- @xydigitLybnnnn
- @xydigit-sj
- @yanalialiuk
- @yijunyu
- @Yyukan
- @zwffff
Full diff: git log v0.7.5..v0.8.0-beta-1 --oneline