zeroclaw-labs/zeroclaw

audit: track 153 commits lost in bulk revert c3ff635 for recovery

Open

#6.074 aberto em 24 de abr. de 2026

Ver no GitHub
 (2 comments) (0 reactions) (1 assignee)Rust (4.614 forks)batch import
cienhancementhelp wantedpriority:p2risk: highstatus:in-progressstatus:no-stale

Métricas do repositório

Stars
 (31.341 stars)
Métricas de merge de PR
 (Mesclagem média 3d 17h) (778 fundiu PRs em 30d)

Description

Summary

Commit c3ff635300c03132441cbf9ae9ad0477a6e11ddb (2026-03-28) reverted 153 commits in a single bulk rollback, restoring master to 1362d69f. This revert was necessary at the time, but it also removed bug fixes, features, and improvements that had been reviewed, approved, and merged.

This issue tracks which commits have already been independently re-applied during the microkernel refactor and which are still missing and worth recovering.

Known recovery issues: #5259 (WeChat iLink channel), #2503 (NapCat/OneBot channel)

Note on deleted PRs: Some PR numbers referenced in commit messages return 404 on GitHub. A co-author on several of these commits (SimianAstronaut7, who also authored the revert) had their account blocked, which removed associated PRs and issues. Some external contributor PRs that list SimianAstronaut7 as co-author are also missing — likely opened from that account's fork. Where the PR record is missing, the entry links to the commit instead.

Status key

  • Re-applied — verified present in the current codebase
  • 🔲 Missing — verified absent, candidate for recovery
  • 🔀 Superseded — the underlying code was refactored or the bug no longer applies in the new architecture
  • ⏭️ Skip — merge commit, dep bump, or whitespace-only

Verified re-applied (51)

