You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracker for the v0.8.0 release line: config and tool-call-parser Stable-tier promotion, schema/config breaking-change cleanup, runtime/provider configuration correctness, and release-default decisions that must be settled before v0.8.0.
This issue is the milestone coordination home. It is not approval for every linked PR, and it should not replace the Project board. Each linked PR still needs its own review, labels, validation, docs, and merge-readiness checks.
Problem statement
The v0.8.0 milestone has a clear description and a large set of scoped issues, but it does not currently have a standalone release tracker. That makes it harder to answer the practical maintainer questions:
Which items are true v0.8.0 blockers?
Which PRs are reviewable, blocked, or waiting for author action?
Which release-default or breaking-change decisions need docs/changelog follow-through?
Which adjacent tracks have their own tracker and should not be folded into this one?
Governance also expects the next active release to have a visible milestone tracking issue. This issue fills that gap for v0.8.0.
Blockers (26; must close or defer before v0.8.0 stable)
These are the true release blockers, re-vetted 2026-06-11 against the bar "broken behavior that can confuse users": every remaining open priority:p1/priority:p0 defect plus the release gate. Demoted in that pass: #5849 (Dream Mode — feature, not a defect) and #6127 (internal gateway hardening follow-up to #6099; its PR #7419 is already milestoned v0.8.1) — both moved to v0.8.1 at p2. The parenthetical shows open-PR coverage from a live GitHub search; "no open PR" means no open PR reference was found and the item needs an owner or an explicit deferral. These items live only here, not in the full queue below.
Three blockers (#7042, #7462, and #7470) currently have no open PR reference; all other open blockers have at least one open PR.
Proposed use
Track v0.8.0 release scope in one public issue.
Keep config/schema/tool-call-parser Stable-tier work visible.
Keep runtime/provider configuration correctness work visible when it affects v0.8.0 behavior.
Record release-default decisions that affect installs, feature bundles, docs, or upgrade expectations.
Keep adjacent tracks linked but separate. For example, the Zerocode/TUI track belongs in [Tracker]: Zerocode #6826, not here, unless a TUI item blocks the v0.8.0 release itself.
Do not treat this tracker as a blanket approval. Linked work still needs normal review, validation, and release-note hygiene.
Full queue (non-blockers)
Everything else tracked for v0.8.0: merged and closed history, p2 and unprioritized work, and the audit-added items. These are in scope for v0.8.0 but are not release blockers — the blocker line is the section above. Each item lives in exactly one place: blockers above, everything else here.
fix(skills): keep blank lines inside SKILL.md block-scalar descriptions #7196 — fix(skills): keep blank lines inside SKILL.md block-scalar descriptions. Merged ✅ as 667a60c. Approved by @WareWolf-MoonWall and @Audacity88 at d19438f; CI green, clean/approved, with @JordanTheJet still requested. Fixes a lightweight frontmatter parser bug where blank lines inside folded/literal SKILL.md description blocks truncated discovery text before later paragraphs. Adds regression coverage for both multi-paragraph block scalars and real next-key termination. Labels/milestone aligned as bug, risk: low, size: XS, runtime, skills; milestone v0.8.0.
fix(mcp): surface tool-execution errors (result.isError) instead of swallowing them #7122 — fix(mcp): surface tool-execution errors (result.isError) instead of swallowing them. Merged as bfef8f05027650f460d227fcd159ea7387e117e5. Surfaces MCP tool-execution failures reported through result.isError, sanitizes and bounds server-provided details before logging/returning them, and adds focused regression coverage for error conversion, normal success, and fallback detail handling. Milestone v0.8.0.
fix(shell): prevent interactive subprocesses from hijacking the terminal #7120 — fix(shell): prevent interactive subprocesses from hijacking the terminal. Merged ✅ as 96db39f. Approved by @WareWolf-MoonWall, @tidux, and @Audacity88 at 0604c00; still draft, clean/mergeable, no review requests, and current Quality Gate jobs green. Closes the shell/git terminal-prompt bleed by giving the runtime shell spawn null stdin and setting GIT_TERMINAL_PROMPT=0 in the shared git helper. Residual direct /dev/tty / session-isolation hardening is documented as follow-up, not a blocker for this PR.
ci(actions): split format gate from lint #7111 — ci(actions): split format gate from lint. Merged ✅ as 631ccc6. Approved by @WareWolf-MoonWall and @singlerider at e01cf6f; CI green, mergeable once the stale failed title-validation run from before the title cleanup is cleared. Splits cheap fmt from lint, fans build/check/test/security out after formatting, keeps CI Required Gate dependent on every required job, and updates FND-004 plus the maintainer CI guide.
fix(ollama): restore compiling master build #7231 — fix(ollama): restore Option temperature in chat(). Merged ✅ as 746c616. Approved by @JordanTheJet, @tidux, and @theonlyhennygod at 42dbcf0; mergeable. Reverts the E0308 build-breaker fix(ollama): keep structured tools prompt-guided #7095 introduced by shadowing chat()'s temperature: Option<f64> parameter into a bare f64 via unwrap_or(default_temperature()), which broke cargo build on master for source installs. One-line removal restores the Option<f64> pass-through (matching the file's three other send_request callers); None defers to Ollama's native model default downstream in build_chat_request_with_think — no behavioural loss vs. the last release. Build/Check/Test/Security/Format green; the Lint gate (clippy --all-targets) is red on the pre-existingtokio::spawn disallowed-method debt at ollama.rs:1270 (test module, already on master, not introduced here) — tracked separately, not a blocker on this diff's correctness.
fix(channels): preserve Discord audio fallback #7086 — preserve Discord audio fallback when transcription fails or returns empty. Merged ✅ as 8d003f9. Preserves failed or blank Discord audio transcription as [AUDIO:...] media fallback instead of silently dropping the attachment.
docs(providers): add OpenAI Codex over a ChatGPT subscription #7116 — docs(providers): add OpenAI Codex over a ChatGPT subscription page. CHANGES_REQUESTED by @Audacity88 at 623948e; @singlerider's earlier template review is dismissed and @tidux approved the rewritten body. Author action needed to correct stale Codex billing/cost guidance, add a same-owner/private-channel boundary for raw auth.json sync, and fix or clarify the optional account_id curl example. Milestone v0.8.0.
docs(setup): add FreeBSD setup guide + installable rc.d/jail dist files #7161 — docs(setup): add FreeBSD setup guide + installable rc.d/jail dist files. Merged ✅ as 95c5e7e. Adds FreeBSD setup docs plus installable rc.d/jail dist files; maintainer cleanup before approval aligned body label/rollback fields and removed generated-tool attribution from the contributor branch tip. Milestone v0.8.0.
fix(cron): diagnose past at schedules #7165 — fix(cron): diagnose past at schedules. Merged ✅ as 1330ea9. Keeps the existing rejection behavior for past one-shot at schedules but adds now_utc, now_local, at_utc, at_local, and delta_seconds to the user-visible cron_add error so stale timestamps can be distinguished from timezone or host-clock issues. Regression test exercises the cron_add tool boundary; labels/body aligned as bug, risk: high, size: XS, cron, runtime. Milestone v0.8.0.
feat(providers): add Kilo AI Gateway as first-class model provider with pricing capture #7136 — feat(providers): add Kilo AI Gateway as first-class model provider with pricing capture. Merged as 699d576e385a8180bc49b4d5855f238b1d8cdb2d. Adds the Kilo AI Gateway provider, config schema/factory registration, catalog/pricing plumbing, OpenRouter pricing preservation, and cost-rate editor pricing capture. Landed under v0.8.1 as an additive provider feature, not a v0.8.0 blocker.
fix(qq): restore audio attachment transcription #7109 — fix(qq): restore audio attachment transcription. Merged ✅ as f8641d2. Approved by @singlerider at 5097bb5; CI green, mergeable, no open threads. Re-applies feat(qq): add TranscriptionManager wiring for audio attachments #4315 for audit: track 153 commits lost in bulk revert c3ff635 for recovery #6074 (QQ voice attachments without platform asr_refer_text now fall back to provider transcription). Wires the existing TranscriptionManager into QQ channel construction via with_transcription, sole-provider binding matching the telegram.rs channel-direct pattern; reuses downloaded bytes for the fallback and normalizes extensionless voice_wav_url to .wav. Two regression tests cover fallback-fires and platform-ASR-wins paths. One 🟢 on record: QQ_MAX_AUDIO_TRANSCRIPTION_BYTES (25 MB) duplicates the manager's existing MAX_AUDIO_BYTES cap — redundant early reject, non-blocking.
fix(matrix): no-op reaction removal when acks disabled #7183 — fix(matrix): no-op reaction removal when acks disabled. Merged ✅ as 2786cec. Approved by @singlerider at eadf602; CI green (13/13), mergeable, no open threads. Follow-up to [Feature]: Add config option to disable channel ack reactions (👀/✅) #3403 (closed feature that added ack_reactions but wired the guard only into add_reaction, missing remove_reaction). Adds the byte-for-byte-symmetric if !self.ack_reactions { return Ok(()); } to remove_reaction so with acks disabled it short-circuits before ensure_client() / event-id parse instead of doing redaction work for a reaction that was never sent. self.ack_reactions is the resolved bool (matrix.rs:3186, unwrap_or(true) + .with_ack_reactions override). Regression test uses Some(false) + invalid room/event IDs proving the return precedes parsing. Default ack_reactions = true path untouched. 🟢 body says risk: low but applied label risk: medium is correct — no action.
fix(cron): support relative after schedules #7188 — fix(cron): support relative after schedules. Merged ✅ as 5c027b6. Adds schedule={"kind":"after","after_seconds":...} to cron_add for relative one-shot reminders, resolves the delay at tool execution time, and persists the job as the existing Schedule::At shape. Keeps delete_after_run defaulting to true for one-shot at/after schedules. Merge-readiness check covered current-master same-file drift from fix(cron): diagnose past at schedules #7165: focused merged-result zeroclaw-runtime cron_add validation passed with 27 tests, including both the past-at diagnostics and relative-after cases. Labels/body aligned as bug, risk: high, size: S, cron, runtime, tool. Milestone v0.8.0.
fix(memory): honor recall since/until window for markdown entries #7192 — fix(memory): honor recall since/until window for markdown entries. Merged ✅ as a987acd. Approved by @Audacity88 at 4820ad4; CI green, clean/mergeable, no open review requests. Fixes markdown-backed recall bounds that previously parsed daily YYYY-MM-DD file stems only as RFC3339, so out-of-window daily entries could survive bounded recall. Adds day-granularity filtering for daily stems while keeping non-date MEMORY.md core memories evergreen. VERIFIED: the reviewed markdown.rs patch is unchanged from the approved 2f8a510 head after the master merge, GitHub live diff is still one file, git diff --check is clean, and CI Required Gate is green on current head. Labels/body aligned as bug, risk: medium, size: S, memory. Milestone v0.8.0.
fix(cron): block scheduler mutation tools in agent jobs #7189 — fix(cron): block scheduler mutation tools in agent jobs. Merged ✅ as bb406bd. Approved by @singlerider and @Audacity88 at fee76bd; CI green (13/13), clean/mergeable, no open threads or review requests. Security narrowing (Related feat: enforce allowed_tools / denied_tools in main agent loop #6914): cron-launched agent jobs now derive a run-time SecurityPolicy that excludes cron_add/cron_update/cron_remove/cron_run/schedule by default unless the job sets explicit allowed_tools, so a scheduled job can't self-schedule/recurse/mutate scheduler state. cron_agent_run_security_policy only fires for JobType::Agent + allowed_tools.is_none(); appends to excluded_tools (deduped), wrapped in a fresh Arc (doesn't mutate shared ctx.policy). VERIFIED: all 5 names match Tool::name() exactly (no drift); is_tool_allowed = allowed && !excluded (policy.rs:263) hard-overrides allowlist; omitted cron_list/cron_runs are read-only (correct for a mutation guard); schedule is one tool covering all mutating actions. Tests cover default-exclusion + explicit-opt-in + schema-doc sync. 🟢 on record: CRON_AGENT_DEFAULT_EXCLUDED_TOOLS hardcoded not derived — drift risk if a 6th mutator added; suggested future enumeration test. Non-blocking.
fix(config): default webhook channel port to 8090 #7193 — fix(config): default webhook channel port to 8090. Merged ✅ as 91cf0ca. Approved by @singlerider; CI green (13/13), mergeable, no open threads. Adds #[serde(default = "default_webhook_channel_port")] to WebhookConfig.port (schema.rs:11164) so a [channels_config.webhook] block without port loads with 8090 instead of failing missing field port and blocking zeroclaw agent. VERIFIED: 8090 matches docs webhook.md:12 exactly; DRY-checked — existing default_webhook_port() (scattered_types.rs:655) is private + serves a different field (VoiceCall webhook_port), so the new distinct helper is correct, not forbidden duplication. Test deserializes {} → port==8090; existing explicit-port tests untouched. 🟢 body says risk:low but applied risk:medium correct — no action. 1 file +11/−0, no bot attribution. Milestone v0.8.0 (break-fix, no scope match → earliest open).
docs(reference): document ZEROCLAW_DATA_DIR in bootstrap env vars #7201 — docs(reference): document ZEROCLAW_DATA_DIR in bootstrap env vars. Merged ✅ as f7e28bb. Approved by @singlerider; CI green (13/13), no open threads. Docs-only +4/−3 (env-vars.md). Corrects a stale section that documented only 2 vars and presented deprecated ZEROCLAW_WORKSPACE as first-class. VERIFIED line-by-line against resolve_runtime_config_dirs (schema.rs): strict precedence CONFIG_DIR(13973) > DATA_DIR(14016) > WORKSPACE(14038), each branch return Ok (first-set wins, rest WARN-ignored); DATA_DIR canonical + WORKSPACE deprecated confirmed by WARN at 14045; CONFIG_DIR "takes precedence / pins both" matches WARN at 13988. Only other non-test reader is i18n.rs:290 (reads CONFIG_DIR only — consistent). No bot attribution. Milestone v0.8.0 (docs route like break-fix, no scope match → earliest open).
docs(i18n): translate sidebar parent sections #7202 — docs(i18n): translate sidebar parent sections. Merged ✅ as a713fc9. Approved by @singlerider; CI green (14/14), mergeable, no open threads. Docs/i18n +640/−25, 10 files (SUMMARY.md + 5 new index.md hubs + 4 .po). Replaces empty [Label]() parent links (untranslatable by mdBook) with real targets: sections with existing Overview child promote parent→overview + drop dup child row; sections without a landing page get new index.md hub. VERIFIED: all 18 parent-link targets resolve, 0 empty ]() links remain, no orphaned pages; all 4 .po have identical 36 new msgids; msgfmt --check-format passes all 4; CJK genuinely translated (チャンネルと連携/频道与集成 etc.), markdown link paths preserved + labels localized; 5 hub pages real content not stubs. Disclosed unclosed-tag warnings (subagents.md/cli.md/cost-tracking.md) pre-existing — PR touches none. No bot attribution. Milestone v0.8.0.
docs(providers): fix stale code reference in streaming.md #7204 — docs(providers): fix stale code reference in streaming.md. Merged ✅ as 0c15b14. Approved by @singlerider; CI green (13/13), no open threads. Docs-only +1/−1 (streaming.md Code references list). VERIFIED vs master: old ref provider.rs is GONE (genuinely stale); new ref model_provider.rs has StreamEvent enum (L229) + ModelProvider trait (L367) exactly; rename complete (no stray pub trait Provider in zeroclaw-api, so old bullet wrong on both path AND name); other 3 refs (compatible/anthropic/ollama .rs) still resolve, correctly unchanged. No bot attribution. Milestone v0.8.0.
docs(maintainers): correct zerocode locale resolution to the single file it reads #7205 — docs(maintainers): correct zerocode locale resolution to the single file it reads. Merged ✅ as e0a709c. Approved by @singlerider; CI green (13/13), no open threads. Docs-only +1/−1 (docs-and-translations.md "Locale resolution"). VERIFIED vs master apps/zerocode/src/i18n.rs: detect_locale()(L54) = locale_from_config().unwrap_or_else(|| "en") → SINGLE file read zerocode-config.toml(L160), no 4-path walk (old doc stale); config_dir precedence --config-dir→ZEROCLAW_CONFIG_DIR→~/.zeroclaw matches config_dir()(L131); en fallback ✓; "decoupled from daemon" confirmed by source comment L146-150 (old multi-path walk deliberately removed — writer never touched those paths). Old "matches the daemon" claim was misleading; removal correct. No bot attribution. Milestone v0.8.0.
fix(tools): fix Claude Code execution on Windows #7214 — fix(tools): fix Claude Code execution on Windows. CHANGES_REQUESTED by @Audacity88 at 3e2b669; non-draft, blocked on review, milestone v0.8.0, labels bug, risk: high, size: XS, tool. Direction is right and preserves the allowlisted subprocess environment, but author action needed: add focused regression coverage for Windows verbatim-path cleanup and required Windows env allowlist entries, then clarify whether claude_code_runner is intentionally Unix/WSL-only or should receive the same Windows binary/env treatment.
fix(channels/whatsapp-web): treat replies to bot as mentions #7226 — fix(channels/whatsapp-web): treat replies to bot as mentions. Approved by @singlerider at 6a27d83; mergeable, no open threads. Closes [Bug]: WhatsApp Web mention_only ignores replies to the bot in group chats #7225 (mention_only ignored replies to bot in groups). +117/−14, 1 file. Adds is_reply_to_bot reading context_info.participant (quoted author) via same get_base_message→extended_text→context_info chain as proven extract_mentioned_jids; composes mention-or-reply in is_message_addressed_to_bot. jid_matches_bot extraction is byte-identical dedup of inlined mention logic (no behavior change). VERIFIED: built --features whatsapp-web (applied fix(providers): fixes use of f64 after signature change #7213 one-liner locally as author disclosed), all 4 new tests pass (phone-JID/LID-JID accept, other-participant reject, explicit-mention-in-other-reply accept); fmt clean on diff. CI red (10 jobs) is PRE-EXISTING ollama.rs:1058 E0308 (fix(providers): fixes use of f64 after signature change #7213/fix(ollama): restore compiling master build #7231), not this diff — author honestly disclosed in body+comment, kept provider fix out. Label fix: added bug+size:S+risk:medium (path-labeler only set channel ones). Milestone v0.8.1 (merged; milestone label is v0.8.1, not v0.8.0).
fix(security): create per-agent workspace dir in for_agent (+ Android shell support) #7284 — fix(security): create per-agent workspace dir in SecurityPolicy::for_agent (+ Android shell support). CHANGES_REQUESTED by @singlerider at 4b2d07e (supersedes @theonlyhennygod's earlier approval at c19c30a); @Audacity88 reviewed current head with comments. Author action needed. Fixes a fresh-agent regression: for_agent resolved the per-agent workspace (agents/<alias>/workspace/) — the shell tool spawn cwd + file-tool jail root — but never created it, so the agent-loop/CLI/gateway/channel policy-build paths left it missing and the first shell command died at posix_spawn with ENOENT (only Agent::from_config* had created it, so daemon/ACP worked while loop/CLI did not). create_dir_all at the for_agent chokepoint (policy.rs:2405) covers every path; idempotent, warn-and-continue on failure. Second commit adds runtime-detected Android shell support (absolute /system/bin/sh + /system/bin:/system/xbin PATH prepend, gated on /system/bin/sh existence) — no-op off-Android, runs after validate_command_execution so it does not widen the allowlist; verified on Galaxy S21 (A15) + OPPO CPH2305 (A16). VERIFIED against local source. One 🟡 non-blocking: no regression test asserts the dir creation (existing for_agent tests exercise the path but do not check is_dir()). Milestone v0.8.0 (break-fix, no scope match → earliest open).
fix(docs): clean up docs build warning noise #7276 — fix(docs): clean up docs build warning noise. Merged ✅ as 15320e0. Approved by @WareWolf-MoonWall and @Audacity88 at 5b9ba21; CI restarted after the latest merge-from-master refresh and is still pending; clean/mergeable, with @singlerider and @JordanTheJet still requested. Closes bug(docs): clean up docs build warning noise #7269. Eliminates rustdoc/mdBook warning noise across broken/private intra-doc links, invalid placeholder tags, one redundant explicit link, and generated CLI-reference placeholders. Audacity88 re-reviewed the earlier over-escaped placeholder blocker and confirmed the current diff keeps placeholders readable in code spans without behavior, config, or API changes. Labels/body aligned as bug, size: S, risk: low, docs, plus auto scope labels. Milestone v0.8.0.
fix(channels/telegram): clamp zero draft update interval #7334 — fix(channels/telegram): clamp zero draft update interval. Merged ✅ as 8179a16. Approved by @Audacity88 at 8d99710; CI green, clean/mergeable, with @singlerider still requested. Closes [Bug]: Telegram partial streaming accepts zero draft update interval and floods edits #7332. Maps draft_update_interval_ms = 0 back to TELEGRAM_DRAFT_UPDATE_INTERVAL_MS so Telegram partial streaming keeps its draft-edit throttle instead of attempting one edit per streamed delta; non-zero intervals remain unchanged. Regression coverage includes zero-fallback, existing 750 non-zero preservation, and nearby draft-update rate-limit / UTF-8 truncation tests. Labels aligned as bug, risk: medium, size: XS, channel, channel:telegram. Milestone v0.8.0.
docs(maintainers): define issue ownership path #7011 — docs(maintainers): define issue ownership path. Merged ✅ as 6d73991. Approved by @WareWolf-MoonWall at 97d76ba and @theonlyhennygod; CI green (13/13), clean/mergeable, no open threads. Docs-only +52/−13, 6 files (pr-workflow.md, labels.md, reviewer-playbook.md, fnd-003-governance.md, project-board-contract.json, triage-protocol.md). Related RFC: Work Lanes, Board Automation, and Label Cleanup #6808. Adds a canonical ### Issue ownership path section to pr-workflow.md distinguishing active assignees from area stewards (the issue-side analogue to CODEOWNERS) and tightens status:no-stale to require a contributor-visible reason plus an active owner or steward path; every other file links back to the single section rather than restating it, and project-board-contract.json renames active_owner → owner_path to match. Non-breaking rollout: existing exemptions missing those facts become audit findings for the later stale-exemption repair packet, not automatic stale closures. VERIFIED both new inbound anchors (#project-board-contract, #issue-ownership-path) resolve against local pr-workflow.md (docs links gate ran lychee offline, Total 0, so checked by hand). Two 🔵 left for author (labels.md anchor consistency — seconds @WareWolf-MoonWall and sharpens which link to repoint; triage-protocol "Project board contract" link ambiguity). No bot attribution. Milestone v0.8.0 (docs route like break-fix, no scope match → earliest open).
fix(cli): print model names in 'zeroclaw models list' output #7346 — fix(cli): print model names in zeroclaw models list output. Merged ✅ as 526b328. Approved by @theonlyhennygod at 8c74201; with @Audacity88 and @WareWolf-MoonWall still requested. +12/−6, 2 files (crates/zeroclaw-runtime/src/doctor/mod.rs, src/main.rs). models list only printed per-provider counts; now prints each resolved model name under its provider via a show_model_names flag on run_models — true for models list, false for models refresh and the doctor health path. VERIFIED: list_models() returns Vec<String> so {} prints the model name; both run_models call sites updated (no other callers); flag gating correct. CI green (run predates the orchestrator master break, so a rebase/re-run may surface the unrelated #15443 red until that lands). Output-only — corrected auto risk: high → risk: low (+ risk: manual). One 🔵 non-blocking (no test pins the new branch; print path not test-structured today). Milestone v0.8.0 (break-fix fix(cli): + bug, no scope match → earliest open).
fix(zerocode): size quickstart modals by wrapped row height #7360 — fix(zerocode): size quickstart modals by wrapped row height. Merged ✅ as 8a8357a. Approved by @theonlyhennygod at 6d5b8a7; with @WareWolf-MoonWall still requested. Closes [Bug]: Quickstart modal clips wrapped rows — YOLO risk option and model picker fall off-screen #7359. +125/−25, 1 file (apps/zerocode/src/quickstart_pane.rs). The Quickstart draw_modal sized the box from logical body_lines.len() and scrolled by logical line index, ignoring the Wrap { trim: false } the body renders with — so wrapped picker blurbs hid the yolo risk option and a long pasted api_key pushed the model picker off-screen. New wrapped_row_heights/wrapped_total (via Paragraph::line_count) size the box and drive cursor-tracking scroll in wrapped-row space; also repairs a latent unit bug (ratatui Paragraph::scroll counts wrapped rows, old code fed it logical indices). Hit-test rects now span each row's full wrapped height. VERIFIED header + body both render with Wrap { trim: false } so measurement matches paint. CI RED (Lint + Test) is a PRE-EXISTING master breakage, NOT this diff: orphaned test ctor at crates/zeroclaw-channels/src/orchestrator/mod.rs:15443 still sets removed ChannelRuntimeContext fields (default_model_provider/api_key/api_url) vs the migrated model_provider_ref (confirmed on origin/master; ~30 other ctors updated, this one missed). One-line master fix unblocks; admin-merge candidate meanwhile. One 🟡 non-blocking: the scroll/visibility + hit-test fix itself isn't covered by a test (only the measurement helpers are). Milestone v0.8.0 (break-fix fix(zerocode):, no scope match → earliest open).
fix(config): unbounded/yolo presets must allow what they advertise #7371 — fix(config): unbounded/yolo presets must allow what they advertise. Merged ✅ as 041ff36. Approved by @theonlyhennygod at 7a2ba9a; with @Audacity88 and @singlerider still requested. +67/−4, 2 files (crates/zeroclaw-config/src/presets.rs, schema.rs). Related fix(zerocode): repair Quickstart model-provider form UX defects #7330 (forces every Quickstart agent onto unbounded). Two Quickstart presets used sentinel values meaning the opposite of intent, leaving a fresh agent dead on arrival: the unbounded runtime preset set max_actions_per_hour: 0 / max_cost_per_day_cents: 0 — but PerSenderTracker::is_exhausted treats a max of 0 as always exhausted (policy.rs:144), so every tool call was rejected ("max 0 actions per hour"); the yolo risk preset set allowed_commands: vec![] — deny-by-default, so the command gate rejected even ls/pwd. Fixed to u32::MAX budgets and the ["*"] wildcard (which, with block_high_risk_commands: false, hits the trusted-env early-return in is_command_allowed, policy.rs:1462). VERIFIED both enforcement primitives against local source; the 0 = exhausted / empty-allowlist-denies primitives are left intact (only the presets stop depending on them), rate_limit_zero_blocks_everything still passes. Two regression tests assert behaviour (policy built from each preset permits actions/commands), not literal values. Schema doc for max_actions_per_hour corrected; the adjacent max_tool_iterations "0 inherits" doc correctly left alone (that field genuinely falls back to a safe default, loop_.rs:1420). CI green (15/15). Two 🔵 non-blocking: the max_cost_per_day_cents change rides along untested (cost isn't enforced via is_exhausted — separate CostTracker/daily_limit_usd; its real effect is preventing spurious subagent escalation-subset rejection at policy.rs:2264); u32::MAX-as-unlimited sentinel flagged as a conscious team choice. Milestone v0.8.0 (break-fix fix(config): + bug, no scope match → earliest open).
fix(channel): restore WhatsApp interrupt_on_new_message #7040 — fix(channel): restore WhatsApp interrupt_on_new_message. Approved by @singlerider at 131f182; CI green per body (8297 nextest + workspace clippy), clean/mergeable. Related audit: track 153 commits lost in bulk revert c3ff635 for recovery #6074, supersedes feat(channel): add interrupt_on_new_message support for WhatsApp #4371 by @tmigone (co-author trailer present). Restores interrupt_on_new_message on WhatsAppConfig (defaults false, #[serde(default)] keeps existing configs loading) and wires it into the orchestrator in-flight cancellation switch for both WhatsApp backends. The fix also collapses the five previously inline-duplicated per-channel get("default").is_some_and(...) reads (telegram/slack/discord/mattermost/matrix) in start_channels into one interrupt_on_new_message_config() constructor, then adds whatsapp through it — wiring site drops ~30 lines to one call. VERIFIED both backends emit channel = "whatsapp" (whatsapp.rs:377 Cloud API, whatsapp_web.rs:975 Web) so the single "whatsapp" => self.whatsapp arm covers both; behavior test message_dispatch_interrupts_in_flight_whatsapp_request_and_preserves_context pins interrupt-and-preserve (one send carrying response-2, second provider call carries both user turns, cancelled turn persists no assistant message). Keeps existing default-alias scope (no new alias-scoped semantics in a recovery PR). Large +whatsapp: false test churn is unavoidable struct-field mechanical cost. No bot attribution. Milestone v0.8.0 (break-fix fix(channel): + bug, no scope match → earliest open).
fix(cron): expose DingTalk in cron delivery schemas #7091 — fix(cron): expose DingTalk in cron delivery schemas. Merged as 2d68a576db4ce4d472130bbd453f9949971d7295, closing bug(cron): DingTalk is missing from cron delivery tool schemas #7088 (DingTalk delivery worked but cron tool schema never advertised it). +122/−26. Replaces the two separately hand-maintained delivery-channel enums in cron_add.rs and cron_update.rs with one shared cron::CRON_DELIVERY_SCHEMA_CHANNELS constant (10 channels incl. dingtalk) and adds add_and_update_delivery_channel_schemas_match to pin byte-for-byte parity so the two tool schemas can't drift again. Strips the stale hardcoded channel list out of the cron_add description so the enum stays the single tool-surface source. Separately keeps AUTO_DELIVERY_DEFAULT_CHANNELS (6-channel implicit-reply default subset, adds dingtalk) deliberately narrower than the schema enum because webhook/qq/lark/feishu need explicit to/thread_id — cron_delivery_defaults_do_not_guess_webhook_shape pins webhook is never auto-injected. VERIFIED the "dingtalk" delivery arm genuinely exists (orchestrator/mod.rs:5606), so the schema advertises a working handler. 🟢-only review; one non-blocking residual flagged: the runtime schema constant still lives a crate away from the channels-crate dispatch set (5335 construction match + 8743 deliver_announcement) with no cross-crate parity assertion — pre-existing, worth a follow-up, out of scope for this bug. No bot attribution. Milestone v0.8.0 (break-fix fix(cron): + bug, no scope match → earliest open).
fix(channels/telegram): restore forward origin attribution #7251 — fix(channels/telegram): restore forward origin attribution. Approved by @singlerider at 0bbb14b; focused forwarded tests green (full nextest interrupted only by the pre-existing brittle telegram_send_document_bytes_empty_file real-network test, which test(channels/telegram): make empty document send test local-only #7264 fixes). +225/−19, 1 file. Related audit: track 153 commits lost in bulk revert c3ff635 for recovery #6074, supersedes feat: support forwarded messages in Telegram channel (#4118) #4254 by @Tenith01 (co-author trailer present). Restores modern Telegram forward_origin attribution (4 variants: user/hidden_user/chat/channel) checked before the legacy forward_from_chat/forward_from fallbacks, which are preserved. Extracts two helpers: format_forwarded_user_label (dedups username-or-name logic, now also appends last_name) reused by both the forward_origin user path and legacy path, and prepend_forward_attribution applied uniformly at all 4 call sites. VERIFIED the forwarded-reply fix: prepend_forward_attribution detects content.starts_with("> ") and inserts \n\n so attribution no longer collapses onto the quote block — quote-detection matches the real renderer (extract_reply_context emits > @sender:\n> ... at telegram.rs:2179); parse_update_message_forwarded_reply_keeps_quote_block_separate pins the exact output. match origin_type is wire-protocol discriminant dispatch (legit, not an internal options list). No bot attribution. Milestone v0.8.0 (break-fix fix(channels/telegram): + bug, no scope match → earliest open).
fix(runtime): strip think blocks before native tool-call output #7254 — fix(runtime): strip think blocks before native tool-call output. Approved by @WareWolf-MoonWall (thorough, 16/16 green) and @singlerider at 92bd109 (clean master-merge over the reviewed afb0ad9, no code change since). +193/−16, 1 file (agent/loop_.rs). Privacy fix: inline <think>...</think> reasoning could reach user-visible draft output, channel messages, logs, and native tool-call assistant history. Adds stateful StreamThinkTagStripper (handles <think>/</think> split across delta chunks via longest_suffix_matching_prefix, finish() drops content if still in-think at EOF), and replaces the old conditional double-strip (tool_specs.is_empty() + strict_tool_parsing && calls.is_empty()) with one unconditional strip_think_tags at the response boundary. reasoning_content preserved separately per [Bug]: Incompatible with DeepSeek-V4 API format #6059. Regression asserts native history content sanitized + reasoning_content survives, plus split-tag streaming test. @WareWolf-MoonWall left 3 🔵 (doc why reasoning_content isn't stripped, open-tag-at-EOF test, full-string-vs-streaming naming) — non-blocking, not carried. No bot attribution. Milestone v0.8.0 (break-fix fix(runtime): + bug, no scope match → earliest open).
fix(runtime): apply runtime profiles to delegate sub-loops #7307 — fix(runtime): apply runtime profiles to delegate sub-loops. Approved by @singlerider at 894f8b3; risk: high, +203/−22. Related [Feature]: Local-First Mode for Small Models — Compact No-Tools Prompting, Strict Parser Option, and No Prompt-Leakage #5287. Agentic delegate sub-loops now inherit the target agent's resolved runtime profile (max_tool_iterations, strict_tool_parsing, parallel_tools, max_tool_result_chars, max_context_tokens) instead of the old single-knob resolve_max_iterations + hardcoded 0, 0 for tool-result/context limits. New resolve_loop_runtime routes the production path through the canonical Config::resolved_agent_config() (schema.rs:3389, computes all effective_* + layers profile fields); the non-root_config fallback is scoped to legacy unit constructors and documented. Behavior change (subagents now prune context + truncate tool output where 0=disabled before) is intentional alignment, tested by execute_agentic_applies_target_profile_tool_result_limit (asserts "characters truncated" under an 80-char limit), and disclosed in rollback symptoms. Docs add a local_small profile composing existing primitives (no new preset). No bot attribution. Milestone v0.8.0 (break-fix fix(runtime):, no scope match → earliest open).
fix(web): log cron settings failures #7352 — fix(web): log cron settings failures. Approved by @WareWolf-MoonWall and @singlerider at bede536; web-only +24/−3 (Cron.tsx). Replaces two silent catch {} swallows (cron-settings load + catch-up toggle update) with sanitized console.warn. describeCronSettingsError extracts only safe diagnostic fields from ApiError (name, status, code, path, op_index) and deliberately OMITS envelope.message — the one field that could echo a server value into the browser console; non-ApiError paths return only { name } or { type: typeof err }. Adds observability without touching fallback UI behavior. Build clean. No bot attribution. Milestone v0.8.0 (break-fix fix(web): + bug, no scope match → earliest open).
fix(docs): guard mdbook catalogs against literal corruption #7375 — fix(docs): guard mdbook catalogs against literal corruption. Merged ✅ as e82f3ec. Approved by @singlerider at head; +281/−25 (mostly xtask/.../check.rs). Related [Bug]: Generated i18n catalogs translate code literals and invent docs content #6407, RFC: Move translated .ftl and .po files into a git submodule #7184. Adds protected-literal auditing to cargo mdbook check so .po catalogs fail when high-confidence machine-facing literals are translated (product names, zeroclaw daemon, fenced TOML section/key literals), plus fixes the actual corrupted es/fr/ja/zh-CN entries. VERIFIED the false-positive boundary is tested both ways: flags translated TOML keys / single-word keys / corrupted quoted dotted sections / translated product name, but ALLOWS non-TOML fenced text, prose around preserved literals, and CLI placeholders (zeroclaw [OPTIONS] <COMMAND> → localized). is_toml_key_path does real quote-state-aware parsing. Refactor shares one parse across both audits. Docs-tooling only. No bot attribution. Milestone v0.8.0 (break-fix fix(docs): + bug, no scope match → earliest open).
MCP, tool filtering, and tool-call parser behavior (2 closed)
Open MCP/tool-filter blocker work is now in the Blockers section: #6699, #6721, #6873, and #6874. PR #6861 remains in the open PR queue as the active #6699 implementation path. Below is the landed history.
test(fuzz): wire fuzz stub targets to real ZeroClaw code paths #5516 — test(fuzz): wire fuzz stub targets to real ZeroClaw code paths. REVIEW_REQUIRED at 1c2366b; dirty/conflicting, needs-author-action, with Validate Release Readiness red. Fuzz harness test-infrastructure PR routed to v0.8.0 by test(...)/other fallback; author action needed to refresh the branch and fix the release-readiness failure before review. Milestone v0.8.0.
fix(providers/runtime): two production blockers — empty tool_choice and orphaned tool_use #5892 — Draft:fix(providers,runtime): three production blockers — tool_choice, orphaned tool_use, and vision capability. REVIEW_REQUIRED at d14b358; dirty/conflicting, needs-author-action, stale-candidate. Bug-class provider/runtime repair routed to v0.8.0; author action needed to refresh the branch before review. Milestone v0.8.0.
docs(gateway): document gateway.web_dist_dir and ZEROCLAW_WEB_DIST_DIR #6583 — docs(gateway): document gateway.web_dist_dir and ZEROCLAW_WEB_DIST_DIR. CHANGES_REQUESTED at 2e4314e; dirty/conflicting, needs-author-action, stale-candidate. Docs/gateway PR routed to v0.8.0 by docs fallback; author action needed to refresh the branch before review. Milestone v0.8.0.
docs: add repo-summary.md with full project overview #6640 — docs: add repo-summary.md with full project overview. CHANGES_REQUESTED at 6f4bcdb; BLOCKED by active review state. Docs-only PR routed to v0.8.0 by docs fallback; author action needed to address the active review before review can resume. Milestone v0.8.0.
fix(loop): gate path-listing tool results from vision routing #7345 — fix(loop): gate path-listing tool results from vision routing. CHANGES_REQUESTED at e0b2797; BLOCKED by active review state. Runtime bug routed to v0.8.0; author action needed before review can resume. Milestone v0.8.0.
Update 'quickstart' to 'onboard' #7358 — Update "quickstart" to "onboard". REVIEW_REQUIRED at 2a68114; BLOCKED with main, Lint, Test, and CI Required Gate red. Docs wording PR routed to v0.8.0 by docs fallback; author action needed to fix CI before review. Milestone v0.8.0.
fix(ci): complete runtime tool sub-label mappings #7435 - fix(ci): complete runtime tool sub-label mappings. Merged as e5f3deb371c37342e1e65dcf663ae9497433d258, closing fix(ci): complete runtime tool sub-label mappings #7408. Adds runtime crate paths for tool:cron, tool:sop, and tool:security in .github/labeler.yml, including cron_common.rs, and syncs maintainer label docs. Labels aligned as bug, type: ci, risk: low, size: XS, ci, docs. Milestone v0.8.0.
fix(runtime): skip futile history trim when system prompt exceeds budget #7440 — fix(runtime): skip futile history trim when system prompt exceeds budget. REVIEW_REQUIRED at 16d808c; BLOCKED by review state. Runtime/agent bug routed to v0.8.0; labels aligned as bug, risk: high, size: S, agent, runtime. Milestone v0.8.0.
fix(doctor): validate custom model_provider entries against config, not legacy factory #7441 — fix(doctor): validate custom model_provider entries against config, not legacy factory. REVIEW_REQUIRED at 4f90679; BLOCKED by review state. Gateway/runtime/web doctor bug routed to v0.8.0; labels aligned as bug, risk: high, size: M, docs, doctor, gateway, runtime, web. Milestone v0.8.0.
fix(docker): resolve workspace build failures from apps/zerocode and embedded assets #7445 — fix(docker): resolve workspace build failures from apps/zerocode and embedded assets. Merged as 1b688fc4baefe7d26a5832592683451ea93b0517. Repairs build-from-source Docker images after apps/zerocode became a workspace member, ships the zerocode TUI binary in the runtime images, and applies the same builder/runtime fixes to the Debian Dockerfile. Milestone v0.8.0.
feat(mcp): auto-reconnect on stale session or dropped stream #7351 — feat(mcp): auto-reconnect on stale session or dropped stream. REVIEW_REQUIRED at bdcaf9a; DIRTY/CONFLICTING, needs author action before review. Bug-class MCP tool-client reliability repair: stale remote MCP sessions currently leave later tool calls failing until daemon restart. Labels aligned as bug, risk: high, size: M, tool, tool:mcp, needs-author-action. Milestone v0.8.0.
refactor(zeroclaw-tools): extract duplicate domain/URL validation int… #7340 — refactor(zeroclaw-tools): extract duplicate domain/URL validation into shared guard. REVIEW_REQUIRED at 1428cf2; BLOCKED by review state. Centralizes network-tool allowlist/private-host validation for browser/http_request/web_fetch and fixes unmatched IPv6 bracket rejection. Labels aligned as risk: high, size: L, tool, tool:browser, tool:web. Milestone v0.8.0 as earliest open milestone for refactor/security-hardening work with no tighter active lane.
refactor(api): move HookHandler trait and HookResult to zeroclaw-api #7411 - refactor(api): move HookHandler trait and HookResult to zeroclaw-api. Merged as 9ad397bf8b1450b21e2a7ffc5de7c700c36d021f. Moves the hook abstraction from zeroclaw-runtime into zeroclaw-api while preserving zeroclaw_runtime::hooks::{HookHandler, HookResult} via re-export; matches FND-001 dependency direction for shared API traits. Labels aligned as risk: low, size: XS, runtime. Milestone v0.8.0.
docs(reference): add feature support matrix #6870 — docs(reference): add feature support matrix. APPROVED by @singlerider, still draft, branch behind master but not reported as conflicting in the review. Dan-owned branch; needs normal draft/branch refresh before merge consideration. Milestone v0.8.0.
Draft:fix(agent): use per-agent provider runtime options instead of first model provider #6887 — Draft:fix(agent): use per-agent provider runtime options instead of first model provider. CHANGES_REQUESTED by @Audacity88; stale-candidate, waiting on author response by June 16. Author action needed to keep llm_task provider identity/options coupled, resolve delegate runtime options from the target agent, and refresh PR body metadata/validation. Milestone v0.8.0.
fix(shell): prevent hang when grandchild processes inherit pipe handles #6910 — fix(shell): prevent hang when grandchild processes inherit pipe handles. CHANGES_REQUESTED by @Audacity88; stale-candidate, waiting on author response by June 16. Author action needed to keep the inherited-grandchild-handle fix while draining stdout/stderr concurrently with child wait, plus regression coverage for large-output pipe-buffer deadlock and the inherited-handle case if portable. Milestone v0.8.0.
fix(channels/whatsapp-web): pass LID JIDs unchanged to whatsapp-rust 0.6+ #6973 — fix(channels/whatsapp-web): pass LID JIDs unchanged to whatsapp-rust 0.6+. Merged as 206ac23cce0a964b734868ff97e0e9c57eb42224. Passes LID JIDs through unchanged for inbound/outbound reply routing now that whatsapp-rust 0.6+ handles namespace conversion internally, and rolls the dependency family forward for the upstream LID namespace fix. Milestone v0.8.0.
fix(config): restore 1Password op secret refs #7085 — fix(config): restore 1Password op:// secret refs. APPROVED by @singlerider at 99df744 after @Audacity88's blocker fix and master refresh; clean/mergeable with checks green. Merge-ready. Restores external secret-reference resolution/preservation for config secret fields. Milestone v0.8.0.
docs(readme): fix broken providers routing doc link #7185 — docs(readme): fix broken providers routing doc link. REVIEW_REQUIRED, clean/mergeable, all visible checks green. README provider routing link now targets the canonical docs/book/src/providers/routing.md page instead of missing fallback-and-routing.md. Milestone v0.8.0.
docs(esp32-ui): fix hardware design doc link to mdbook path #7186 — docs(esp32-ui): fix hardware design doc link to mdBook path. REVIEW_REQUIRED, clean/mergeable, all visible checks green. @WareWolf-MoonWall's duplicate-state blocker appears to be based on untracked local copies; the author replied with git ls-files evidence that only firmware/esp32-ui/README.md is tracked. Waiting on reviewer re-check/dismissal. Milestone v0.8.0.
fix(web): correct chat model switcher resolution and switch timeout #7191 — fix(web): correct chat model switcher resolution and switch timeout. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Fixes agent-scoped status/model switch resolution and separates config-write vs reconnect timeouts in the web chat model switcher. Milestone v0.8.0.
fix(tools/calculator): reject factorial inputs above the u128-safe max #7206 — fix(tools/calculator): reject factorial inputs above the u128-safe max. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Bounds calculator factorial input before the u128 path can overflow. Milestone v0.8.0.
fix(cron): correct weekday range normalization for Sunday-alias endpoints #7208 — fix(cron): correct weekday range normalization for Sunday-alias endpoints. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Fixes cron weekday range normalization for Sunday alias boundaries in crates/zeroclaw-runtime/src/cron/schedule.rs. Milestone v0.8.0.
fix(config): warn on provider entries with silently dropped flattened fields #7216 — fix(config): warn on provider entries with silently dropped flattened fields. CHANGES_REQUESTED by @singlerider at f349d62; dirty/conflicting, with Format and CI Required Gate red. Author action needed to key detection off the raw/user-written nested provider shape instead of default endpoint URI values, then add validate() warning/no-warning regression tests. Milestone v0.8.0.
feat(runtime,parser): reinforce tool formatting prompts and add robust JSON fallback parser for file_write #7244 — feat(runtime,parser): reinforce tool formatting prompts and add robust JSON fallback parser for file_write. CHANGES_REQUESTED by @WareWolf-MoonWall and @Audacity88 at 10ebf5e; mergeable but BLOCKED, with title, Lint, and CI Required Gate red. Author action needed to fix the title/lint/scope blockers, remove or justify unrelated provider changes, make malformed parser recovery UTF-8 safe, and keep or explain the anti-meta prompt guard change. Milestone v0.8.0.
chore(release): release v0.8.0 #7364 — chore(release): release v0.8.0. REVIEW_REQUIRED, MERGEABLE, no longer draft. The release PR is the closing gate for this tracker.
fix(config): salvage valid provider aliases instead of dropping all of [providers] #7491 — fix(config): salvage valid provider aliases instead of dropping all of [providers]. REVIEW_REQUIRED, MERGEABLE. Extends migrate_to_current_salvaged per-alias pruning to providers so one malformed provider entry no longer drops the whole [providers] table. Labels bug, risk: medium, size: S, config. Milestone v0.8.0.
ci(actions): summarize Rust cache diagnostics #7496 — ci(actions): summarize Rust cache diagnostics. APPROVED, CLEAN/mergeable, all visible checks green. Diagnostic-only feat(ci): improve cached Rust builds and CI critical path #7108 Quality Gate cache-evidence slice: lint/build summaries record rust-cache exact-hit state, cargo duration/status, workspace-path compile lines, total compile lines, and downloaded-crate lines while preserving cargo exit status. Labels type: ci, ci, risk: high, size: XS. Milestone v0.8.0.
fix(quickstart): fail fast when stdin is not a TTY instead of infinite redraw loop #7516 — fix(quickstart): fail fast when stdin is not a TTY instead of infinite redraw loop. @Audacity88 CHANGES_REQUESTED at c4b14a6; @WareWolf-MoonWall --comment at HEAD: two of three original blockers resolved (stderr TTY check, error message wording), two open blockers remain: (1) cli-quickstart-needs-tty Fluent key missing from es/fr/ja/zh-CN locale files; (2) Quality Gate/Format CI check failing (run cargo fmt --all). Author action needed before re-requesting review. Labels core, bug, risk: low, size: XS. Milestone v0.8.0.
fix(config): persist [[mcp.servers]] per-field edits via natural-key dirty-path walker #7519 — fix(config): persist [[mcp.servers]] per-field edits via natural-key dirty-path walker. CHANGES_REQUESTED by @JordanTheJet at 72121e9; CLEAN/mergeable, all 16 checks green. Repairs the persistence gap left by feat(config): per-field editing for [[mcp.servers]] via #[natural_key] #7267's per-field MCP editor: config/set on mcp.servers.. mutated memory (UI showed the new value) but the incremental save_dirty walker treated the [[mcp.servers]] array-of-tables as a plain table, so config.toml kept stale contents until restart. Adds a natural-key-aware writer branch plus 6 writer/dispatch regression tests. One 🔴 (resolve_dirty_segments_in is a verbatim copy of resolve_dirty_segments — delete the copy and reuse), one 🟡 (wrong-kind bail is silent; valid inline-array configs keep the original divergence symptom — WARN wanted), four 🔵. Author action needed on the 🔴, then quick re-review. Labels bug, risk: medium, size: L, docs, config, runtime, provider:kilo. Milestone v0.8.0 (reviewer-directed for the v0.8.0 release; break-fix routing agrees).
feat(cron): wire CLI delivery flags, clean envelope, add announce + bounds #5661 — feat(cron): wire CLI delivery flags, clean envelope, add announce + bounds. DIRTY/stale-candidate; CHANGES_REQUESTED remains active, but author addressed the original review items and @singlerider has been asked whether to refresh/take over or close/reinvite a fresh PR. Labels aligned as enhancement, risk: high, size: XL, core, cron, needs-author-action. Milestone v0.8.0.
feat(hooks): add on_before_compaction hook for pre-compression notification #6318 — feat(hooks): add on_before_compaction hook for pre-compression notification. DIRTY/stale-candidate; CHANGES_REQUESTED remains active on production hook wiring, workspace-relative bootstrap-file containment, read-error suppression, stale PR body fields, and bootstrap ordering. Labels aligned as enhancement, risk: high, size: S, agent, channel, config, runtime, needs-author-action. Milestone v0.8.0 as runtime/config stabilization work if maintainers still want this hook before the config/runtime boundary settles.
feat(cron): add suppress_if_contains to delivery config #6730 — feat(cron): add suppress_if_contains to delivery config. DIRTY/stale-candidate; CHANGES_REQUESTED remains active on blank sentinel validation, agent-only vs generic delivery semantics, and tool schema exposure/scope. Labels aligned as enhancement, risk: high, size: S, config, cron, gateway, runtime, tool, needs-author-action. Milestone v0.8.0.
Adjacent trackers (linked but separate, not v0.8.0 line-items):#6823 (TUI ACP Bridge) and #6825 (TUI UX) belong to the Zerocode/TUI track under #6826 per this tracker's scope rule, and are listed here only for visibility. They are not v0.8.0 release blockers unless a specific TUI item blocks the release itself.
Recent closures not previously listed (9 closed)
fix(channels): keep runtime reload defaults context-scoped #6905 - fix(channels): keep runtime reload defaults context-scoped. Merged as 09d23509be06af8294dd128285a11c071cf02f89. Runtime reload defaults stay scoped to the owning channel runtime context while preserving configured provider resolution. Milestone v0.8.0.
Every v0.8.0 PR is either merged, explicitly deferred, superseded, or still listed with a clear next action.
Config/schema/tool-call-parser Stable-tier blockers are closed or explicitly deferred before release.
Breaking or default-behavior changes include docs and changelog coverage.
Release/install feature-bundle decisions are explicit, especially where source builds, packaged builds, and docs could imply different defaults.
Adjacent work with its own tracker, such as Zerocode/TUI in [Tracker]: Zerocode #6826, stays linked but does not blur this release queue.
Architecture impact
This tracker does not make code changes. It coordinates work that may touch zeroclaw-config, zeroclaw-tool-call-parser, zeroclaw-runtime, zeroclaw-providers, zeroclaw-channels, zeroclaw-gateway, zeroclaw-tools, plugin host functions, release docs, and install/default feature guidance.
Risk and rollback
This is a tracker. Risk lives in the linked issues and PRs. If this grouping becomes stale, update the checklists, move items to a better tracker, or close this issue after the release queue is resolved.
Breaking change?
No. This issue tracks potentially breaking v0.8.0 work, but it does not itself change behavior.
Data hygiene checks
I removed personal/sensitive data from examples, payloads, and logs.
I used neutral, project-focused wording and placeholders.
Summary
Tracker for the v0.8.0 release line: config and tool-call-parser Stable-tier promotion, schema/config breaking-change cleanup, runtime/provider configuration correctness, and release-default decisions that must be settled before v0.8.0.
This issue is the milestone coordination home. It is not approval for every linked PR, and it should not replace the Project board. Each linked PR still needs its own review, labels, validation, docs, and merge-readiness checks.
Problem statement
The v0.8.0 milestone has a clear description and a large set of scoped issues, but it does not currently have a standalone release tracker. That makes it harder to answer the practical maintainer questions:
Governance also expects the next active release to have a visible milestone tracking issue. This issue fills that gap for v0.8.0.
Blockers (26; must close or defer before v0.8.0 stable)
These are the true release blockers, re-vetted 2026-06-11 against the bar "broken behavior that can confuse users": every remaining open
priority:p1/priority:p0defect plus the release gate. Demoted in that pass: #5849 (Dream Mode — feature, not a defect) and #6127 (internal gateway hardening follow-up to #6099; its PR #7419 is already milestoned v0.8.1) — both moved to v0.8.1 at p2. The parenthetical shows open-PR coverage from a live GitHub search; "no open PR" means no open PR reference was found and the item needs an owner or an explicit deferral. These items live only here, not in the full queue below.[autonomy] level = "full"— notool_dispatchever reaches the runtime #6434 — [Bug]: Shell tool calls are refused at[autonomy] level = "full". (p1; 1 open PR: fix(runtime/agent): authorize shell explicitly at autonomy.level=full (#6434) #6619)format!("{}.{}", ...)produces names violating^[a-zA-Z0-9_-]{1,128}$#6678 — [Bug]: Skill tools rejected by Anthropic API — provider tool names violate Anthropic's name regex. (p1; 1 open PR: fix(skills): sanitize skill tool names to satisfy provider name regex (#6678) #7399)port#7173 — [Bug]: quickstart channel webhook config does not offer port selection. (p1; 1 open PR: fix(quickstart): surface port field for webhook channel config #7215)custom.<alias>is invalid. (p1; 3 open PRs: fix(doctor): pass config context when validating custom model providers (#7439) #7485 approved, fix(config): fail loud on unknown provider families and correct stale section paths #7488, draft fix(doctor): validate custom model_provider entries against config, not legacy factory #7441)allowed_toolsdelegate semantics plus misleading comment cleanup; same-risk-profile delegation remains unchanged)Three blockers (#7042, #7462, and #7470) currently have no open PR reference; all other open blockers have at least one open PR.
Proposed use
Full queue (non-blockers)
Everything else tracked for v0.8.0: merged and closed history, p2 and unprioritized work, and the audit-added items. These are in scope for v0.8.0 but are not release blockers — the blocker line is the section above. Each item lives in exactly one place: blockers above, everything else here.
Current PR queue (170 total: 85 open, 85 closed)
Active v0.8.0 PRs (74 total: 8 open, 66 closed)
fix(tool): use codex exec subcommand instead of removed -q flag #5361 — fix(tool): use codex exec subcommand instead of removed -q flag. Merged ✅ as e3759c8. Closes codex_cli tool passes unsupported
-qflag to Codex CLI v0.118.0 #5360. Refresh landed the old Codex CLI compatibility fix against current master, preserved the operator-controlledextra_argstrust-boundary warning, keptextra_argsdefaulting to[], and left Track: evaluateextra_argsvalidation / allowlist for security-affecting Codex CLI flags #5842 as the focused follow-up for warning-only validation of known security-affecting flags; Track: evaluateextra_argsvalidation / allowlist for security-affecting Codex CLI flags #5842 is now tracked in v0.8.1 after the maintainer scope pass.fix(skills): keep blank lines inside SKILL.md block-scalar descriptions #7196 — fix(skills): keep blank lines inside SKILL.md block-scalar descriptions. Merged ✅ as 667a60c. Approved by @WareWolf-MoonWall and @Audacity88 at d19438f; CI green, clean/approved, with @JordanTheJet still requested. Fixes a lightweight frontmatter parser bug where blank lines inside folded/literal SKILL.md description blocks truncated discovery text before later paragraphs. Adds regression coverage for both multi-paragraph block scalars and real next-key termination. Labels/milestone aligned as bug, risk: low, size: XS, runtime, skills; milestone v0.8.0.
fix(web): bump react-router to 7.16.0 to clear 5 advisories #7198 — fix(web): bump react-router to 7.16.0 to clear 5 advisories. Merged ✅ as 6cc84db. Bumped
react-router-domandreact-routerfrom 7.13.0 to 7.16.0 and raised the declaredweb/package.jsonrange to^7.16.0, making it the preferred landing PR over duplicate Dependabot chore(deps): bump react-router and react-router-dom in /web #7174. Duplicate chore(deps): bump react-router and react-router-dom in /web #7174 closed as superseded.feat(channels): per-recipient reply pacing across 9 channels #6389 — feat(channels): per-recipient reply pacing across 9 channels. Merged ✅ as ad694e6, closing [Feature]: Per-channel reply-min-interval-secs (throttle outbound agent replies) #6345. Adds
reply_min_interval_secs+reply_queue_depth_maxto 9 channel configs.PacedChannelimplements per-(channel, recipient) FIFO scheduling with LRU cap, bounded newest-drop overflow, redacted-recipient WARN logging, and idle recipient cleanup. Integration tests cover Telegram and WhatsApp Web recipient shapes. Docs inchat-others.md.fix(zerocode): graceful in-loop daemon reconnect and recovery #7158 — fix(zerocode): graceful in-loop daemon reconnect and recovery. Merged ✅ as a486993. Approved by @WareWolf-MoonWall at
6bdb607; CI green, mergeable. Fixes [Bug]: TUI (zerocode) freezes entirely when daemon disconnects #7125 and [Bug]: zerocode TUI never reconnects after daemon close; UI wedges (and stops redrawing under tiling WMs) #7043 (daemon disconnect froze TUI, reconnect discarded recovered client). Moves reconnection into event loop, respawns ephemeral daemon once, rebuilds panes with fresh notification channels.fix(config): avoid char-boundary panic in attached short-option parsing #7154 — fix(config): avoid char-boundary panic in attached short-option parsing. Merged ✅ as 9c6f34f. Approved by @WareWolf-MoonWall at
8b8ee20; CI green, mergeable. Converts daemon-killing UTF-8 char-boundary slice panic to safeOptionreturn. Replaces unsafe byte slice with char-boundary-safe iterator.fix(i18n): add missing agent translation keys for 30 non-English languages #7140 — fix(i18n): add missing agent translation keys for 30 non-English languages. Reviewed by @WareWolf-MoonWall at
9246f29(--comment); @singlerider CHANGES_REQUESTED active on PR description/scope mismatch and 30-language addition. Addresses [Bug] i18n: missing translation keys for chat toolbar buttons (clear_all, compact_mode, tool_activity_*, running, stop, delete_message) #7139 (missing toolbar translations). Author action needed.fix(docs): keep _shared chrome master-owned and retrofit version selector #7124 — fix(docs): keep _shared chrome master-owned and retrofit version selector. Merged ✅ as 587cb1d. Approved by @WareWolf-MoonWall at
496fe4c; CI green, mergeable. Addresses versioned-docs _shared chrome ownership split (feat(docs): implement versioned documentation deployment and version … #7023 follow-up). Moves chrome master-of-truth back to main docs tree, retrofits version selector into versioned copies.fix(mcp): surface tool-execution errors (result.isError) instead of swallowing them #7122 — fix(mcp): surface tool-execution errors (
result.isError) instead of swallowing them. Merged asbfef8f05027650f460d227fcd159ea7387e117e5. Surfaces MCP tool-execution failures reported throughresult.isError, sanitizes and bounds server-provided details before logging/returning them, and adds focused regression coverage for error conversion, normal success, and fallback detail handling. Milestone v0.8.0.fix(shell): prevent interactive subprocesses from hijacking the terminal #7120 — fix(shell): prevent interactive subprocesses from hijacking the terminal. Merged ✅ as 96db39f. Approved by @WareWolf-MoonWall, @tidux, and @Audacity88 at
0604c00; still draft, clean/mergeable, no review requests, and current Quality Gate jobs green. Closes the shell/git terminal-prompt bleed by giving the runtime shell spawn null stdin and settingGIT_TERMINAL_PROMPT=0in the shared git helper. Residual direct/dev/tty/ session-isolation hardening is documented as follow-up, not a blocker for this PR.docs(channels): add feature-availability notes for lean default bundle #7115 — docs(channels): add feature-availability notes for lean default bundle. Merged ✅ as a04bd2b. Closes docs gap from Twitter/X channel not available in pre-built binary despite channel-twitter feature existing #7069 (user expected social channels in prebuilt binary but they're opt-in post-feat(channels): define lean default channel bundle #6904). Adds feature-availability callout to social.md, fixes Windows setup.bat descriptions for lean default bundle composition.
ci(actions): split format gate from lint #7111 — ci(actions): split format gate from lint. Merged ✅ as 631ccc6. Approved by @WareWolf-MoonWall and @singlerider at
e01cf6f; CI green, mergeable once the stale failed title-validation run from before the title cleanup is cleared. Splits cheapfmtfromlint, fans build/check/test/security out after formatting, keepsCI Required Gatedependent on every required job, and updates FND-004 plus the maintainer CI guide.docs(container): add Podman quadlets and macOS runtime guidance #7114 — docs(container): add Podman + systemd quadlet section. Approved ✅ by Audacity88; docs-only Podman/macOS container guidance, green checks, milestone v0.8.0.
fix(ollama): keep structured tools prompt-guided #7095 — fix(ollama): keep structured tools prompt-guided. Merged ✅ as f992d42. Closed [Bug]: Ollama Provider call failed when tools are needed #5962 and supersedes fix(ollama): avoid native tool payload on fallback path #6029. Keeps structured Ollama tool requests on the prompt-guided protocol instead of sending native Ollama tools payloads from a provider that advertises native tools as unsupported.
fix(ollama): restore compiling master build #7231 — fix(ollama): restore Option temperature in chat(). Merged ✅ as 746c616. Approved by @JordanTheJet, @tidux, and @theonlyhennygod at 42dbcf0; mergeable. Reverts the E0308 build-breaker fix(ollama): keep structured tools prompt-guided #7095 introduced by shadowing
chat()'stemperature: Option<f64>parameter into a baref64viaunwrap_or(default_temperature()), which brokecargo buildon master for source installs. One-line removal restores theOption<f64>pass-through (matching the file's three othersend_requestcallers);Nonedefers to Ollama's native model default downstream inbuild_chat_request_with_think— no behavioural loss vs. the last release. Build/Check/Test/Security/Format green; theLintgate (clippy --all-targets) is red on the pre-existingtokio::spawndisallowed-method debt atollama.rs:1270(test module, already on master, not introduced here) — tracked separately, not a blocker on this diff's correctness.fix(cli): make persist the model in config #7094 — fix(cli): make
models setpersist the model in config. CHANGES_REQUESTED by @Audacity88 at24dcece; now dirty/conflicting. Earlier @WareWolf-MoonWall stale-helper and typed-path blockers are resolved; author action needed: add focused regression coverage forzeroclaw models setpersistence and slash-bearing model IDs from bug(cli):zeroclaw models setfalls through to model doctor instead of saving config #7087, update validation/template evidence, and refresh the branch.fix(channels): include Twitter/X channel in default features #7070 — Twitter/X default-channel bundle change. Resolved by closing the PR: source/default builds keep Twitter/X opt-in post-feat(channels): define lean default channel bundle #6904, with install guidance pointing users to
channels-full/channel-twitter. PR closed, no default-bundle change landed.feat(memory): migrate Agent::turn load_context to MemoryStrategy #7053 — MemoryStrategy migration for
Agent::turnload-context path. Merged ✅ as a1b641e.feat(docs): implement versioned documentation deployment and version … #7023 — versioned documentation deployment; changes requested.
feat(memory): add dream mode for periodic memory consolidation #6693 — Dream Mode periodic memory consolidation; changes requested and needs refresh/split before normal merge review.
fix(config): classify credential-shaped config surfaces #6982 — classify credential-shaped config surfaces (RFC: Security UX, runtime credential boundaries, and isolation defaults #6971/bug(config): redact nested secrets in object-array property displays #6978). Merged ✅ as 08e2ba3. Credential classification now derives from the schema via
#[credential_class](parallel registry removed). Approved by @singlerider and @WareWolf-MoonWall at8219a5c9b; CI green before merge. RFC: Security UX, runtime credential boundaries, and isolation defaults #6971 and bug(config): redact nested secrets in object-array property displays #6978 remain open for broader RFC and nested object-array redaction follow-through.fix(channels): preserve Discord audio fallback #7086 — preserve Discord audio fallback when transcription fails or returns empty. Merged ✅ as 8d003f9. Preserves failed or blank Discord audio transcription as
[AUDIO:...]media fallback instead of silently dropping the attachment.docs(providers): add OpenAI Codex over a ChatGPT subscription #7116 — docs(providers): add OpenAI Codex over a ChatGPT subscription page. CHANGES_REQUESTED by @Audacity88 at
623948e; @singlerider's earlier template review is dismissed and @tidux approved the rewritten body. Author action needed to correct stale Codex billing/cost guidance, add a same-owner/private-channel boundary for rawauth.jsonsync, and fix or clarify the optionalaccount_idcurl example. Milestone v0.8.0.fix(config): resilient daemon config load with security-critical gating #7160 — resilient daemon config load with security-critical gating. Merged ✅ as bcfabfc. Earlier @WareWolf-MoonWall blocking findings (silent non-fatal load-error discard,
unwrap_or_default()escape hatch, field-load site vet) were resolved before merge.docs(setup): add FreeBSD setup guide + installable rc.d/jail dist files #7161 — docs(setup): add FreeBSD setup guide + installable rc.d/jail dist files. Merged ✅ as
95c5e7e. Adds FreeBSD setup docs plus installable rc.d/jail dist files; maintainer cleanup before approval aligned body label/rollback fields and removed generated-tool attribution from the contributor branch tip. Milestone v0.8.0.fix(cron): diagnose past at schedules #7165 — fix(cron): diagnose past
atschedules. Merged ✅ as 1330ea9. Keeps the existing rejection behavior for past one-shotatschedules but addsnow_utc,now_local,at_utc,at_local, anddelta_secondsto the user-visiblecron_adderror so stale timestamps can be distinguished from timezone or host-clock issues. Regression test exercises thecron_addtool boundary; labels/body aligned asbug,risk: high,size: XS,cron,runtime. Milestone v0.8.0.feat(providers): add Kilo AI Gateway as first-class model provider with pricing capture #7136 — feat(providers): add Kilo AI Gateway as first-class model provider with pricing capture. Merged as
699d576e385a8180bc49b4d5855f238b1d8cdb2d. Adds the Kilo AI Gateway provider, config schema/factory registration, catalog/pricing plumbing, OpenRouter pricing preservation, and cost-rate editor pricing capture. Landed under v0.8.1 as an additive provider feature, not a v0.8.0 blocker.fix(tools): fail loudly when file_write targets an ephemeral workspace #7129 - fix(tools): fail loudly when file_write targets an ephemeral workspace. Merged as
801560799d0ba0507eb8937c7773ce498070e248, closing [Bug]: file_write tool silently fails — written files are invisible on the host filesystem #4627. The landed scope covers the reported Docker no-mount workspace surfaces:file_writerefuses, whileshell,file_read,file_edit,file_download, andimage_genattach the shared ephemeral-workspace warning where blocking would be too blunt. Milestone v0.8.0.fix(qq): restore audio attachment transcription #7109 — fix(qq): restore audio attachment transcription. Merged ✅ as f8641d2. Approved by @singlerider at
5097bb5; CI green, mergeable, no open threads. Re-applies feat(qq): add TranscriptionManager wiring for audio attachments #4315 for audit: track 153 commits lost in bulk revert c3ff635 for recovery #6074 (QQ voice attachments without platformasr_refer_textnow fall back to provider transcription). Wires the existingTranscriptionManagerinto QQ channel construction viawith_transcription, sole-provider binding matching thetelegram.rschannel-direct pattern; reuses downloaded bytes for the fallback and normalizes extensionlessvoice_wav_urlto.wav. Two regression tests cover fallback-fires and platform-ASR-wins paths. One 🟢 on record:QQ_MAX_AUDIO_TRANSCRIPTION_BYTES(25 MB) duplicates the manager's existingMAX_AUDIO_BYTEScap — redundant early reject, non-blocking.fix(matrix): no-op reaction removal when acks disabled #7183 — fix(matrix): no-op reaction removal when acks disabled. Merged ✅ as 2786cec. Approved by @singlerider at
eadf602; CI green (13/13), mergeable, no open threads. Follow-up to [Feature]: Add config option to disable channel ack reactions (👀/✅) #3403 (closed feature that addedack_reactionsbut wired the guard only intoadd_reaction, missingremove_reaction). Adds the byte-for-byte-symmetricif !self.ack_reactions { return Ok(()); }toremove_reactionso with acks disabled it short-circuits beforeensure_client()/ event-id parse instead of doing redaction work for a reaction that was never sent.self.ack_reactionsis the resolved bool (matrix.rs:3186,unwrap_or(true)+.with_ack_reactionsoverride). Regression test usesSome(false)+ invalid room/event IDs proving the return precedes parsing. Defaultack_reactions = truepath untouched. 🟢 body saysrisk: lowbut applied labelrisk: mediumis correct — no action.fix(cron): support relative after schedules #7188 — fix(cron): support relative after schedules. Merged ✅ as 5c027b6. Adds
schedule={"kind":"after","after_seconds":...}tocron_addfor relative one-shot reminders, resolves the delay at tool execution time, and persists the job as the existingSchedule::Atshape. Keepsdelete_after_rundefaulting to true for one-shotat/afterschedules. Merge-readiness check covered current-master same-file drift from fix(cron): diagnose past at schedules #7165: focused merged-resultzeroclaw-runtime cron_addvalidation passed with 27 tests, including both the past-atdiagnostics and relative-aftercases. Labels/body aligned asbug,risk: high,size: S,cron,runtime,tool. Milestone v0.8.0.fix(memory): honor recall since/until window for markdown entries #7192 — fix(memory): honor recall since/until window for markdown entries. Merged ✅ as a987acd. Approved by @Audacity88 at
4820ad4; CI green, clean/mergeable, no open review requests. Fixes markdown-backed recall bounds that previously parsed dailyYYYY-MM-DDfile stems only as RFC3339, so out-of-window daily entries could survive bounded recall. Adds day-granularity filtering for daily stems while keeping non-dateMEMORY.mdcore memories evergreen. VERIFIED: the reviewedmarkdown.rspatch is unchanged from the approved2f8a510head after the master merge, GitHub live diff is still one file,git diff --checkis clean, and CI Required Gate is green on current head. Labels/body aligned asbug,risk: medium,size: S,memory. Milestone v0.8.0.fix(cron): block scheduler mutation tools in agent jobs #7189 — fix(cron): block scheduler mutation tools in agent jobs. Merged ✅ as bb406bd. Approved by @singlerider and @Audacity88 at
fee76bd; CI green (13/13), clean/mergeable, no open threads or review requests. Security narrowing (Related feat: enforce allowed_tools / denied_tools in main agent loop #6914): cron-launched agent jobs now derive a run-timeSecurityPolicythat excludescron_add/cron_update/cron_remove/cron_run/scheduleby default unless the job sets explicitallowed_tools, so a scheduled job can't self-schedule/recurse/mutate scheduler state.cron_agent_run_security_policyonly fires forJobType::Agent+allowed_tools.is_none(); appends toexcluded_tools(deduped), wrapped in a freshArc(doesn't mutate shared ctx.policy). VERIFIED: all 5 names matchTool::name()exactly (no drift);is_tool_allowed = allowed && !excluded(policy.rs:263) hard-overrides allowlist; omittedcron_list/cron_runsare read-only (correct for a mutation guard);scheduleis one tool covering all mutating actions. Tests cover default-exclusion + explicit-opt-in + schema-doc sync. 🟢 on record:CRON_AGENT_DEFAULT_EXCLUDED_TOOLShardcoded not derived — drift risk if a 6th mutator added; suggested future enumeration test. Non-blocking.fix(config): default webhook channel port to 8090 #7193 — fix(config): default webhook channel port to 8090. Merged ✅ as 91cf0ca. Approved by @singlerider; CI green (13/13), mergeable, no open threads. Adds
#[serde(default = "default_webhook_channel_port")]toWebhookConfig.port(schema.rs:11164) so a[channels_config.webhook]block withoutportloads with 8090 instead of failingmissing field portand blockingzeroclaw agent. VERIFIED: 8090 matches docs webhook.md:12 exactly; DRY-checked — existingdefault_webhook_port()(scattered_types.rs:655) is private + serves a different field (VoiceCall webhook_port), so the new distinct helper is correct, not forbidden duplication. Test deserializes{}→ port==8090; existing explicit-port tests untouched. 🟢 body says risk:low but applied risk:medium correct — no action. 1 file +11/−0, no bot attribution. Milestone v0.8.0 (break-fix, no scope match → earliest open).docs(reference): document ZEROCLAW_DATA_DIR in bootstrap env vars #7201 — docs(reference): document ZEROCLAW_DATA_DIR in bootstrap env vars. Merged ✅ as f7e28bb. Approved by @singlerider; CI green (13/13), no open threads. Docs-only +4/−3 (env-vars.md). Corrects a stale section that documented only 2 vars and presented deprecated
ZEROCLAW_WORKSPACEas first-class. VERIFIED line-by-line againstresolve_runtime_config_dirs(schema.rs): strict precedenceCONFIG_DIR(13973) >DATA_DIR(14016) >WORKSPACE(14038), each branchreturn Ok(first-set wins, rest WARN-ignored);DATA_DIRcanonical +WORKSPACEdeprecated confirmed by WARN at 14045;CONFIG_DIR"takes precedence / pins both" matches WARN at 13988. Only other non-test reader is i18n.rs:290 (reads CONFIG_DIR only — consistent). No bot attribution. Milestone v0.8.0 (docs route like break-fix, no scope match → earliest open).docs(i18n): translate sidebar parent sections #7202 — docs(i18n): translate sidebar parent sections. Merged ✅ as a713fc9. Approved by @singlerider; CI green (14/14), mergeable, no open threads. Docs/i18n +640/−25, 10 files (SUMMARY.md + 5 new index.md hubs + 4 .po). Replaces empty
[Label]()parent links (untranslatable by mdBook) with real targets: sections with existing Overview child promote parent→overview + drop dup child row; sections without a landing page get new index.md hub. VERIFIED: all 18 parent-link targets resolve, 0 empty]()links remain, no orphaned pages; all 4 .po have identical 36 new msgids;msgfmt --check-formatpasses all 4; CJK genuinely translated (チャンネルと連携/频道与集成 etc.), markdown link paths preserved + labels localized; 5 hub pages real content not stubs. Disclosed unclosed-tag warnings (subagents.md/cli.md/cost-tracking.md) pre-existing — PR touches none. No bot attribution. Milestone v0.8.0.docs(providers): fix stale code reference in streaming.md #7204 — docs(providers): fix stale code reference in streaming.md. Merged ✅ as 0c15b14. Approved by @singlerider; CI green (13/13), no open threads. Docs-only +1/−1 (streaming.md Code references list). VERIFIED vs master: old ref
provider.rsis GONE (genuinely stale); new refmodel_provider.rshasStreamEventenum (L229) +ModelProvidertrait (L367) exactly; rename complete (no straypub trait Providerin zeroclaw-api, so old bullet wrong on both path AND name); other 3 refs (compatible/anthropic/ollama .rs) still resolve, correctly unchanged. No bot attribution. Milestone v0.8.0.docs(maintainers): correct zerocode locale resolution to the single file it reads #7205 — docs(maintainers): correct zerocode locale resolution to the single file it reads. Merged ✅ as e0a709c. Approved by @singlerider; CI green (13/13), no open threads. Docs-only +1/−1 (docs-and-translations.md "Locale resolution"). VERIFIED vs master apps/zerocode/src/i18n.rs:
detect_locale()(L54) =locale_from_config().unwrap_or_else(|| "en")→ SINGLE file readzerocode-config.toml(L160), no 4-path walk (old doc stale); config_dir precedence--config-dir→ZEROCLAW_CONFIG_DIR→~/.zeroclawmatches config_dir()(L131); en fallback ✓; "decoupled from daemon" confirmed by source comment L146-150 (old multi-path walk deliberately removed — writer never touched those paths). Old "matches the daemon" claim was misleading; removal correct. No bot attribution. Milestone v0.8.0.fix(tools): fix Claude Code execution on Windows #7214 — fix(tools): fix Claude Code execution on Windows. CHANGES_REQUESTED by @Audacity88 at
3e2b669; non-draft, blocked on review, milestone v0.8.0, labels bug, risk: high, size: XS, tool. Direction is right and preserves the allowlisted subprocess environment, but author action needed: add focused regression coverage for Windows verbatim-path cleanup and required Windows env allowlist entries, then clarify whetherclaude_code_runneris intentionally Unix/WSL-only or should receive the same Windows binary/env treatment.fix(gateway): clear backend history on "Clear all" + don't resurrect deleted session #7222 — fix(gateway): clear backend history on "Clear all" + don't resurrect deleted session. Merged ✅ as 7048200. Approved by @WareWolf-MoonWall and @Audacity88 at c2a0df0; CI green, clean/mergeable. Closes [Bug]: Web UI "Clear all" only wipes rendered messages, not the backend session history #7126. Fixes the Web UI Clear all data-retention bug by calling the existing session delete endpoint, reconnecting the WebSocket so the gateway builds a fresh agent, and guarding post-turn/cancel persistence so late gateway writes cannot recreate a deleted session. Labels/body aligned as bug, risk: high, size: M, gateway, tool, web. Milestone v0.8.0.
fix(runtime): deliver only final assistant turn to channels #7239 — fix(runtime): deliver only final assistant turn to channels. Merged as the narrow runtime fix superseding fix(runtime): deliver only final assistant turn's content to channels #6922; Telegram channel can receive Codex scratchpad/tool transcript as final response #7068 is closed. [Feature]: cron
delivery.mode = "announce"— option to send only the final assistant message, not every intermediate text turn #6510 remains open for the separate cron delivery configuration question.fix(channels/whatsapp-web): treat replies to bot as mentions #7226 — fix(channels/whatsapp-web): treat replies to bot as mentions. Approved by @singlerider at
6a27d83; mergeable, no open threads. Closes [Bug]: WhatsApp Web mention_only ignores replies to the bot in group chats #7225 (mention_only ignored replies to bot in groups). +117/−14, 1 file. Addsis_reply_to_botreadingcontext_info.participant(quoted author) via same get_base_message→extended_text→context_info chain as provenextract_mentioned_jids; composes mention-or-reply inis_message_addressed_to_bot.jid_matches_botextraction is byte-identical dedup of inlined mention logic (no behavior change). VERIFIED: built--features whatsapp-web(applied fix(providers): fixes use of f64 after signature change #7213 one-liner locally as author disclosed), all 4 new tests pass (phone-JID/LID-JID accept, other-participant reject, explicit-mention-in-other-reply accept); fmt clean on diff. CI red (10 jobs) is PRE-EXISTING ollama.rs:1058 E0308 (fix(providers): fixes use of f64 after signature change #7213/fix(ollama): restore compiling master build #7231), not this diff — author honestly disclosed in body+comment, kept provider fix out. Label fix: added bug+size:S+risk:medium (path-labeler only set channel ones). Milestone v0.8.1 (merged; milestone label is v0.8.1, not v0.8.0).fix(security): create per-agent workspace dir in for_agent (+ Android shell support) #7284 — fix(security): create per-agent workspace dir in
SecurityPolicy::for_agent(+ Android shell support). CHANGES_REQUESTED by @singlerider at4b2d07e(supersedes @theonlyhennygod's earlier approval at c19c30a); @Audacity88 reviewed current head with comments. Author action needed. Fixes a fresh-agent regression:for_agentresolved the per-agent workspace (agents/<alias>/workspace/) — the shell tool spawn cwd + file-tool jail root — but never created it, so the agent-loop/CLI/gateway/channel policy-build paths left it missing and the first shell command died atposix_spawnwith ENOENT (onlyAgent::from_config*had created it, so daemon/ACP worked while loop/CLI did not).create_dir_allat thefor_agentchokepoint (policy.rs:2405) covers every path; idempotent, warn-and-continue on failure. Second commit adds runtime-detected Android shell support (absolute/system/bin/sh+/system/bin:/system/xbinPATH prepend, gated on/system/bin/shexistence) — no-op off-Android, runs aftervalidate_command_executionso it does not widen the allowlist; verified on Galaxy S21 (A15) + OPPO CPH2305 (A16). VERIFIED against local source. One 🟡 non-blocking: no regression test asserts the dir creation (existingfor_agenttests exercise the path but do not checkis_dir()). Milestone v0.8.0 (break-fix, no scope match → earliest open).fix(config): stamp schema_version on incremental saves #7274 — fix(config): stamp
schema_versionon incremental saves. Merged ✅ as 56def6e. Approved by @Audacity88 at 812603a; CI green, clean/mergeable, with @singlerider still requested. Fixes [Bug]: Config writer leaves stale schema_version on partial saves → V3-bodied/schema-2 configs crash older binaries with opaque "missing field provider" #7271. StampsCURRENT_SCHEMA_VERSIONin both full and incremental config saves so current-schema writes cannot leave stale body-newer-than-label files. Regression coverage seedsschema_version = 2, performssave_dirty, verifies the stale label is overwritten, the dirty value lands, and the schema key stays first. Labels/body aligned asbug,risk: medium,size: XS,config,config: core. Milestone v0.8.0.fix(docs): clean up docs build warning noise #7276 — fix(docs): clean up docs build warning noise. Merged ✅ as 15320e0. Approved by @WareWolf-MoonWall and @Audacity88 at 5b9ba21; CI restarted after the latest merge-from-master refresh and is still pending; clean/mergeable, with @singlerider and @JordanTheJet still requested. Closes bug(docs): clean up docs build warning noise #7269. Eliminates rustdoc/mdBook warning noise across broken/private intra-doc links, invalid placeholder tags, one redundant explicit link, and generated CLI-reference placeholders. Audacity88 re-reviewed the earlier over-escaped placeholder blocker and confirmed the current diff keeps placeholders readable in code spans without behavior, config, or API changes. Labels/body aligned as
bug,size: S,risk: low,docs, plus auto scope labels. Milestone v0.8.0.fix(channels/telegram): clamp zero draft update interval #7334 — fix(channels/telegram): clamp zero draft update interval. Merged ✅ as 8179a16. Approved by @Audacity88 at
8d99710; CI green, clean/mergeable, with @singlerider still requested. Closes [Bug]: Telegram partial streaming accepts zero draft update interval and floods edits #7332. Mapsdraft_update_interval_ms = 0back toTELEGRAM_DRAFT_UPDATE_INTERVAL_MSso Telegram partial streaming keeps its draft-edit throttle instead of attempting one edit per streamed delta; non-zero intervals remain unchanged. Regression coverage includes zero-fallback, existing750non-zero preservation, and nearby draft-update rate-limit / UTF-8 truncation tests. Labels aligned asbug,risk: medium,size: XS,channel,channel:telegram. Milestone v0.8.0.docs(maintainers): define issue ownership path #7011 — docs(maintainers): define issue ownership path. Merged ✅ as 6d73991. Approved by @WareWolf-MoonWall at 97d76ba and @theonlyhennygod; CI green (13/13), clean/mergeable, no open threads. Docs-only +52/−13, 6 files (pr-workflow.md, labels.md, reviewer-playbook.md, fnd-003-governance.md, project-board-contract.json, triage-protocol.md). Related RFC: Work Lanes, Board Automation, and Label Cleanup #6808. Adds a canonical
### Issue ownership pathsection to pr-workflow.md distinguishing active assignees from area stewards (the issue-side analogue to CODEOWNERS) and tightensstatus:no-staleto require a contributor-visible reason plus an active owner or steward path; every other file links back to the single section rather than restating it, andproject-board-contract.jsonrenamesactive_owner→owner_pathto match. Non-breaking rollout: existing exemptions missing those facts become audit findings for the later stale-exemption repair packet, not automatic stale closures. VERIFIED both new inbound anchors (#project-board-contract,#issue-ownership-path) resolve against local pr-workflow.md (docs links gate ran lychee offline, Total 0, so checked by hand). Two 🔵 left for author (labels.md anchor consistency — seconds @WareWolf-MoonWall and sharpens which link to repoint; triage-protocol "Project board contract" link ambiguity). No bot attribution. Milestone v0.8.0 (docs route like break-fix, no scope match → earliest open).fix(cli): print model names in 'zeroclaw models list' output #7346 — fix(cli): print model names in
zeroclaw models listoutput. Merged ✅ as 526b328. Approved by @theonlyhennygod at 8c74201; with @Audacity88 and @WareWolf-MoonWall still requested. +12/−6, 2 files (crates/zeroclaw-runtime/src/doctor/mod.rs, src/main.rs).models listonly printed per-provider counts; now prints each resolved model name under its provider via ashow_model_namesflag onrun_models—trueformodels list,falseformodels refreshand the doctor health path. VERIFIED:list_models()returnsVec<String>so{}prints the model name; bothrun_modelscall sites updated (no other callers); flag gating correct. CI green (run predates the orchestrator master break, so a rebase/re-run may surface the unrelated #15443 red until that lands). Output-only — corrected autorisk: high→risk: low(+risk: manual). One 🔵 non-blocking (no test pins the new branch; print path not test-structured today). Milestone v0.8.0 (break-fixfix(cli):+bug, no scope match → earliest open).fix(zerocode): size quickstart modals by wrapped row height #7360 — fix(zerocode): size quickstart modals by wrapped row height. Merged ✅ as 8a8357a. Approved by @theonlyhennygod at 6d5b8a7; with @WareWolf-MoonWall still requested. Closes [Bug]: Quickstart modal clips wrapped rows — YOLO risk option and model picker fall off-screen #7359. +125/−25, 1 file (apps/zerocode/src/quickstart_pane.rs). The Quickstart
draw_modalsized the box from logicalbody_lines.len()and scrolled by logical line index, ignoring theWrap { trim: false }the body renders with — so wrapped picker blurbs hid theyolorisk option and a long pastedapi_keypushed themodelpicker off-screen. Newwrapped_row_heights/wrapped_total(viaParagraph::line_count) size the box and drive cursor-tracking scroll in wrapped-row space; also repairs a latent unit bug (ratatuiParagraph::scrollcounts wrapped rows, old code fed it logical indices). Hit-test rects now span each row's full wrapped height. VERIFIED header + body both render withWrap { trim: false }so measurement matches paint. CI RED (Lint + Test) is a PRE-EXISTING master breakage, NOT this diff: orphaned test ctor atcrates/zeroclaw-channels/src/orchestrator/mod.rs:15443still sets removedChannelRuntimeContextfields (default_model_provider/api_key/api_url) vs the migratedmodel_provider_ref(confirmed on origin/master; ~30 other ctors updated, this one missed). One-line master fix unblocks; admin-merge candidate meanwhile. One 🟡 non-blocking: the scroll/visibility + hit-test fix itself isn't covered by a test (only the measurement helpers are). Milestone v0.8.0 (break-fixfix(zerocode):, no scope match → earliest open).fix(config): unbounded/yolo presets must allow what they advertise #7371 — fix(config): unbounded/yolo presets must allow what they advertise. Merged ✅ as 041ff36. Approved by @theonlyhennygod at 7a2ba9a; with @Audacity88 and @singlerider still requested. +67/−4, 2 files (crates/zeroclaw-config/src/presets.rs, schema.rs). Related fix(zerocode): repair Quickstart model-provider form UX defects #7330 (forces every Quickstart agent onto
unbounded). Two Quickstart presets used sentinel values meaning the opposite of intent, leaving a fresh agent dead on arrival: theunboundedruntime preset setmax_actions_per_hour: 0/max_cost_per_day_cents: 0— butPerSenderTracker::is_exhaustedtreats a max of 0 as always exhausted (policy.rs:144), so every tool call was rejected ("max 0 actions per hour"); theyolorisk preset setallowed_commands: vec![]— deny-by-default, so the command gate rejected evenls/pwd. Fixed tou32::MAXbudgets and the["*"]wildcard (which, withblock_high_risk_commands: false, hits the trusted-env early-return inis_command_allowed,policy.rs:1462). VERIFIED both enforcement primitives against local source; the0 = exhausted/ empty-allowlist-denies primitives are left intact (only the presets stop depending on them),rate_limit_zero_blocks_everythingstill passes. Two regression tests assert behaviour (policy built from each preset permits actions/commands), not literal values. Schema doc formax_actions_per_hourcorrected; the adjacentmax_tool_iterations"0 inherits" doc correctly left alone (that field genuinely falls back to a safe default,loop_.rs:1420). CI green (15/15). Two 🔵 non-blocking: themax_cost_per_day_centschange rides along untested (cost isn't enforced viais_exhausted— separateCostTracker/daily_limit_usd; its real effect is preventing spurious subagent escalation-subset rejection atpolicy.rs:2264);u32::MAX-as-unlimited sentinel flagged as a conscious team choice. Milestone v0.8.0 (break-fixfix(config):+bug, no scope match → earliest open).fix(runtime): guard trim_history against orphan-cascade emptying all messages #7403 — fix(runtime): guard
trim_historyagainst orphan-cascade emptying all messages. Merged ✅ as 42f6dee. Approved by Audacity88 at7e9e4a; CI green, clean/mergeable, no open review requests. Replaces fix(runtime): guard trim_history against orphan-cascade emptying all messages #7119's runtime slice after splitting the unrelated Matrix/syncfix to fix(channels): prevent Matrix /sync from timing out at exactly 30 seconds #7404. Adds atrim_historysafety guard for the full orphan-cascade case that would otherwise leave provider-visiblemessages: [], plus no-system and system-message regression tests pinning the temporary over-limit fallback. Labels/body aligned asbug,risk: high,size: XS,agent,runtime; supersede attribution for fix(runtime): guard trim_history against orphan-cascade emptying all messages #7119 included. Milestone v0.8.0.fix(matrix): isolate session state per channel alias and repair key backup with the configured key #7388 - fix(matrix): isolate session state per channel alias and repair key backup with the configured key. Merged as
d232951184f61688958eb72a6b6ddfd8495372bb, closing [Bug]: Multi-alias Matrix instances share one session store and clobber each other (wrong account on the wire); inconsistent key backup never repaired #6487. The landed fix gives each Matrix alias its own state directory, adds a foreign-session guard, and usesrecover_and_fix_backup(key)so key-backup inconsistency is repaired without rotating the configured recovery key. Milestone v0.8.0.docs(readme): update project banner #7396 - docs(readme): update project banner. Merged as
24662b591966bf37e9c3dd2dbdb41e4419e56e79, closing [Feature]: A better LOGO of Zeroclaw #4710. Replaces the README banner asset with the revised mascot plus original text styling and repo-relative asset path. Milestone v0.8.0.docs(maintainers): define tracker stale exemptions #7405 - docs(maintainers): define tracker stale exemptions. Merged as
218a62918cd37ef4746ece797a56efdaa1593219. Related RFC: Work Lanes, Board Automation, and Label Cleanup #6808; direct follow-up to docs(maintainers): define issue ownership path #7011. Defines the scoped stale-exemption default for active release trackers and active RFC/design trackers, with explicit revisit triggers. Milestone v0.8.0.fix(channel): restore WhatsApp interrupt_on_new_message #7040 — fix(channel): restore WhatsApp
interrupt_on_new_message. Approved by @singlerider at 131f182; CI green per body (8297 nextest + workspace clippy), clean/mergeable. Related audit: track 153 commits lost in bulk revert c3ff635 for recovery #6074, supersedes feat(channel): add interrupt_on_new_message support for WhatsApp #4371 by @tmigone (co-author trailer present). Restoresinterrupt_on_new_messageonWhatsAppConfig(defaultsfalse,#[serde(default)]keeps existing configs loading) and wires it into the orchestrator in-flight cancellation switch for both WhatsApp backends. The fix also collapses the five previously inline-duplicated per-channelget("default").is_some_and(...)reads (telegram/slack/discord/mattermost/matrix) instart_channelsinto oneinterrupt_on_new_message_config()constructor, then adds whatsapp through it — wiring site drops ~30 lines to one call. VERIFIED both backends emitchannel = "whatsapp"(whatsapp.rs:377 Cloud API, whatsapp_web.rs:975 Web) so the single"whatsapp" => self.whatsapparm covers both; behavior testmessage_dispatch_interrupts_in_flight_whatsapp_request_and_preserves_contextpins interrupt-and-preserve (one send carrying response-2, second provider call carries both user turns, cancelled turn persists no assistant message). Keeps existingdefault-alias scope (no new alias-scoped semantics in a recovery PR). Large+whatsapp: falsetest churn is unavoidable struct-field mechanical cost. No bot attribution. Milestone v0.8.0 (break-fixfix(channel):+bug, no scope match → earliest open).fix(cron): expose DingTalk in cron delivery schemas #7091 — fix(cron): expose DingTalk in cron delivery schemas. Merged as
2d68a576db4ce4d472130bbd453f9949971d7295, closing bug(cron): DingTalk is missing from cron delivery tool schemas #7088 (DingTalk delivery worked but cron tool schema never advertised it). +122/−26. Replaces the two separately hand-maintained delivery-channel enums incron_add.rsandcron_update.rswith one sharedcron::CRON_DELIVERY_SCHEMA_CHANNELSconstant (10 channels incl. dingtalk) and addsadd_and_update_delivery_channel_schemas_matchto pin byte-for-byte parity so the two tool schemas can't drift again. Strips the stale hardcoded channel list out of thecron_adddescription so the enum stays the single tool-surface source. Separately keepsAUTO_DELIVERY_DEFAULT_CHANNELS(6-channel implicit-reply default subset, adds dingtalk) deliberately narrower than the schema enum because webhook/qq/lark/feishu need explicitto/thread_id—cron_delivery_defaults_do_not_guess_webhook_shapepins webhook is never auto-injected. VERIFIED the"dingtalk"delivery arm genuinely exists (orchestrator/mod.rs:5606), so the schema advertises a working handler. 🟢-only review; one non-blocking residual flagged: the runtime schema constant still lives a crate away from the channels-crate dispatch set (5335 construction match + 8743deliver_announcement) with no cross-crate parity assertion — pre-existing, worth a follow-up, out of scope for this bug. No bot attribution. Milestone v0.8.0 (break-fixfix(cron):+bug, no scope match → earliest open).fix(channels/telegram): restore forward origin attribution #7251 — fix(channels/telegram): restore forward origin attribution. Approved by @singlerider at 0bbb14b; focused forwarded tests green (full nextest interrupted only by the pre-existing brittle
telegram_send_document_bytes_empty_filereal-network test, which test(channels/telegram): make empty document send test local-only #7264 fixes). +225/−19, 1 file. Related audit: track 153 commits lost in bulk revert c3ff635 for recovery #6074, supersedes feat: support forwarded messages in Telegram channel (#4118) #4254 by @Tenith01 (co-author trailer present). Restores modern Telegramforward_originattribution (4 variants: user/hidden_user/chat/channel) checked before the legacyforward_from_chat/forward_fromfallbacks, which are preserved. Extracts two helpers:format_forwarded_user_label(dedups username-or-name logic, now also appends last_name) reused by both the forward_origin user path and legacy path, andprepend_forward_attributionapplied uniformly at all 4 call sites. VERIFIED the forwarded-reply fix:prepend_forward_attributiondetectscontent.starts_with("> ")and inserts\n\nso attribution no longer collapses onto the quote block — quote-detection matches the real renderer (extract_reply_contextemits> @sender:\n> ...at telegram.rs:2179);parse_update_message_forwarded_reply_keeps_quote_block_separatepins the exact output.match origin_typeis wire-protocol discriminant dispatch (legit, not an internal options list). No bot attribution. Milestone v0.8.0 (break-fixfix(channels/telegram):+bug, no scope match → earliest open).test(channels/telegram): make empty document send test local-only #7264 — test(channels/telegram): make empty document send test local-only. Approved by @singlerider at head; test-only +21/−3. Closes test(channels/telegram): make empty document send-path test local-only #7259, related fix(channels/telegram): restore forward origin attribution #7251. Routes
telegram_send_document_bytes_empty_filethrough the existingwith_api_base()hook to awiremocksendDocumentmock (400) instead of letting the fake-token path reach the real Telegram network (the ~384s hang fix(channels/telegram): restore forward origin attribution #7251's validation hit). Strengthens the assertion from a weakresult.is_err()(would pass on any DNS/timeout error) toexpect_err+contains("empty document rejected")against the mocked error, plus.expect(1)confirming the request is made — so the test now verifies the send-path error handling it claims to. No bot attribution. Milestone v0.8.0 (break-fixtest(...)+bug, no scope match → earliest open).fix(runtime): strip think blocks before native tool-call output #7254 — fix(runtime): strip think blocks before native tool-call output. Approved by @WareWolf-MoonWall (thorough, 16/16 green) and @singlerider at 92bd109 (clean master-merge over the reviewed afb0ad9, no code change since). +193/−16, 1 file (
agent/loop_.rs). Privacy fix: inline<think>...</think>reasoning could reach user-visible draft output, channel messages, logs, and native tool-call assistant history. Adds statefulStreamThinkTagStripper(handles<think>/</think>split across delta chunks vialongest_suffix_matching_prefix,finish()drops content if still in-think at EOF), and replaces the old conditional double-strip (tool_specs.is_empty()+strict_tool_parsing && calls.is_empty()) with one unconditionalstrip_think_tagsat the response boundary.reasoning_contentpreserved separately per [Bug]: Incompatible with DeepSeek-V4 API format #6059. Regression asserts native historycontentsanitized +reasoning_contentsurvives, plus split-tag streaming test. @WareWolf-MoonWall left 3 🔵 (doc why reasoning_content isn't stripped, open-tag-at-EOF test, full-string-vs-streaming naming) — non-blocking, not carried. No bot attribution. Milestone v0.8.0 (break-fixfix(runtime):+bug, no scope match → earliest open).fix(runtime): apply runtime profiles to delegate sub-loops #7307 — fix(runtime): apply runtime profiles to delegate sub-loops. Approved by @singlerider at 894f8b3;
risk: high, +203/−22. Related [Feature]: Local-First Mode for Small Models — Compact No-Tools Prompting, Strict Parser Option, and No Prompt-Leakage #5287. Agenticdelegatesub-loops now inherit the target agent's resolved runtime profile (max_tool_iterations,strict_tool_parsing,parallel_tools,max_tool_result_chars,max_context_tokens) instead of the old single-knobresolve_max_iterations+ hardcoded0, 0for tool-result/context limits. Newresolve_loop_runtimeroutes the production path through the canonicalConfig::resolved_agent_config()(schema.rs:3389, computes alleffective_*+ layers profile fields); the non-root_configfallback is scoped to legacy unit constructors and documented. Behavior change (subagents now prune context + truncate tool output where0=disabled before) is intentional alignment, tested byexecute_agentic_applies_target_profile_tool_result_limit(asserts "characters truncated" under an 80-char limit), and disclosed in rollback symptoms. Docs add alocal_smallprofile composing existing primitives (no new preset). No bot attribution. Milestone v0.8.0 (break-fixfix(runtime):, no scope match → earliest open).fix(web): log cron settings failures #7352 — fix(web): log cron settings failures. Approved by @WareWolf-MoonWall and @singlerider at bede536; web-only +24/−3 (Cron.tsx). Replaces two silent
catch {}swallows (cron-settings load + catch-up toggle update) with sanitizedconsole.warn.describeCronSettingsErrorextracts only safe diagnostic fields fromApiError(name,status,code,path,op_index) and deliberately OMITSenvelope.message— the one field that could echo a server value into the browser console; non-ApiError paths return only{ name }or{ type: typeof err }. Adds observability without touching fallback UI behavior. Build clean. No bot attribution. Milestone v0.8.0 (break-fixfix(web):+bug, no scope match → earliest open).ci(actions): warm Rust caches from master #7355 - ci(actions): warm Rust caches from master. Merged as
af50475a37fa9d2ae78758d2fbe82bda67218c17. Related feat(ci): improve cached Rust builds and CI critical path #7108. Adds the trustedpush: masterQuality Gate cache-seeding path while preserving the PR cache-write trust boundary and fixing the push-event concurrency group. Milestone v0.8.0.docs(github): expand bug report component choices #7374 - docs(github): expand bug report component choices. Merged as
e3f3482de981d0d7a2136de7bf86a1e3985c4f44. Adds coarse reporter-facing bug-report component buckets without mirroring the internal label taxonomy. Milestone v0.8.0.fix(docs): guard mdbook catalogs against literal corruption #7375 — fix(docs): guard mdbook catalogs against literal corruption. Merged ✅ as e82f3ec. Approved by @singlerider at head; +281/−25 (mostly
xtask/.../check.rs). Related [Bug]: Generated i18n catalogs translate code literals and invent docs content #6407, RFC: Move translated .ftl and .po files into a git submodule #7184. Adds protected-literal auditing tocargo mdbook checkso.pocatalogs fail when high-confidence machine-facing literals are translated (product names,zeroclaw daemon, fenced TOML section/key literals), plus fixes the actual corrupted es/fr/ja/zh-CN entries. VERIFIED the false-positive boundary is tested both ways: flags translated TOML keys / single-word keys / corrupted quoted dotted sections / translated product name, but ALLOWS non-TOML fenced text, prose around preserved literals, and CLI placeholders (zeroclaw [OPTIONS] <COMMAND>→ localized).is_toml_key_pathdoes real quote-state-aware parsing. Refactor shares one parse across both audits. Docs-tooling only. No bot attribution. Milestone v0.8.0 (break-fixfix(docs):+bug, no scope match → earliest open).fix(gateway): align webhook model labels with resolved agent config #7379 — fix(gateway): align webhook model labels with resolved agent config. Merged as
c2f25c8fa063aef4971ced08078927efb25e2f21. Related feat(gateway): per-request agent dispatch for POST /webhook via ?agent= #7297. Routes webhook fallback agent selection throughConfig::resolved_runtime_agent_alias()and reports the selected agent provider model in observer metadata plus/webhooksuccess payload. Milestone v0.8.0.fix(zerocode): stabilize Quickstart agent creation flow #7380 — fix(zerocode): stabilize Quickstart agent creation flow. APPROVED by @singlerider at
1de0041; the earlier 🔴 blocker (model capability classification hardcoded in the TUI surface) was resolved by moving the classifier into the backend crate per the registry rule.size: XL; closes [Bug]: zerocode Quickstart can strand users after editor and submit flows #7373, related [Bug]: zerocode Config model-provider edits do not update active Chat sessions #7395. Reworks Quickstart recovery (immediate Chat handoff vs stale "Reloading daemon"), non-blocking model-catalog fetch with loading/retry/fallback, in-pane personality editor, MEMORY.md via personality-template RPC for staged agents. Merge-ready. Milestone v0.8.0.fix(ci): add missing file and shell tool labeler paths #7383 - fix(ci): add missing file and shell tool labeler paths. Merged as
e2e3d4e9260562765a4d8ed6f6fd0eed5646150f, with cron/SOP/security split to fix(ci): complete runtime tool sub-label mappings #7408/fix(ci): complete runtime tool sub-label mappings #7435 follow-up. Adds real crate-path files totool:fileandtool:shellmappings. Milestone v0.8.0.fix(channels): avoid unused PacedChannel import #7386 — fix(channels): avoid unused PacedChannel import. Merged as
423a8e3c646364d421ca752f1df2a77dd85949e6. Related fix(gateway): align webhook model labels with resolved agent config #7379. Removes the top-levelPacedChannelimport and fully qualifies eachcrate::paced_channel::PacedChannel::wrap(...)call inside existing feature-gated channel setup blocks so feature-off builds do not tripclippy -D warnings; pacing behavior is unchanged. Milestone v0.8.0.fix(providers): default custom endpoints to prompt-guided tools #7387 — fix(providers): default custom endpoints to prompt-guided tools. Merged as
a9a9fd8a2b9746ca777323e1e82db7a4f1be21d2. Supersedes fix(providers): disable native tool calls for custom endpoints #5242 by @bellman-move; related Empty tool_calls array sent to provider API, causing 400 on strict validators (DeepSeek, NVIDIA NIM) #6298 and [Bug]: No tool call found for function call output with call_id call_6gd5XWS7qozFQYJdlm2k0UJI. #5941. Custom OpenAI-compatible chat-completions endpoints now default to prompt-guided tools unlessnative_tools = trueis set, while Responses-wire custom providers remain unaffected. Milestone v0.8.0.feat(channels): configure in-flight message budget #7391 — feat(channels): configure in-flight message budget. Merged as
de48f037313cdcfc2fee1cb1735428ebb58916cf. Supersedes feat(channels): configurable concurrency per channel and DM precheck skip #5418 by @DaBlitzStein. Addschannels.max_concurrent_per_channelwith default4, rejects0, round-trips the config, and keeps the existing global in-flight min/max bounds. Milestone v0.8.0.test(tools): cover MCP stdio registry drop cleanup #7392 — test(tools): cover MCP stdio registry drop cleanup. Approved by @singlerider at head; test-only +92/−0 (Unix-gated). Related [Bug]: MCP stdio child processes accumulate on daemon with heartbeat.enabled=true (one orphan per tick) #5903 (stdio MCP children accumulate). Adds
dropping_stdio_registry_reaps_child_process: shell MCP server writes$$, answers initialize/tools-list,exec tail -f /dev/nullto stay alive; test asserts child alive while registry alive, reaped afterdrop(registry). Race-tolerant (polls pid-file up to 1s,kill -0liveness probe, polls post-drop up to 1s returning on first miss).execpreserves PID so the tracked pid stays valid. Locks in the lifecycle [Bug]: MCP stdio child processes accumulate on daemon with heartbeat.enabled=true (one orphan per tick) #5903 is about. Milestone v0.8.0 (test for v0.8.0 blocker [Bug]: MCP stdio child processes accumulate on daemon with heartbeat.enabled=true (one orphan per tick) #5903).fix(gateway): cap memory api response content #7393 — fix(gateway): cap memory api response content. Merged as
defca8f145336638ccc64839c57ca225611672c6. Supersedes fix(gateway): truncate oversized memory api payloads #5372 by @forsakenyang. Caps/api/memorylist and recall/search responsecontentfields at 4096 characters at the gateway boundary, including UTF-8-safe truncation and ellipsis-inclusive exact-cap coverage; storage and backend behavior stay unchanged. Milestone v0.8.0.ci(docker): add no-push PR image smoke #7434 — ci(docker): add no-push PR image smoke. Merged as
b0b6fbe5afbe9987136de4752bab8035c3d4a8b4, closing [Feature]: GitHub Actions CI / CD Container Builds and Releases for Debian Container Image #5908. Adds a path-filtered Docker Image PR Check that builds default and Debian CI images with no push, and shares Docker context preparation between release and PR smoke paths. Milestone v0.8.0.Current issue queue (51 total: 27 open, 24 closed)
Config, schema, provider routing, and Stable-tier promotion (5 total: 1 open, 4 closed)
be56dc3b, clean/mergeable, and still draft; channel-orchestrator path is ready once the author marks it ready. Follow-up [Bug]: DelegateTool can inherit parent provider endpoint/runtime options for explicit sub-agent aliases #7266 tracks the separateDelegateToolprovider endpoint/runtime-options bleed reported after fix(channels): excise default-model-provider credential fallback #7066 opened.DelegateToolcan inherit parent provider endpoint/runtime options for explicit sub-agent aliases. Filed as the runtime/provider follow-up to [Bug]: excise "default model provider" credential/URL fallback from channel orchestrator #7059; needs implementation PR.providers.fallbackinto provider resolution. Issue closed.[providers.X]config.MCP, tool filtering, and tool-call parser behavior (2 closed)
<tool_calls>plural tag in the tool-call parser (PR fix(tool-call-parser): recognize plural <tool_calls> wrapper tag #7195, approved ✅ - plural wrapper parsing plus regression; current-master merge-result parser tests green).801560799d0ba0507eb8937c7773ce498070e248.Multi-agent, channel, memory, and gateway behavior (4 total: 2 open, 2 closed)
35eebd1e2593de2c78c6bb8d4152b886076045f5.Plugin/security items moved out of v0.8.0 (1 closed)
Plugin SSRF and zc_env_read allowlist work moved to the v0.8.2 WASM/plugin program tracker (#7314).
web_fetchprivate-host allowlist does not handle domain names that resolve to private IPs.Untracked v0.8.0 PRs (82 total: 63 open, 19 closed; added 2026-06-09 audit, refreshed 2026-06-11)
test(fuzz): wire fuzz stub targets to real ZeroClaw code paths #5516 — test(fuzz): wire fuzz stub targets to real ZeroClaw code paths. REVIEW_REQUIRED at
1c2366b; dirty/conflicting,needs-author-action, with Validate Release Readiness red. Fuzz harness test-infrastructure PR routed to v0.8.0 bytest(...)/other fallback; author action needed to refresh the branch and fix the release-readiness failure before review. Milestone v0.8.0.fix(providers/runtime): two production blockers — empty tool_choice and orphaned tool_use #5892 — Draft:fix(providers,runtime): three production blockers — tool_choice, orphaned tool_use, and vision capability. REVIEW_REQUIRED at
d14b358; dirty/conflicting,needs-author-action, stale-candidate. Bug-class provider/runtime repair routed to v0.8.0; author action needed to refresh the branch before review. Milestone v0.8.0.docs(gateway): document gateway.web_dist_dir and ZEROCLAW_WEB_DIST_DIR #6583 — docs(gateway): document gateway.web_dist_dir and ZEROCLAW_WEB_DIST_DIR. CHANGES_REQUESTED at
2e4314e; dirty/conflicting,needs-author-action, stale-candidate. Docs/gateway PR routed to v0.8.0 by docs fallback; author action needed to refresh the branch before review. Milestone v0.8.0.docs: add repo-summary.md with full project overview #6640 — docs: add repo-summary.md with full project overview. CHANGES_REQUESTED at
6f4bcdb; BLOCKED by active review state. Docs-only PR routed to v0.8.0 by docs fallback; author action needed to address the active review before review can resume. Milestone v0.8.0.fix(loop): gate path-listing tool results from vision routing #7345 — fix(loop): gate path-listing tool results from vision routing. CHANGES_REQUESTED at
e0b2797; BLOCKED by active review state. Runtime bug routed to v0.8.0; author action needed before review can resume. Milestone v0.8.0.Update 'quickstart' to 'onboard' #7358 — Update "quickstart" to "onboard". REVIEW_REQUIRED at
2a68114; BLOCKED with main, Lint, Test, and CI Required Gate red. Docs wording PR routed to v0.8.0 by docs fallback; author action needed to fix CI before review. Milestone v0.8.0.fix(memory): warn when rerank_enabled is set but unimplemented (#6722) #7426 — fix(memory): warn when rerank_enabled is set but unimplemented. Merged as
7b3c49d9252f7914cab474dff8eefa363c8f64b0, closing MemoryConfig.rerank_enabled / rerank_threshold scaffolded but no consumer #6722. Emits a construction-time warning fromDefaultMemoryStrategy::new()whenrerank_enabledis true because rerank config fields are exposed but the retrieval reranker has not landed. Milestone v0.8.0.fix(agent): remove dead context_aware_tools config field (#6720) #7427 — fix(agent): remove dead context_aware_tools config field ([agent] context_aware_tools config field is declared but unread (dead code) #6720). Retitled/rescoped from warn-on-set to removing the dead field. CHANGES_REQUESTED by @Audacity88 at
51abec5; author action needed. Related [agent] context_aware_tools config field is declared but unread (dead code) #6720. Labels aligned asbug,risk: high,size: XS,agent,runtime. Milestone v0.8.0.fix(ci): fixes manual dev/ci.sh all test failure #7453 — fix(ci): fixes manual dev/ci.sh all test failure. Merged as
50debcddc80a3f239d60879cbc7f9085d29fcad9. Alignstests/manual/test_dockerignore.shwith the current Docker context rules from build(container): StageX container pipeline with musl static linking #7176 sotests/is no longer required to be excluded and./dev/ci.sh test-manualpasses the dockerignore check. Milestone v0.8.0.ci(lint): run clippy on every build-target OS and fix the platform-gated code it surfaces #7428 — ci(lint): run clippy on every build-target OS and fix the platform-gated code it surfaces. Merged ✅ as bab4da8, closing [Bug]: clippy lint gate is Linux-only — Windows/macOS-gated code is never linted (broken Windows tests on tree) #7409. Milestone v0.8.0.
fix(runtime): refresh active sessions after provider config edits #7433 — fix(runtime): refresh active sessions after provider config edits. APPROVED by @WareWolf-MoonWall at
9ac4fa0; merge-ready pending final maintainer pass. Closes [Bug]: zerocode Config model-provider edits do not update active Chat sessions #7395 in v0.8.0; labels corrected tobug,risk: high,size: M,agent,runtime. Milestone v0.8.0.fix(ci): complete runtime tool sub-label mappings #7435 - fix(ci): complete runtime tool sub-label mappings. Merged as
e5f3deb371c37342e1e65dcf663ae9497433d258, closing fix(ci): complete runtime tool sub-label mappings #7408. Adds runtime crate paths fortool:cron,tool:sop, andtool:securityin.github/labeler.yml, includingcron_common.rs, and syncs maintainer label docs. Labels aligned asbug,type: ci,risk: low,size: XS,ci,docs. Milestone v0.8.0.fix(runtime): skip futile history trim when system prompt exceeds budget #7440 — fix(runtime): skip futile history trim when system prompt exceeds budget. REVIEW_REQUIRED at
16d808c; BLOCKED by review state. Runtime/agent bug routed to v0.8.0; labels aligned asbug,risk: high,size: S,agent,runtime. Milestone v0.8.0.fix(doctor): validate custom model_provider entries against config, not legacy factory #7441 — fix(doctor): validate custom model_provider entries against config, not legacy factory. REVIEW_REQUIRED at
4f90679; BLOCKED by review state. Gateway/runtime/web doctor bug routed to v0.8.0; labels aligned asbug,risk: high,size: M,docs,doctor,gateway,runtime,web. Milestone v0.8.0.fix(memory): bind postgres schema version as int4 #7451 — fix(memory): bind postgres schema version as int4. Merged as
152d339a92fc706f7a4283d0be4996d6e1f44880, closing [Bug]: Postgres memory backend fails to initiailize #7421. Binds the Postgres memory schema version as an int4-compatible value while keepingSQLITE_MEMORY_SCHEMA_VERSIONas the single source of truth. Milestone v0.8.0.feat(doctor): list configured models in
models list/doctor; add--check; collapse probe rows #7450 — feat(doctor): list configured models inmodels list/doctor; add--check; collapse probe rows. REVIEW_REQUIRED at524699e; BLOCKED by review state. Follow-on to fix(cli): print model names in 'zeroclaw models list' output #7346 in v0.8.0; labels aligned asenhancement,risk: high,size: M,core,doctor,runtime. Milestone v0.8.0.fix(docker): resolve workspace build failures from apps/zerocode and embedded assets #7445 — fix(docker): resolve workspace build failures from apps/zerocode and embedded assets. Merged as
1b688fc4baefe7d26a5832592683451ea93b0517. Repairs build-from-source Docker images afterapps/zerocodebecame a workspace member, ships thezerocodeTUI binary in the runtime images, and applies the same builder/runtime fixes to the Debian Dockerfile. Milestone v0.8.0.fix(runtime): make parallel SubAgents and Delegates return reliably #7442 — fix(runtime): make parallel SubAgents and Delegates return reliably. REVIEW_REQUIRED, MERGEABLE; labels
risk: high,size: M,agent,runtime. Related [Bug]: delegate agentic mode rejects empty risk_profile.allowed_tools and same-profile gating blocks stricter delegated targets #7470 (delegate agentic-mode risk_profile gating, p1, filed 2026-06-10). Milestone v0.8.0.fix(web_fetch): let allowed_private_hosts = ["*"] cover DNS-resolved private hosts (#7412) #7424 — fix(web_fetch): let allowed_private_hosts = ["*"] cover DNS-resolved private hosts ([Bug]: web_fetch/http_request
allowed_private_hosts = ["*"]does not cover domain names that resolve to private IPs #7412). REVIEW_REQUIRED; labelsbug,risk: high,size: S,config,security,tool,tool:web; milestone v0.8.0.fix(cron): expose all fields in cron job edit modal to match add form (#6891) #7417 — fix(cron): expose all fields in cron job edit modal to match add form ([Bug]: Scheduled Jobs edit error API 422 #6891). REVIEW_REQUIRED; labels
bug,risk: medium,size: M,docs,gateway,cron:scheduler,gateway: api,web; milestone v0.8.0.fix(gateway): survive transient accept() errors instead of crashing (#7042) #7402 — fix(gateway): survive transient accept() errors instead of crashing ([Bug]: daemon IPC crash on file-descriptor exhaustion (EMFILE / too many open files) #7042). Merged ✅ as fb30bff. Hardens the gateway accept loop against transient errors; [Bug]: daemon IPC crash on file-descriptor exhaustion (EMFILE / too many open files) #7042 stays open for the remaining EMFILE/file-descriptor-exhaustion scope.
fix(config): warn on unknown security.otp.gated_actions entries #7368 — fix(config): warn on unknown security.otp.gated_actions entries. Merged ✅ as ad3886e, closing [Bug]:
security.otp.gated_actionssilently accepts unknown action names #5810. Supersedes the older conflicting fix(config): warn on unknown security.otp.gated_actions entries (#5810) #6626, which remains listed below pending closure.feat(mcp): auto-reconnect on stale session or dropped stream #7351 — feat(mcp): auto-reconnect on stale session or dropped stream. REVIEW_REQUIRED at
bdcaf9a; DIRTY/CONFLICTING, needs author action before review. Bug-class MCP tool-client reliability repair: stale remote MCP sessions currently leave later tool calls failing until daemon restart. Labels aligned asbug,risk: high,size: M,tool,tool:mcp,needs-author-action. Milestone v0.8.0.fix(matrix): strip self-anchored event_id from interruption_scope_id (#6958) #7349 — fix(matrix): strip self-anchored event_id from interruption_scope_id (Matrix channel: session keyed on event_id causes amnesia between messages #6958). Merged as
0077daf89cffa1a13594fca40ae368d8c7fcdc47, closing Matrix channel: session keyed on event_id causes amnesia between messages #6958. Keeps Matrix delivery threading separate from interruption cancellation scope by clearing self-anchored event IDs frominterruption_scope_idwhile preserving real thread roots. Milestone v0.8.0.refactor(zeroclaw-tools): extract duplicate domain/URL validation int… #7340 — refactor(zeroclaw-tools): extract duplicate domain/URL validation into shared guard. REVIEW_REQUIRED at
1428cf2; BLOCKED by review state. Centralizes network-tool allowlist/private-host validation for browser/http_request/web_fetch and fixes unmatched IPv6 bracket rejection. Labels aligned asrisk: high,size: L,tool,tool:browser,tool:web. Milestone v0.8.0 as earliest open milestone for refactor/security-hardening work with no tighter active lane.fix(cron): skip overdue jobs on startup when catch_up_on_startup is disabled (#7250) #7348 — fix(cron): skip overdue jobs on startup when catch_up_on_startup is disabled ([Bug]: scheduler.catch_up_on_startup = false still runs overdue cron jobs after startup #7250). Merged as
3bcb54e38b584602843d99d7669a8c4e8eaf0177, closing [Bug]: scheduler.catch_up_on_startup = false still runs overdue cron jobs after startup #7250. Honorsscheduler.catch_up_on_startup = falsebefore the normal cron polling loop, advances missed recurring jobs to the next future run, and disables overdue one-shotAtjobs asskipped. Milestone v0.8.0.fix(zerocode): repair Quickstart model-provider form UX defects #7330 — fix(zerocode): repair Quickstart model-provider form UX defects. Merged ✅ as 3c3d7e9, closing [Bug]: zerocode Quickstart model-provider form hides field errors and overflows secret input #7304. Milestone v0.8.0.
fix(install): copy built web/dist to system data dir on source instal… #7302 — fix(install): copy built web/dist to system data dir on source install. CHANGES_REQUESTED; labels
bug,risk: medium,size: XS,web; milestone v0.8.0.fix(runtime): origin-based MCP detection for tool_filter_groups #6861 — fix(runtime): origin-based MCP detection for tool_filter_groups. CHANGES_REQUESTED;
needs-author-action, stale-candidate. Closes tool_filter_groups is a no-op for real MCP tools (prefix-check bug) + no integration with deferred_loading #6699; milestone v0.8.0.fix(runtime/agent): authorize shell explicitly at autonomy.level=full (#6434) #6619 — fix(runtime/agent): authorize shell explicitly at autonomy.level=full ([Bug]: Shell tool calls are refused at
[autonomy] level = "full"— notool_dispatchever reaches the runtime #6434). Needs author action; labelsbug,risk: high,size: S,agent,runtime,security,tool,tool:shell; milestone v0.8.0.fix(runtime): preserve plain-text assistant before tool messages in context compressor boundary #6362 — fix(runtime): preserve plain-text assistant before tool messages in context compressor boundary. Needs author action; stale-candidate; labels
bug,risk: high,size: XS,runtime; milestone v0.8.0.feat(obs): instrument runtime memory ops with OTel GenAI spans #6190 — feat(obs): instrument runtime memory ops with OTel GenAI spans. APPROVED by @Audacity88 and @WareWolf-MoonWall but now CONFLICTING; author refresh needed before merge; labels
enhancement,risk: high,size: L,docs,agent,observability,runtime,tests; milestone v0.8.0.docs(windows-setup): rewrite + fix setup.bat known issues #6102 — docs(windows-setup): rewrite + fix setup.bat known issues. REVIEW_REQUIRED; labels
type: docs,risk: low,size: S,docs; milestone v0.8.0.fix(cron): add claim/release lock to prevent repeated job execution #6038 — fix(cron): add claim/release lock to prevent repeated job execution. Needs author action; stale-candidate; labels
bug,risk: high,size: S,cron,runtime; milestone v0.8.0.feat(ci): add arm64 docker target #5187 — feat(ci): add arm64 docker target. REVIEW_REQUIRED; labels
enhancement,type: ci,risk: high,size: S,ci; milestone v0.8.0.refactor(api): move HookHandler trait and HookResult to zeroclaw-api #7411 - refactor(api): move HookHandler trait and HookResult to zeroclaw-api. Merged as
9ad397bf8b1450b21e2a7ffc5de7c700c36d021f. Moves the hook abstraction fromzeroclaw-runtimeintozeroclaw-apiwhile preservingzeroclaw_runtime::hooks::{HookHandler, HookResult}via re-export; matches FND-001 dependency direction for shared API traits. Labels aligned asrisk: low,size: XS,runtime. Milestone v0.8.0.fix(config): default session_ttl_hours to 168h and trim history on seed #6085 — fix(config): default session_ttl_hours to 168h and trim history on seed. REVIEW_REQUIRED, MERGEABLE.
feat(skills): universal skill registry support (agentskills.io, skills.sh) #6143 — feat(skills): universal skill registry support (agentskills.io, skills.sh). CHANGES_REQUESTED, CONFLICTING.
fix(cron): allow whatsapp as cron delivery channel #6230 — fix(cron): allow whatsapp as cron delivery channel. CHANGES_REQUESTED, CONFLICTING.
fix(runtime/service): derive systemd unit name from config-dir for named instances #6288 — fix(runtime/service): derive systemd unit name from config-dir for named instances. CHANGES_REQUESTED, CONFLICTING.
fix(providers): drop leading non-user turns before provider call #6303 — fix(providers): drop leading non-user turns before provider call. REVIEW_REQUIRED, CONFLICTING.
feat(gateway,web): nodes dashboard + device identification #6392 — feat(gateway,web): nodes dashboard + device identification. CHANGES_REQUESTED, CONFLICTING.
fix(ci): re-introduce post-release CHANGELOG-next.md cleanup as a PR #6412 — fix(ci): re-introduce post-release CHANGELOG-next.md cleanup as a PR. REVIEW_REQUIRED, MERGEABLE.
fix(i18n): localize channel runtime command replies #6578 — fix(i18n): localize channel runtime command replies. CHANGES_REQUESTED, CONFLICTING.
fix(runtime): detach shell stdin #6595 — fix(runtime): detach shell stdin. CHANGES_REQUESTED, CONFLICTING.
fix(channels/whatsapp): resolve LID→phone via persistent store for allowlist (#6350) #6622 — fix(channels/whatsapp): resolve LID→phone via persistent store for allowlist ([Bug]: WhatsApp Web — allowed-numbers bypassed for LID-based contacts (silent message drops) #6350). CHANGES_REQUESTED, CONFLICTING.
fix(config): warn on unknown security.otp.gated_actions entries (#5810) #6626 — fix(config): warn on unknown security.otp.gated_actions entries ([Bug]:
security.otp.gated_actionssilently accepts unknown action names #5810). CHANGES_REQUESTED, CONFLICTING.feat(skills): background review fork + skill_manage tool (agentskills.io SKILL.md) #6667 — feat(skills): background review fork + skill_manage tool (agentskills.io SKILL.md). CHANGES_REQUESTED, CONFLICTING.
fix(skills): distinct error when skill_manage patch is disabled #6684 — fix(skills): enforce cooldown in skill_manage patch action. CHANGES_REQUESTED, CONFLICTING.
fix(agents): delegate agents respect skills.prompt_injection_mode config #6688 — fix(agents): delegate agents respect skills.prompt_injection_mode config. Closed as superseded: the behavior landed on master as 51edb1f and [Bug]: Delegate agents ignore [skills].prompt_injection_mode and always inject full skills #5155 is closed as completed.
fix(runtime): persist model_switch across turn paths #6719 — fix(runtime,channels): persist model_switch across turns in all paths. CHANGES_REQUESTED, CONFLICTING.
test(providers): streaming payload tracing tests for --log-llm #6768 — test(providers): streaming payload tracing tests for --log-llm. Closed as superseded by test(providers): cover streaming payload tracing #6744, which already merged the streaming payload tracing coverage for [Feature]: Add streaming payload tracing tests for --log-llm #6742.
docs(reference): add feature support matrix #6870 — docs(reference): add feature support matrix. APPROVED by @singlerider, still draft, branch behind master but not reported as conflicting in the review. Dan-owned branch; needs normal draft/branch refresh before merge consideration. Milestone v0.8.0.
Draft:fix(agent): use per-agent provider runtime options instead of first model provider #6887 — Draft:fix(agent): use per-agent provider runtime options instead of first model provider. CHANGES_REQUESTED by @Audacity88; stale-candidate, waiting on author response by June 16. Author action needed to keep
llm_taskprovider identity/options coupled, resolve delegate runtime options from the target agent, and refresh PR body metadata/validation. Milestone v0.8.0.fix(shell): prevent hang when grandchild processes inherit pipe handles #6910 — fix(shell): prevent hang when grandchild processes inherit pipe handles. CHANGES_REQUESTED by @Audacity88; stale-candidate, waiting on author response by June 16. Author action needed to keep the inherited-grandchild-handle fix while draining stdout/stderr concurrently with child wait, plus regression coverage for large-output pipe-buffer deadlock and the inherited-handle case if portable. Milestone v0.8.0.
feat(ui): add sidebar self-update button with SSE progress #6926 — feat(ui): add sidebar self-update button with SSE progress. CHANGES_REQUESTED by @WareWolf-MoonWall; author action needed for SHA256 checksum verification before executing the downloaded binary, unit coverage for the updater pipeline, and current PR-template security/compatibility/rollback evidence. Closes [Feature]: Dashboard "Update ZeroClaw" button — expose update flow over gateway #6365. Milestone v0.8.0.
feat(obs): capture prompt/completion content on llm.call spans #6966 — feat(obs): capture prompt/completion content on llm.call spans. CHANGES_REQUESTED by @Audacity88; author action needed to either provide current-head live-backend evidence for [Feature]: Capture full prompt/completion on llm.call spans via gen_ai.input.messages / gen_ai.output.messages #6642 Langfuse/OTel rendering or downgrade the closing relationship, plus refresh high-risk validation/risk/body metadata. Milestone v0.8.0.
fix(channels/whatsapp-web): pass LID JIDs unchanged to whatsapp-rust 0.6+ #6973 — fix(channels/whatsapp-web): pass LID JIDs unchanged to whatsapp-rust 0.6+. Merged as
206ac23cce0a964b734868ff97e0e9c57eb42224. Passes LID JIDs through unchanged for inbound/outbound reply routing now thatwhatsapp-rust0.6+ handles namespace conversion internally, and rolls the dependency family forward for the upstream LID namespace fix. Milestone v0.8.0.fix(web): prevent browser translation from crashing React-managed chat DOM #7077 — fix(web): prevent browser translation from crashing React-managed chat DOM. APPROVED by @WareWolf-MoonWall at
e10b05bafter the narrowed chat-messages-region fix; merge-ready pending final maintainer pass. Live author evidence includes Chrome translation screenshot; no full CI run visible beyond path labels at live readback. Closes [Bug]: Agent chat view crashes ("removeChild" DOM error) when browser auto-translation is enabled #7057. Milestone v0.8.0.fix(gateway): isolate test data_dir and harden DeviceRegistry SQLite pragmas #7079 - fix(gateway): isolate test data_dir and harden DeviceRegistry SQLite pragmas. Merged as
35eebd1e2593de2c78c6bb8d4152b886076045f5, closing [Bug]: parallel nextest tests share the real ~/.zeroclaw/data, racing on SQLite/state files (flaky DatabaseBusy) #7054. Isolates gateway boot tests from real~/.zeroclaw/dataand alignsDeviceRegistrySQLite pragmas with the WAL/NORMAL/MEMORY pattern. Milestone v0.8.0.fix(config): restore 1Password op secret refs #7085 — fix(config): restore 1Password
op://secret refs. APPROVED by @singlerider at99df744after @Audacity88's blocker fix and master refresh; clean/mergeable with checks green. Merge-ready. Restores external secret-reference resolution/preservation for config secret fields. Milestone v0.8.0.docs(readme): fix broken providers routing doc link #7185 — docs(readme): fix broken providers routing doc link. REVIEW_REQUIRED, clean/mergeable, all visible checks green. README provider routing link now targets the canonical
docs/book/src/providers/routing.mdpage instead of missingfallback-and-routing.md. Milestone v0.8.0.docs(esp32-ui): fix hardware design doc link to mdbook path #7186 — docs(esp32-ui): fix hardware design doc link to mdBook path. REVIEW_REQUIRED, clean/mergeable, all visible checks green. @WareWolf-MoonWall's duplicate-state blocker appears to be based on untracked local copies; the author replied with
git ls-filesevidence that onlyfirmware/esp32-ui/README.mdis tracked. Waiting on reviewer re-check/dismissal. Milestone v0.8.0.fix(web): correct chat model switcher resolution and switch timeout #7191 — fix(web): correct chat model switcher resolution and switch timeout. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Fixes agent-scoped status/model switch resolution and separates config-write vs reconnect timeouts in the web chat model switcher. Milestone v0.8.0.
fix(web): strip server timestamp prefix from chat bubble content #7199 — fix(web): strip server timestamp prefix from chat bubble content. CHANGES_REQUESTED by @WareWolf-MoonWall, mergeable but BLOCKED; all visible checks green. Author action needed to fix the timestamp pollution at the backend/source instead of adding a frontend stripping workaround. Closes [Bug]: Chat message timestamp
[2026-06-03 18:18:31 +08:00]rendered inside the message bubble instead of as separate metadata #7157. Milestone v0.8.0.fix(tools/calculator): reject factorial inputs above the u128-safe max #7206 — fix(tools/calculator): reject factorial inputs above the u128-safe max. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Bounds calculator factorial input before the
u128path can overflow. Milestone v0.8.0.fix(gateway): point paircode recovery hint at loopback for non-loopback binds #7207 — fix(gateway): point paircode recovery hint at loopback for non-loopback binds. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Closes fix(gateway): non-loopback --host recovery hint advertises admin URL that admin guard rejects #6561 by making paircode recovery guidance use a loopback URL when the gateway binds to a non-loopback address. Milestone v0.8.0.
fix(cron): correct weekday range normalization for Sunday-alias endpoints #7208 — fix(cron): correct weekday range normalization for Sunday-alias endpoints. REVIEW_REQUIRED, mergeable but BLOCKED pending review; all visible checks green. Fixes cron weekday range normalization for Sunday alias boundaries in
crates/zeroclaw-runtime/src/cron/schedule.rs. Milestone v0.8.0.fix(quickstart): surface port field for webhook channel config #7215 — fix(quickstart): surface port field for webhook channel config. CHANGES_REQUESTED by @Audacity88 at
676210e; mergeable but BLOCKED, with Format and CI Required Gate red. Author action needed to run formatting and add conversion-boundary regression tests for valid and invalid webhook port extras. Closes [Bug]: quickstart channel webhook config does not offer port selection. causes created agent to report toml missing fieldport#7173. Milestone v0.8.0.fix(config): warn on provider entries with silently dropped flattened fields #7216 — fix(config): warn on provider entries with silently dropped flattened fields. CHANGES_REQUESTED by @singlerider at
f349d62; dirty/conflicting, with Format and CI Required Gate red. Author action needed to key detection off the raw/user-written nested provider shape instead of default endpoint URI values, then addvalidate()warning/no-warning regression tests. Milestone v0.8.0.fix(gateway): implement proper token revocation on rotation and device deletion #7243 — fix(gateway): implement proper token revocation on rotation and device deletion. CHANGES_REQUESTED by @Audacity88 at
7d7a69d; dirty/conflicting, with prior CI green. Author action needed to either cover the CLI/admin rotation path from bug(gateway): token rotation does not revoke existing bearer tokens #6984 or narrow the public scope to the HTTP-device partial fix, plus add gateway-level revocation/persistence regression coverage. Milestone v0.8.0.feat(runtime,parser): reinforce tool formatting prompts and add robust JSON fallback parser for file_write #7244 — feat(runtime,parser): reinforce tool formatting prompts and add robust JSON fallback parser for file_write. CHANGES_REQUESTED by @WareWolf-MoonWall and @Audacity88 at
10ebf5e; mergeable but BLOCKED, with title, Lint, and CI Required Gate red. Author action needed to fix the title/lint/scope blockers, remove or justify unrelated provider changes, make malformed parser recovery UTF-8 safe, and keep or explain the anti-meta prompt guard change. Milestone v0.8.0.fix(channel): fix Incorrect workspace_dir passed to load_skills_for_agent #7246 — fix(channel): fix Incorrect workspace_dir passed to load_skills_for_agent. CHANGES_REQUESTED by @Audacity88 at
8374307; mergeable but BLOCKED, all visible checks green. Author action needed to use the per-agent workspace instead ofdata_dirfor channel skill loading/refresh, add differingdata_dirvs agent-workspace coverage, and refresh the stale PR body. Targets [Bug]: Incorrect workspace_dir passed to load_skills_for_agent prevents loading skills from data/skills/ #7236. Milestone v0.8.0.fix(runtime): use agent_workspace_dir for load_skills_for_agent calls #7463 — fix(runtime): use agent_workspace_dir for load_skills_for_agent calls. CHANGES_REQUESTED by @Audacity88 at
e523e61; mergeable but BLOCKED, all visible checks green. Author action needed to add a behavior regression proving a skill under<install>/agents/<alias>/workspace/skills/is visible through the fixed runtime path instead ofconfig.data_dir. Closes [Bug]: Incorrect workspace_dir passed to load_skills_for_agent prevents loading skills from data/skills/ #7236. Labels aligned asbug,risk: high,agent,runtime,skills. Milestone v0.8.0.feat(zerocode): hold back context-window usage bar until it bakes #7362 - feat(zerocode): hold back context-window usage bar until it bakes. Merged as
a9614894d3a6dce374e22777473573c0fd264588. Milestone v0.8.0.chore(release): release v0.8.0 #7364 — chore(release): release v0.8.0. REVIEW_REQUIRED, MERGEABLE, no longer draft. The release PR is the closing gate for this tracker.
docs(book): rework the book and derive provider/config surfaces from source #7365 — docs(book): rework the book and derive provider/config surfaces from source. Merged ✅ as e5ea3bd, closing [Bug]: Improve Installation Documentation & Methods #5269 and [Bug]: Config reference docs missing in github #6222. Translation catalog sync deferred to follow-up docs(i18n): sync translation catalogs after the book rework #7472 per the routine-docs exception.
feat(gateway): route inbound webhooks per channel alias (#6312) #7367 — feat(gateway): route inbound webhooks per channel alias (feat(gateway): per-alias webhook path routing for multi-instance channels #6312). @singlerider CHANGES_REQUESTED active at 4d7c2e1; @Audacity88 APPROVED at 84942d; @WareWolf-MoonWall re-reviewed as COMMENT at HEAD (original channel-docs wording block addressed by author). Author action needed to satisfy @singlerider's remaining block before re-requesting review. Milestone v0.8.0.
fix(skills): sanitize skill tool names to satisfy provider name regex (#6678) #7399 — fix(skills): sanitize skill tool names to satisfy provider name regex ([Bug]: Skill tools rejected by Anthropic API —
format!("{}.{}", ...)produces names violating^[a-zA-Z0-9_-]{1,128}$#6678). CHANGES_REQUESTED, MERGEABLE.test(config): guard runtime_profiles.max_tool_iterations precedence (#6877) #7401 — test(config): guard runtime_profiles.max_tool_iterations precedence ([runtime_profiles.*].max_tool_iterations has no effect — must be set on [agents.*] instead #6877). APPROVED, MERGEABLE.
fix(runtime): require configured model switch profiles #7407 - fix(runtime): require configured model switch profiles. Merged as
d958a9bf689fa95b9f05a289866de599dbdad23d. Keeps [Feature]: Reconcile runtime model switching with provider structure for v0.8.0 #6557 shadowed by the landed provider-profile contract slice; follow-up scope remains separate if needed. Milestone v0.8.0.Added 2026-06-11 audit (new open PRs in the v0.8.0 milestone)
7a695b89; CLEAN/mergeable, all visible checks green. Replacement for feat(observability): Structured Observability Enhancement — Rich Events, OTel Trace Correlation, and Bridge Refactoring #7233 and first metadata-correlation slice for RFC RFC: Structured Observability Enhancement — Rich Events, OTel Trace Correlation, and Bridge Refactoring #7232. Labelsenhancement,risk: high,size: XL,agent,channel,gateway,observability,runtime. Milestone v0.8.0.risk: high,size: L,core,daemon,runtime. Milestone v0.8.0.bug,risk: medium,size: S. Milestone v0.8.0.cc2aea4; CLEAN/mergeable, all visible checks green. Fixes/api/config/list/RPCConfigListprefix filtering leaking string-prefixed sibling aliases (e.g.agents.aaaalso returningagents.aaalore). Non-blocking cleanup remains for the source test comment's unrelated [Bug]: zerocode Dashboard hides unavailable/error states and labels history as active sessions #7376 reference. Related [v0.8.0-beta-1] Gateway SPA fallback serves index.html for unimplemented /api/* routes — breaks dashboard JSON.parse #6862. Labelsbug,config,gateway,runtime,zerocode,risk: high,size: XS. Milestone v0.8.0.[providers.models]parse cleanly and are silently dropped by serde, so provider aliases vanish on reload; also corrects error text citing nonexistent[model_providers.<type>.<alias>]. Related [Bug]: Custom provider results in Doctor error model_provider "custom.<alias>" is invalid #7439. Labelsbug,config,provider,runtime. Milestone v0.8.0.migrate_to_current_salvagedper-alias pruning to providers so one malformed provider entry no longer drops the whole[providers]table. Labelsbug,risk: medium,size: S,config. Milestone v0.8.0.type: ci,ci,risk: high,size: XS. Milestone v0.8.0.bfffac7; CLEAN/mergeable, all visible checks green. Fixes [Bug]: quickstart success message suggests 'zeroclaw agent <alias>' which fails — -a/--agent flag is required #7506 by updating the CLI quickstart success hint to usezeroclaw agent -a <alias>, matching thezeroclaw agentCLI contract. Labelscore. Milestone v0.8.0.60105530; @WareWolf-MoonWall approved earlier, but the Audacity88 block is active. Author action needed to include the redirected-stderr/non-attendedTerm::stderr()path from [Bug]: quickstart infinite redraw loop on non-TTY stdin — flooded 4.3 GB of output instead of erroring #7507, not only piped stdin. Labelscore,bug,risk: low,size: XS. Milestone v0.8.0.c4b14a6; @WareWolf-MoonWall --comment at HEAD: two of three original blockers resolved (stderr TTY check, error message wording), two open blockers remain: (1)cli-quickstart-needs-ttyFluent key missing from es/fr/ja/zh-CN locale files; (2)Quality Gate/FormatCI check failing (runcargo fmt --all). Author action needed before re-requesting review. Labelscore,bug,risk: low,size: XS. Milestone v0.8.0.72121e9; CLEAN/mergeable, all 16 checks green. Repairs the persistence gap left by feat(config): per-field editing for [[mcp.servers]] via #[natural_key] #7267's per-field MCP editor: config/set on mcp.servers.. mutated memory (UI showed the new value) but the incremental save_dirty walker treated the [[mcp.servers]] array-of-tables as a plain table, so config.toml kept stale contents until restart. Adds a natural-key-aware writer branch plus 6 writer/dispatch regression tests. One 🔴 (resolve_dirty_segments_in is a verbatim copy of resolve_dirty_segments — delete the copy and reuse), one 🟡 (wrong-kind bail is silent; valid inline-array configs keep the original divergence symptom — WARN wanted), four 🔵. Author action needed on the 🔴, then quick re-review. Labelsbug,risk: medium,size: L,docs,config,runtime,provider:kilo. Milestone v0.8.0 (reviewer-directed for the v0.8.0 release; break-fix routing agrees).Untracked v0.8.0 issues (30 total: 24 open, 6 closed; refreshed 2026-06-11 audit)
enhancement,risk: high,size: XL,core,cron,needs-author-action. Milestone v0.8.0.enhancement,risk: high,size: S,agent,channel,config,runtime,needs-author-action. Milestone v0.8.0 as runtime/config stabilization work if maintainers still want this hook before the config/runtime boundary settles.enhancement,risk: high,size: S,config,cron,gateway,runtime,tool,needs-author-action. Milestone v0.8.0.allowed_private_hosts = ["*"]does not cover domain names that resolve to private IPs #7412 — [Bug]: web_fetch/http_requestallowed_private_hosts = ["*"]does not cover domain names that resolve to private IPs. [risk: high, priority:p2] Open.e5f3deb371c37342e1e65dcf663ae9497433d258.3bcb54e38b584602843d99d7669a8c4e8eaf0177.[2026-06-03 18:18:31 +08:00]rendered inside the message bubble instead of as separate metadata #7157 — [Bug]: Chat message timestamp rendered inside the message bubble instead of as separate metadata. [risk: medium, priority:p3] Open.2d68a576db4ce4d472130bbd453f9949971d7295.zeroclaw models setfalls through to model doctor instead of saving config #7087 — bug(cli):zeroclaw models setfalls through to model doctor instead of saving config. [risk: medium, priority:p2] Open.patchignores cooldown — unbounded patches per skill possible #6683 — skill_managepatchignores cooldown — unbounded patches per skill possible. [risk: high, priority:p2] Open.SKILL.toml, notmanifest.toml#6645 — SkillImprover + skill_manage only handleSKILL.toml, notmanifest.toml. [risk: high, priority:p2] Open.statusandservice statushardcodezeroclaw.service, so named instances report stopped #6227 — [Bug]:statusandservice statushardcodezeroclaw.service. [risk: medium, priority:p2] Open.b0b6fbe5afbe9987136de4752bab8035c3d4a8b4.Adjacent trackers (linked but separate, not v0.8.0 line-items): #6823 (TUI ACP Bridge) and #6825 (TUI UX) belong to the Zerocode/TUI track under #6826 per this tracker's scope rule, and are listed here only for visibility. They are not v0.8.0 release blockers unless a specific TUI item blocks the release itself.
Recent closures not previously listed (9 closed)
09d23509be06af8294dd128285a11c071cf02f89. Runtime reload defaults stay scoped to the owning channel runtime context while preserving configured provider resolution. Milestone v0.8.0.upsert_agentstomps on schema_version = 2 settings. Closed on 2026-06-10 under v0.8.0.7b3c49d9252f7914cab474dff8eefa363c8f64b0.0077daf89cffa1a13594fca40ae368d8c7fcdc47.152d339a92fc706f7a4283d0be4996d6e1f44880.bab4da859a940d2e28afe63588d4f65f6be44893.security.otp.gated_actionssilently accepts unknown action names #5810 - [Bug]:security.otp.gated_actionssilently accepts unknown action names. Closed on 2026-06-10; no longer an open v0.8.0 blocker. Existing related PR fix(config): warn on unknown security.otp.gated_actions entries (#5810) #6626 remains in the PR queue.Acceptance criteria
Architecture impact
This tracker does not make code changes. It coordinates work that may touch
zeroclaw-config,zeroclaw-tool-call-parser,zeroclaw-runtime,zeroclaw-providers,zeroclaw-channels,zeroclaw-gateway,zeroclaw-tools, plugin host functions, release docs, and install/default feature guidance.Risk and rollback
This is a tracker. Risk lives in the linked issues and PRs. If this grouping becomes stale, update the checklists, move items to a better tracker, or close this issue after the release queue is resolved.
Breaking change?
No. This issue tracks potentially breaking v0.8.0 work, but it does not itself change behavior.
Data hygiene checks