These fixes have been independently re-implemented in the current crate structure:

  • 2ddf7dcb #4544 — web_search_tool in default_param_for_tool mapping (tool-call-parser/lib.rs:807) ✅
  • 49e994a3 #4702 — Lark list message type handling (lark.rs:986, test at :2766) ✅
  • ffb015b3 #4552 — case-insensitive command allowlist matching (policy.rs:824) ✅
  • 143b34ea (commit) — SearXNG search provider config (schema.rs:2977) ✅
  • a4e6d772 #4314 — Slack audio file transcription (slack.rs:39) ✅
  • a3da42b1 — mention_only arg + voice_wake feature-gated errors (telegram.rs:367) ✅
  • 2a5866ec #4297 — extract binary from .tar.gz release assets (update.rs:212) ✅
  • 490c54e8 #4750 — allow high risk command execution (whitespace-only, no functional change) ✅
  • 8416af7d (commit) — local time for runtime_trace timestamps (production path at line 216 uses Local::now(); remaining Utc calls are temp file naming and tests only) ✅
  • 1e477f52 (commit) — respect max_history_messages in channel mode (orchestrator/mod.rs:1211) ✅
  • a993c96f #4690 — use stream_chat in turn_streamed for WS/webhook streaming (loop_.rs:547, ws.rs:467) ✅
  • 3b9c184e #4317 — Z.AI no_responses_fallback + Bailian alias (provider_aliases.rs:89, lib.rs:1293) ✅
  • e9c99f92 #4805 — preserve matrix thread context on first follow-up (matrix.rs:256-292) ✅
  • b7f3d0c9 #4680 — Matrix mention_only for group room filtering (re-applied by #6112 / ce3a968: current MatrixConfig.mention_only gates group rooms through is_group_room plus mention::is_mentioned, using m.mentions.user_ids when present and full MXID/localpart/display-name body fallback otherwise; direct rooms bypass via room.is_direct(). Focused validation passed: cargo test -p zeroclaw-channels mention --features channel-matrix -- --nocapture with 65 passed / 0 failed. The old string-strip helper is superseded by the Matrix SDK rewrite rather than carried as a separate preprocessing step.) ✅
  • 959057ab #4852 — wire session tools to composite backend for gateway visibility (re-applied by #6384 / c6a0ed7: current runtime session tools, channel orchestrator, and gateway /ws/chat persistence all call zeroclaw_infra::make_session_backend, so [channels].session_backend is the single configured store and gateway sessions are visible to sessions_list, sessions_history, and sessions_send. The old read-time CompositeSessionBackend wrapper is superseded by the factory plus SQLite-default JSONL import path. Focused validation passed: cargo test -p zeroclaw-infra make_session_backend --lib -- --nocapture with 4 passed / 0 failed.) ✅
  • 3ce90480 (commit) — respect path_prefix in get-paircode command (gateway routes nested under prefix at lib.rs:1100) ✅
  • 516a9cfb #4529 — resolve temp dir canonicalization on macOS (schema.rs:9418, seatbelt.rs:151) ✅
  • a279f5da #4438 — improve dashboard unavailable message for Homebrew (service/mod.rs:582-620) ✅
  • 9ce1b67a (commit) — prevent duplicate tool call notifications (superseded by #6093; dedup_exempt infra in schema.rs:1487) ✅
  • 15a630e4 #4763 — clarify public bind error message (gateway/lib.rs:413-422) ✅
  • 6044fa23 #4557 — resolve agent-browser npm shim on Windows (browser.rs:247-250) ✅
  • 59c9a2d1 #4181 — resolve claude-code test flakiness (superseded by #6093; agent.rs:2400-2410) ✅
  • ac355d40 #4897 — add GitHub Copilot to onboarding (re-merged as #5321, 9f245539f) ✅
  • 20593311 (commit) — enable MCP tools in webhook endpoint (re-applied by #6080, be106b681) ✅
  • 59ad6da0 #4687 — add closing tag to memory context injection (re-applied by #6082, 3b24f817) ✅
  • 3e0a08c1 (commit) — add missing bind paths for bubblewrap sandbox (re-applied by #6169, 62728c1ceb) ✅
  • df43e516 #4555 — respect path_prefix in paircode + shutdown commands (re-applied by #6169, 62728c1ceb) ✅
  • 8c3c890c (commit) — add timeout to Mattermost HTTP client (re-applied by #6169, 62728c1ceb) ✅
  • babe7f1e #4554 — inject current datetime into scheduler decision prompt (re-applied by #6169, 62728c1ceb) ✅
  • 74a94a1c #4499 — skip tools summary for native tools (re-applied by #6544, 3821550c) ✅
  • 4995c184 #4337 — exact arch triple matching for update downloads (re-applied by #6585, ed9bd52) ✅
  • 4f872cca #4310 — restrict reasoning_effort to known openai models (re-applied by #6631, d2dd45a) ✅
  • 7882897e #4573 — propagate Gemini token usage to cost tracker (re-applied by #6575, f8221ce) ✅
  • e7467e0a #4538 — fallback to non-streaming when Codex streaming fails (re-applied by #6668, ea825ce) ✅
  • d4ab8a47 #4213 — add --log-llm flag to dump LLM provider payloads (re-applied by #6709, 3e27b58) ✅
  • da742938 #4316 — gracefully skip unresolvable images instead of failing (re-applied by #6743, f6b90124) ✅
  • 46ca9364 #4410 — restore --interactive CLI compatibility; current bare onboarding is already interactive (re-applied by #6673, f1ced29e) ✅
  • ef9e52f3 #4803 — respect wildcard opt-out for subshell/redirect guards (re-applied by #5773, 247e2e18) ✅
  • 5b6d0585 #4108 — enable vision support for kimi-code provider (re-applied by #6809, 7f9271cb) ✅
  • ce6dd7ca #4688 — mask Groq API key + transcription keys in web UI (web config masking is already covered by current schema-derived secret masking; remaining Groq leak-detector pattern re-applied by #6812, 84413ff7) ✅
  • aabf2327 #4173 — preserve :cloud model tag for private remote Ollama servers (re-applied by #6863, 9c2522c4) ✅
  • ecd68feb #3526 — detect Homebrew install, use correct config path (re-applied by #6896, cc1a66b) ✅
  • f12c1761 #4533 — add streaming support to RouterProvider (remaining system-streaming delegation re-applied by #6935, f4d17ea; current master already covered supports_streaming, stream_chat_with_history, and structured stream_chat) ✅
  • c96bd63e #4434 — verify download checksum against SHA256SUMS (re-applied by #6900, ec4d0f7) ✅
  • a68f2dd3 #4301 — close draft sender after tool loop (current orchestrator drops delta_tx before awaiting the draft updater at crates/zeroclaw-channels/src/orchestrator/mod.rs:3422; original Telegram draft-hang regression is not present) ✅
  • 6469a262 #4149 — accept compatible typed content arrays (re-applied by #7010, 58c24e2c) ✅
  • 31737b16 #3271 — timestamp channel turns, use date-only prompts (re-applied by #6931, 9651e13) ✅
  • 371c59d1 (commit) — unify path resolution for file tools (remaining image_info path-resolution side re-applied by #6972, 708f1f6) ✅
  • b58d18d5 #4675 — fallback to non-streaming when stream errors (re-applied by #6983, 4ed0334) ✅
  • 51fd8ba5 #4315 — QQ audio attachment transcription (re-applied by #7109, f8641d2) ✅
  • ad48c1de #4114 — configurable global max_audio_bytes (re-applied by #7303, 81ce4f91) ✅

Confirmed missing — candidates for recovery (1)

  • b69e5ff5 #4320 — improve file_read robustness for large/binary files (large-file rejection is present through the current 10 MB file_read cap, but the binary/image rejection side is still missing: current file_read describes and tests lossy UTF-8 fallback for non-PDF binary data. Merged #7004 added explicit opt-in base64 binary reads/writes, but intentionally preserved default lossy UTF-8 behavior, so this default-mode robustness fix still needs a separate recovery PR.) 🔲

Open recovery PRs (4)

  • 753d4fc6 #3637 — SecretStore integration in http_request tool (covered by PR #7354; not marked re-applied until merged) 🔲
  • 21e23bd2 #4371 — interrupt_on_new_message for WhatsApp (covered by PR #7040; not marked re-applied until merged) 🔲
  • a54e9257 #4796 — 1Password secret resolution via op:// references (covered by PR #7085; not marked re-applied until merged) 🔲
  • d07f4208 #4254 — Telegram forwarded-message attribution (covered by PR #7251; not marked re-applied until merged) 🔲

Not yet checked — small fixes (0) — Completed 2026-06-05

No remaining unchecked small fixes.

Not yet checked — medium fixes (0) — Completed 2026-06-05

No remaining unchecked medium fixes.

Not yet checked — large fixes (0) — Completed 2026-06-05

No remaining unchecked large fixes.

Not yet checked — features (30)

  • 58353504 (commit) — persist per-chat model switch to routes.json
  • aa419d57 #4531 — path-validation fallback sandbox
  • 49620636 #4427 — unified VoicePipeline facade for STT+TTS
  • 4022879b #4504 — room creation + user invite API in Channel trait
  • 798aa936 (commit) — harden sandbox with seccomp + fail-closed
  • d00d5c28 #4502 — observe_group flag + per-chat session keys
  • 2252c3bb #4530 — per-channel DM pairing manager
  • ac680041 #4421 — shared SsrfValidator with CIDR blocking
  • 64043d64 #4403 — parse media markers in WhatsApp Web send
  • e5e4d27f #3682 — native_tool_calls_only config
  • 99f0b528 #4325 — /thinking command for per-sender reasoning toggle
  • 96643394 #4850 — precheck reply intent before typing/draft
  • 2d73133d (commit) — feishu transport media
  • 58ad2092 #4507 — client relationship node types
  • 7f08d4b0 #4285 — detect missing loginctl linger + prompt
  • df129fea #4336 — detect missing loginctl enable-linger
  • 1ff39882 #4435 — detect enable-linger on install
  • 20238a26 (commit) — Rust version check for build failures
  • 4fe1f1fd #4865 — Matrix media attachments + outgoing media
  • 78833057 #4845 — Mattermost WebSocket-based listener
  • c373d6c9 #4815 — movie extension with Douban + TMDB
  • 961d13ad (commit) — rate-limit cooldown + model compatibility
  • 56c7d605 #4685 — Tavily web search provider
  • 4eb9cbe4 #4428 — mDNS local peer discovery
  • 3f229c85 #4527 — calendar-driven no-show detection
  • 2dba7fe0 #4493 — fire message_sent hook after delivery
  • 070a0c20 #4290 — adopt AGENTS.md as primary instruction format
  • f657bba4 #4221 — WeChat iLink channel (tracked in #5259)
  • dd147dd0 #3571 — zeroclaw config reload (hot-reload)

Not yet checked — tests, infra, CI (13)

  • f685de05 #4883 — serialize Bedrock env-var tests (parallel race)
  • 74a211a5 #3830 — pushover unit tests + docs
  • f0ffb2b5 (commit) — WhatsApp config regression test (no [cli])
  • 1a1a27e1 #4432 — WhatsApp config regression test (no [cli])
  • d781fb5b #4734 — wrap LocalWhisperConfig.bearer_token in Some(...)
  • 359c8006 — consolidate Dockerfiles from 4 to 2
  • a57145cc #3934 — Homebrew release source archive with dashboard
  • 20c589ee #4839 — deployment environments in release workflows
  • 93ea780a #4719 — aspect-oriented refactoring examples
  • 7a5d6837 (commit) — chat history persistence
  • d4773099 (commit) — web chat history with optimized scroll
  • 248e13eb #4258 — WhatsApp Web cron delivery channel
  • 65ae6cb7 #4548 — live channel registry for WhatsApp Web cron

Needs investigation (14 small fixes) — Completed 2026-04-28

All 14 items checked (2026-04-28): 11 moved to re-applied, 2 to confirmed missing, 1 to skipped.

Checked / superseded small fixes (4)

  • 44eb057f #4696 — replay session history on WebSocket reconnect (superseded by #4792 / 5c7eccb and #6101 / d145a24: current master exposes GET /api/sessions/{id}/messages, and AgentContext hydrates chat from that endpoint before the shared WebSocket takes over) 🔀
  • 39891105 #4895 — fix #4855 / Channels API returning HTML instead of JSON (covered by #6069 / eebd7b6: current master routes GET /api/channels; the dashboard helper also accepts the current wrapped { "channels": [...] } response shape) ✅
  • 933f7a25 #4858 — fix sessions (re-applied by bf7380b5) ✅
  • 9fda248c (commit) — preserve web chat history across page reloads (superseded by the current GET /api/sessions/{id}/messages API plus AgentContext hydration/localStorage fallback; the backend also sends session_start and seeds the agent with stored messages on WebSocket resume) 🔀

Checked / superseded medium fixes (13)

  • a51620b4 #3296 — expose autonomy constraints to the model (superseded by the current risk-profile prompt path: #4037 / 96f25ac7 wires autonomy level into SafetySection, #4615 / 671577b4 keeps the model-facing wording direct, and #6398 / 18622d91 routes channel/webhook runs through per-agent risk_profile so prompts include runtime autonomy plus active security-policy constraints instead of the old standalone ## Autonomy Constraints block) 🔀
  • 6335a0d4 #4871 — download Discord image/video attachments for agent processing (re-applied by #6184 / 213b01dd and broadened by #6572 / ccb6beb29: current Discord preprocessing admits attachment-only messages, downloads non-text attachments once, emits IMAGE/VIDEO markers, stores MediaAttachment bytes on ChannelMessage, and the media pipeline classifies image/video MIME types for provider handling) ✅
  • 03d345b5 #4501 — skip responses fallback on transport errors (superseded by #6398 / 18622d91b: compatible.rs no longer has chat_via_responses or supports_responses_fallback; chat transport errors return directly, and /responses is isolated to OpenAiCodexModelProvider) 🔀
  • 80a91856 #4148 — prevent panic on UTF-8 multi-byte boundary in slug truncation (behavior present in crates/zeroclaw-runtime/src/skills/creator.rs; original CJK regression test not present) ✅
  • e2022f9e #4436 — consolidate multiple messages into single response (superseded by current AgentContext/AgentChat tool-activity toggle; tool activity is hidden from the conversation by default) 🔀
  • f17c6dce (commit) — disable responses API fallback for custom OpenAI providers (superseded by the current provider split: custom: uses chat completions through OpenAiCompatibleProvider; /v1/responses is handled by OpenAiCodexProvider / wire_api = "responses" profiles, not a 404 fallback path) 🔀
  • c74824a3 #4334 — make shell timeout configurable via config.toml (covered by later #4468 / ea9eccfe8; current master exposes [shell_tool].timeout_secs, wires it through the tool registry, and applies it in ShellTool execution) ✅
  • 735a1336 #3518 — configurable Ollama context size (superseded by #6178 / e6cbb33d; current master exposes config-backed ollama_num_ctx, ollama_num_predict, and temperature override) 🔀
  • f78a6d32 #4349 — separate draft tool narration lines (covered by #4394 / 0d2b57ee; current master still appends a missing newline before native tool-call narration is sent to draft-capable channels, with runtime regression coverage) 🔀
  • 6aab1288 #4444 — add channel-lark to default features (covered by current workspace feature graph: root default enables agent-runtime, agent-runtime enables channel-lark, and channel-lark forwards to zeroclaw-channels/channel-lark; Docker builds do not use --no-default-features, so the same default applies there) 🔀
  • 41c0abbf (commit) — whitelist safe shell redirects (covered by #6236 / ad34fa3f; current policy allows safe /dev redirects and fd redirects while still blocking file redirects and /dev path-boundary bypasses, with focused redirect-policy tests) ✅
  • 88d77ce3 #4359 — prevent draft streaming hang after tool loop completion (covered by #4393 / b85a44595; #4359’s commit carries no file diff, and current orchestrator drops delta_tx before awaiting draft_updater so the draft update task can observe channel close and exit) 🔀
  • 3c592593 (commit) — bound conversation history with LRU sender cap (re-applied by 709b867f) ✅

Checked / superseded large fixes (4)

  • 9528678e (commit) — trim oldest images instead of hard-failing when limit exceeded (re-applied by 541b273b) ✅
  • 61c32424 (commit) — preserve existing channel config when re-configuring (re-applied by 351986c2) ✅
  • dc05efa9 #4811 — reversible percent-encoding for session file keys (superseded by #6228 / 388657f68: current channel orchestration pre-sanitizes conversation history and memory keys with shared sanitize_session_key before they reach the JSONL/session backends, so hydration, list, load, memory recall, and runtime cache lookup all use the same normalized key. Current SQLite session metadata also stores channel_id, room_id, and sender_id separately, so original Matrix/platform IDs no longer depend on reversible filenames; #6541 / 247f2baf5 keeps channel session tools scoped to that same history key.) 🔀
  • 87698ad1 #4825 — treat tool_use/tool_result as atomic groups in history pruning (re-applied by #5167 / 1ec9c14c and hardened by #5485 / d72c2128, #5853 / a449a506c, and #5828 / 3d7f2ee0: current prune_history collapses and drops assistant+tool groups atomically, emergency_history_trim does the same, trim/load/channel hydration self-heal orphan tool results, and regression coverage includes multi-tool collapse/drop, realistic token pressure, protected recent groups, mixed-protection groups, and structured orphan cleanup.) ✅

Checked / superseded features (14)

  • be5e3e9d #4422 — message chunker with per-platform char limits (superseded by current channel-specific send-path chunking: Telegram uses TELEGRAM_MAX_MESSAGE_LENGTH plus send_text_chunks, Discord enforces DISCORD_MAX_MESSAGE_LENGTH through chunks_for_send, IRC splits PRIVMSG payloads by safe UTF-8 byte limit, Slack splits Block Kit text into bounded sections with truncation, and Lark splits interactive-card markdown by byte limit. The old shared src/channels/chunker.rs helper was unused foundation-only code and was not restored as a standalone module. Focused validation passed from detached origin/master: cargo test -p zeroclaw-channels split --features channel-telegram,channel-lark --lib -- --nocapture with 20 passed / 0 failed, cargo test -p zeroclaw-channels discord::tests::split --features channel-discord --lib -- --nocapture with 28 passed / 0 failed, and cargo test -p zeroclaw-channels irc::tests::split --features channel-irc --lib -- --nocapture with 11 passed / 0 failed.) 🔀
  • b67be417 #4332 — thinking/reasoning level control per message (the commit itself is tree-identical to its parent because #4277 / ffb8b81f already carried the feature plus the interactive prompt-restore fix; current master retains the feature in crates/zeroclaw-runtime/src/agent/thinking.rs and crates/zeroclaw-config/src/scattered_types.rs, wires /think:<level> through single-shot, interactive, and channel paths, and #5652 / fe570ce4 broadens the same config with opt-in native extended-thinking budgets.) ✅
  • da0b083e #4322 — provider_env for injecting API keys from config (superseded by typed encrypted provider API-key fields plus schema-derived env overrides; current config stores secondary provider credentials directly under providers.models.<family>.<alias>.api-key, encrypts them via SecretStore, and tests provider/custom-slot secret routing, so the old process-wide [provider_env] table is no longer needed.) 🔀
  • 6ab4d03b #4378 — Feishu/Lark cron delivery channel (superseded by #6851 / 3498f50e and later channel/runtime structure: current master routes lark and feishu cron announce delivery through crates/zeroclaw-channels/src/orchestrator/mod.rs, exposes both names in cron_add and cron_update, handles the shared [channels.lark.<alias>] config with use_feishu, and includes send-boundary plus route-to-lark-arm regressions.) 🔀
  • 002fe4c3 (commit) — upgrade claude-code provider to full agent mode (re-applied by 4919216b) ✅
  • ffea087c (commit) — ToolCallCard component for tool call display (re-applied by b08cf79a) ✅
  • 5d8d9aa2 #4822 — LINE Messaging API channel (re-applied by 6ce9a737) ✅
  • 936a7212 (commit) — generic transport stall watchdog (re-applied by 5a5d28f) ✅
  • 3e02e68e (commit) — ZhipuJwt auth for Z.AI and GLM providers (re-applied by 34ef7bfe) ✅
  • 6a8ff4c4 (commit) — email attachment download + multipart MIME (re-applied by dc7a7be7) ✅
  • 3f6e7c5c (commit) — WhatsApp Web mention_only for groups (re-applied by fab350eb) ✅
  • f3d8aa1f (commit) — MQTT channel configuration schema (re-applied by c6a980d0) ✅
  • bde81df1 (commit) — memory namespace isolation for delegate agents (re-applied by 9537885f) ✅
  • 9a3453e6 (commit) — per-sender rate limiting (re-applied by 90edff25) ✅

Checked / superseded tests, infra, CI (2)

  • bedbbdcb (commit) — unify env-var test sync across providers (re-applied by 92a98959) ✅
  • fbc654da (commit) — extract rate-limiting + path-guard wrappers (re-applied by 85f9e6a8) ✅

Skipped (16)

Merge commits, dependency bumps, docs-only, chore commits, and items whose target files no longer exist — not worth recovering individually.

  • a50e2304 (commit) — update blob/main→blob/master link in movie extension docs (file extensions/movie/CONTRIBUTING_GUIDE.md no longer exists in tree) ⏭️

17b9d93c docs, 95344a44 refactor READMEs, 8dd4c4b1 remove .coderabbit.yaml, 884747b8 merge commit, 1de30948 dep bump distroless, 0813c771 dep bump libloading, d4045117 merge artifact, 773a72ec merge commit, 01da1b4d remove RedNote badge, 40805d30 merge commit, a18fb885 dep bump cpal, 50425247 merge collision fix, be747242 web merge collision fix, 92440b2a docs only, e91806c1 trivial lint


How to help

  1. Pick an unchecked item, verify whether the fix exists in the current crate structure
  2. If missing: open a recovery PR porting the fix to the new architecture
  3. Update the checkbox and note the PR number

Original commits can be viewed with git show <sha>. All were against the old monolithic src/ structure and need porting to crates/.

Attribution: Recovery PRs supersede the original author's merged work. Follow the superseded-PR attribution rules in docs/contributing/pr-discipline.md — include Co-authored-by trailers for the original author and list the original PR in the body.

Guia do colaborador