Changelog
Changelog
Notable changes to the Lobster project — doc revisions, architecture updates, and new capabilities.
2026-04-03
Node Host for Remote Execution
- Configured the CLI node host (
openclaw node install) on the owner’s MacBook Pro, enabling the agent to selectively executesystem.runcommands on it viahost=node. The macOS app (device node) provides canvas, browser, and screen capabilities, while the CLI node host (core node) adds shell execution. Both run as separate connections to the gateway. - Key discovery: the macOS app’s exec approvals setting must be enabled for the node to accept
system.run.preparecalls from the gateway. Without it, the node advertises thesystemcapability but rejects all execution requests.
Documentation: Remote Access Guide Expanded
- Rewrote the “Node Access (Multi-Mac Setup)” section in the Remote Access guide to cover both node types (device vs. core), the full CLI node host setup flow, exec approval configuration, service management, and selective execution patterns. Published to lobster.shahine.com.
2026-04-01
OpenClaw v2026.4.1 Upgrade
- Upgraded from v2026.3.28 to v2026.4.1 — skipped v2026.3.31 due to regressions. Re-applied BB reply threading and WA group react patches against new dist bundle filenames. Retired 5 patches now fixed upstream: BB balloon debounce key (v2026.4.1), message tool buttons required (v2026.3.28), WA SecretRef inline (v2026.3.23), webhook route registry isolation (v2026.3.22), WA listener realm isolation (v2026.3.22), and status scope stripping (v2026.3.22). The sendPolicy inbound block patch is now in “monitoring” status — the old early-return pattern is gone in v2026.4.1 and needs live verification.
- Config:
config/patches.json,config/openclaw.json - Commit:
49ecee2
Cron Tool Allowlists
- Added per-tool
toolsarrays to 15 cron jobs — each job now declares exactly which tools it needs (e.g., daily note only getsread,write,exec,memory_search,memory_get). A job that only writes notes can’t send messages; a security audit can’t modify memory. This is least-privilege enforcement at the cron layer. - Config:
config/cron-jobs.json - Commit:
49ecee2
Event-Driven Package Matcher
- Replaced the scheduled Package Notification Matcher cron with event-driven handling — when the mail-router agent forwards a doorbell camera email, the main agent cross-references active deliveries via
parcel_listand alerts the owner on confident match. Eliminates polling, reduces token burn, and improves notification latency. - Config:
openclaw-agents/lobster/AGENTS.md(Package Doorbell Notifications section) - Commit:
49ecee2
WhatsApp Resilience Docs
- Added Resilience and Recovery section to the WhatsApp channel guide — documents the gateway health monitor (
channelHealthCheckMinutes), the listener realm isolation patch, and the SecretRef crash workaround. Also added troubleshooting entries for the WA listener false positive, mail agent delegation timeout (sessions_send30s default vs 33s typical flow), and the embedded agent SecretRef bypass. - Docs:
docs/guides/whatsapp-channel.md,docs/reference/troubleshooting.md - Commit:
49ecee2
Exec Approvals Expansion
- Added 5 new binaries to the exec allowlist —
browser-use(headless browser automation CLI),gh(GitHub CLI),curl,sleep, and ascripts/*glob for repo scripts. UpdatedlastUsedAtmetadata across existing entries for audit trail. - Config:
config/exec-approvals.json - Commit:
49ecee2
2026-03-31
Auto-Dream Memory Consolidation
- Installed openclaw-auto-dream community skill — cognitive memory architecture that runs periodic “dream cycles” via cron (daily at 4 AM). Each cycle scans unconsolidated daily logs, extracts decisions/facts/lessons, routes them to five structured memory layers (working, episodic, long-term, procedural, index), and sends a consolidation report. Importance scoring with forgetting curves (
max(0.1, 1.0 - days/180)) means older unreferenced memories decay naturally, whilePERMANENTmarkers protect critical knowledge. - Dream #1 ran on 2026-03-30 — scanned existing daily logs, added 2 new entries, updated 1 existing, reached 31 total. Generated insights about operational maturity patterns and flagged 2 stale threads (>14 days untouched). Created
memory/procedures.md(tool workflows, communication prefs, shortcuts) and initializedmemory/index.jsonwith v3.0 schema. - Notable features: stale thread detection (>14 days), skip-with-recall (surfaces an old memory when no new content exists), milestone celebrations, weekly summaries on Sundays, HTML dashboard auto-refresh, cross-instance migration via portable JSON bundles.
- Config:
openclaw-agents/lobster/skills/openclaw-auto-dream/, cron jobauto-memory-dream
Agent Review Skill
- New
/agent-reviewClaude Code slash command — Python extraction script scans session transcripts, gateway logs, and cron run history across all agents. Claude Code analyzes the condensed output and produces prioritized improvement suggestions (tool failures, user corrections, cron issues, capability gaps). First run surfaced 6 findings including browser tool gap in DM sessions and reservation monitor token burn. - Config:
.claude/skills/agent-review/SKILL.md,scripts/local-bin/agent-review-extract,config/agent-review-history.json - Commit:
68b1587
Social Dashboard over Tailscale
- Web dashboard served via Tailscale — responsive HTML dashboard at
/social/on the tailnet, alongside the existing PNG screenshot variant for iMessage. Lightweight Python HTTP server on port 18790 with a LaunchAgent keepalive. Two variants:dashboard-live.html(fixed 390px for PNG screenshots) andindex.html(responsive max-width 600px for web viewing). - Config:
config/com.lobster.social-dashboard.plist,scripts/local-bin/social-dashboard-serve - Commits:
46d8ae5,63b09a6
Adversarial Review Fix
- Fixed false positive on WhatsApp group IDs — the adversarial review GitHub Action was flagging
@g.us(WhatsApp group chat identifiers) as suspicious email exfiltration. Added domain-level allowlist to the pattern file. Also fixed missing permissions for the alert job. - Commit:
1c16889
Plugin Smoke Test Enhancement
- Added approval gate smoke test — verifies that gated tools (e.g.,
fastmail_get_email) are blocked by the approval gate when no one approves within the timeout. Runs as Batch 2b after ungated tool tests. - Commit:
1d5de83
2026-03-29
Social Planner Agent
- New dedicated agent for social dining coordination — the ninth agent in the multi-agent architecture. Tracks friends across three circuits (owner’s personal friends, partner’s friends, shared couples), monitors engagement recency, and proposes concrete dinner plans with date + restaurant pairings.
- Seeded with 24 months of history — 25 prospects, 38 engagements, 25 restaurants with booking platform info (Tock, Resy, OpenTable). Three recurring groups documented: DOJ (fine dining rotation), Taco Club, and Couples.
- Visual dashboard — HTML template rendered as a mobile-optimized PNG (390px, 2x retina) via headless Chrome screenshot. Dark theme with color-coded recency dots (green → red). Sent as iMessage attachment or email inline image.
- Monthly email review — cron job on the 1st of each month generates a 2-month forward view of open evenings, matches overdue prospects with restaurant suggestions, and emails from
[email protected]to the owner and partner via the mail delegate agent. - Agent-to-agent integration — main agent delegates social planning requests via
sessions_send. Group chat agent can also delegate directly. Family agent relays through the main agent. - Per-agent smoke tests —
smoke-tests.shverifies 6 dimensions: data file access, calendar visibility, contacts access, agent-to-agent discovery, browser tool, and denied tool enforcement. - Tool policy —
apple_pim_calendar+apple_pim_contact+browser+web_search+exec(allowlisted). All other plugins denied. Filesystem restricted to workspace only. - Config:
agents.list[social-planner],openclaw-agents/social-planner/,config/openclaw.json - Commit:
e191139
Calendar Query Strategy
- Added range query guidance to Apple PIM skill — agents now use single range queries (not day-by-day iteration) and reason about availability using
localStart/localEndfields. Reduces calendar API calls and prevents timezone bucketing errors when events span midnight UTC. - Config:
openclaw-skills/apple-pim/SKILL.md,openclaw-agents/lobster/AGENTS.md,openclaw-agents/lobster-groups/AGENTS.md - Commit:
75a6cc5,bc907bc
2026-03-27
Mail Agent Timeout Fix
sessions_sendtimeout increased from 30s default to 60s for mail delegation — the mail agent’s search-then-read flow (gateway routing + two Fastmail API calls + LLM summary) takes ~33 seconds, just exceeding the 30-second default. TOOLS.md now instructs the model to always passtimeoutSeconds: 60when delegating to the mail agent. Also addedbuttons: []required field guidance for the message tool (Telegram schema regression from OpenClaw v2026.3.24, patch #53749).- Config:
openclaw-agents/lobster/TOOLS.md
2026-03-26
HomeClaw Plugin v1.0.0
- Upgraded from skill-only stub to full native plugin — the old v0.0.1 plugin registered no tools and relied entirely on exec-based CLI invocation. The new v1.0.0 uses
definePluginEntrywith 16 registered tools (status, device_map, list, get, search, set, scenes, events, automations, rename, etc.). Plugin tools run viaexecFilein the gateway process, bypassing exec approvals entirely — faster and no approval prompts. - Mutation tools are opt-in — tools that actuate devices (
homekit_set,homekit_trigger,homekit_rename,homekit_import_scene,homekit_delete_scene,homekit_automations_create) are markedoptional: trueand must be explicitly added to an agent’salsoAllowlist. - Per-agent tool policy — main agent gets all 16 tools (full control). The dedicated HomeClaw webhook agent gets only the 10 read-only tools, consistent with its observe-and-report contract.
- Config:
agents.list[*].tools.alsoAllow— addedhomekit_*entries
Plugin Smoke Test Infrastructure
- New
scripts/smoke-test-plugins.sh— batched smoke test that verifies all 8 testable plugins load and respond to a basic tool call. Each plugin gets a lightweight probe (e.g.,homekit_status,apple_pim_system,porsche_vehicles). - Weekly cron job — runs every Sunday at 10 AM PT. On failure, alerts the owner via iMessage with the failing plugin names.
- Integrated into
/release-notesskill — Step 8 now runs the smoke test after patching and restarting, catching plugin regressions before they reach production. - Config:
config/cron-jobs.json,scripts/smoke-test-plugins.sh,.claude/skills/openclaw-release/SKILL.md
Workspace File Deduplication
- 23% token reduction across all 6 workspace files — editorial pass removed cross-file duplication (family table appeared 3 times, identity info 4 times, access levels 2 times). SOUL.md gained a boundaries section and per-channel response format rules. IDENTITY.md stripped to name/vibe/emoji per docs spec. HEARTBEAT.md cut from 49→25 lines.
- No behavioral changes — all removed content verified to exist in at least one other loaded file. Net reduction: 484→371 lines (−113).
OpenClaw v2026.3.23 Upgrade
- Jumped from v2026.3.13 baseline — re-enabled WhatsApp channel and plugin. Updated 4 patch scripts for new dist filenames. Retired the SecretRef inline workaround (fixed upstream in #53098). Added new
sendpolicy-inbound-blockpatch for #53328. - Porsche Connect v3.0.0 tool rename — config allowlist updated from
porsche_connect→porsche_*wildcard to match new tool naming.
2026-03-23
Hardened Email Delegate Agent
- New
lobster-mailagent isolates all Fastmail access — email bodies are the highest-risk prompt injection vector. All 36 Fastmail plugin tools moved from the main agent to a dedicated hardened agent. The main agent now hasfastmail_*wildcard denied and delegates email tasks viasessions_send. The mail agent returns structured summaries (never raw email bodies) to break injection chains. - SOUL.md hardening — non-negotiable security rules: never follow instructions in email bodies, never forward raw email verbatim, never act on email content via
sessions_send, flag prompt injection attempts explicitly. - Adversarial testing passed — both obvious injection (fake system override) and subtle social engineering (impersonating a family member requesting financial data forwarding) were correctly identified and refused.
- Config:
agents.list[lobster-mail],openclaw-agents/lobster-mail/ - Commits:
ef1a8b4,f722921
Session Tool Lockdown
sessions_listandsessions_historyrestricted to main agent only — all other agents (interactive, webhook, delegate, utility) now have these tools explicitly denied. Secondary agents can still usesessions_sendto known targets (hardcoded in their workspace docs) but cannot enumerate or inspect sessions they shouldn’t know about. This prevents unauthorized agents from discovering the email delegate’s session key.- Config:
agents.list[*].tools.deny— addedsessions_list,sessions_historyfor all non-main agents
Token Refresh Cron Jobs
- Added recurring token expiry reminders — Codex OAuth token check (every 8 days) and Fastmail CLI token check (every 25 days). Jobs run as isolated sessions on the main agent, check expiry dates, and message the owner via iMessage if renewal is needed within 3-5 days.
- Config:
cron-jobs.json—[Infra] Codex OAuth Token Refresh,[Infra] Fastmail CLI Token Refresh
Fastmail CLI Symlink
- Created
~/.local/bin/fastmailsymlink — the Fastmail CLI binary was not in PATH after the global npm package was uninstalled. Symlinked to the repo’scli/bin.shso the OpenClaw plugin can find it. - Filed: fastmail-mcp-remote#32 — plugin
cliCommandconfig not reachingapi.config
2026-03-22
WhatsApp Channel Resilience Overhaul
- Fixed silent WhatsApp outage caused by jiti VM realm isolation — after a DNS outage, the Baileys WebSocket reconnected but the listener registered in a new jiti realm. The delivery code’s
listenersMap was in a different realm, causing “No active WhatsApp Web listener” errors while the channel probe falsely reported “connected.” New patch (openclaw-patch-wa-listeners) bridges the Map viaprocess.__openclawWaWebListenersacross 7 dist files — same pattern as the webhook route registry patch. - Upstream issues: #50208, #45511, #50231, #50489, #49057
- Config:
scripts/local-bin/openclaw-patch-wa-listeners,config/patches.json
SecretRef Workaround for Embedded Agent
- Inlined all file-backed SecretRefs in config — the WhatsApp embedded agent bypasses the gateway’s resolved SecretRef runtime snapshot, reading raw config objects instead of resolved values. Every inbound WA message crashed with
unresolved SecretRef "file:secrets:/...". Replacedfile:secretsSecretRef objects with inline plaintext values fortools.web.search.apiKeyandtalk.apiKey. Also removedskills.entries(openai-whisper-api,sag) from global config since the WA agent doesn’t need them. - Reverses the 2026-03-15 SecretRef migration for the affected fields — SecretRefs can be restored once the upstream bug is fixed.
- Upstream issues: #49427, #45838
- Config:
skills→{},tools.web.search.apiKey→ plaintext,talk.apiKey→ plaintext
Channel Health Monitor Re-enabled
- Re-enabled
channelHealthCheckMinutes: 5— was disabled (0) since 2026-03-16 to stop a destructive restart loop on the WhatsApp channel (532 restarts/day). With the WA listener patch now in place, health monitor restarts correctly recover a dead listener instead of cycling endlessly. Default 30-minute stale threshold means auto-recovery within ~35 minutes of a channel going silent. - Config:
gateway.channelHealthCheckMinutes: 5
2026-03-16
Trakt Skill
- New
traktskill — view watch history, watchlist, and search movies/shows on Trakt.tv viatrakt-cli. Forked fromangristan/trakt-clito add missing features:watchlistcommand,--typefilter forhistory, andhistory addsubcommand with--watched-atsupport for backdating entries. - Binary:
/Users/lobster/go/bin/trakt-cli(built fromomarshahine/trakt-clifork) - Upstream PR: angristan/trakt-cli#5
- Exec approval: Added to
lobsteragent allowlist only (personal to Omar) - Config:
openclaw-skills/trakt/SKILL.md,config/exec-approvals.json,openclaw-agents/lobster/TOOLS.md
WhatsApp Stale-Socket Restart Loop Fix
- Disabled gateway channel health monitor — the default stale-socket detector restarted the WhatsApp connection every ~30 minutes when no messages arrived, causing a destructive cycle (532 restarts/day) with WebSocket errors (status 499, 428). For low-traffic channels like a family group, this threshold is too aggressive.
- Fix:
gateway.channelHealthCheckMinutes: 0disables health monitoring globally. All three channels (Telegram polling, BlueBubbles webhooks, WhatsApp/Baileys WebSocket) have native reconnection mechanisms that handle actual disconnections. - Per-channel control coming: OpenClaw PR #42107 adds
channels.<provider>.healthMonitor.enabledfor per-channel overrides — tracked in issue #128 for migration once released (expected >= 2026.3.14). - Config:
gateway.channelHealthCheckMinutes: 0in both repo and live configs
Cron Delivery Leak Fix (Incident Resolution)
- Eliminated
delivery.mode: "announce"from all conditional cron jobs — 5 isolated cron jobs were usingannouncemode, which auto-delivers ALL agent output including internal reasoning. When models narrated before theNO_REPLYtoken (e.g., “The installed version is 2026.3.13…NO_REPLY”), the exact-match suppression (synthesizedText === "NO_REPLY") failed and reasoning text leaked as iMessages. - Root cause: The
announcepipeline’snormalizeReplyPayloadstrips the NO_REPLY token but delivers any remaining text. This is systemic, not model-specific — any model that narrates before the silent token triggers it. - Fix: All 5 jobs switched to
delivery.mode: "none"with prompts updated to send actionable messages viasessions_sendtool explicitly. Zeroannouncejobs remain. - New
/manage-cronskill — encodes all lessons from this incident into a create/review/audit skill for cron job management. - Config:
config/cron-jobs.json(alldelivery.modevalues),debug/cron-reference.md(delivery modes documentation)
Inbound Image Tool Regression Fix
- Disabled
tools.fs.workspaceOnly— this flag restricted the image tool and native vision auto-injection to only read files within the workspace directory. Inbound media from iMessage is stored at~/.openclaw/media/inbound/, which is outside the workspace, so all image reads failed silently. - Root cause:
workspaceOnly: truewas set on the main agent but not on any other agent. It gates two independent code paths: theimagetool’sresolveMediaToolLocalRoots()and the prompt auto-injection’sassertSandboxPath(). Both rejected media paths outside the workspace. - Previous fix was wrong target: An earlier fix added
mediaLocalRootsto the BlueBubbles channel config — but that controls outbound media sending, not the image tool’s inbound reading. - Config:
agents.list[lobster].tools.fs.workspaceOnly: false
2026-03-15
SecretRef Migration Complete
- Migrated 5 credentials from plaintext to file-backed SecretRef — skill API keys (
openai-whisper-api,sag), TTS key (talk.apiKey), and web search key (tools.web.search.apiKey) now resolve at runtime from~/.openclaw/secrets.jsoninstead of being stored as plaintext or env-var references in the config. Reverses the temporary plaintext workaround from 2026-03-14. - 3 credentials remain as env vars by design —
gateway.auth.token,channels.telegram.botToken, andchannels.bluebubbles.passwordcannot use SecretRef because CLI commands (openclaw status,openclaw doctor) read these directly from the config file without the gateway’s secrets runtime. - Config:
skills.entries.*.apiKey,talk.apiKey,tools.web.search.apiKey→ SecretRef objects;~/.openclaw/.envreduced to 6 non-migratable vars
Exec Compliance Overhaul
- TOOLS.md rewritten to eliminate bare-name exec calls — analysis of 253 historical exec calls found 86% used bare command names (
cat,python3,openclaw) instead of absolute paths, causing every call to trigger an approval prompt that auto-denied after 120 seconds. Added a complete path lookup table (27 binaries), a “DO NOT EXEC” table mapping common bare names to native tool alternatives (cat→read,travel-hub→plugin tools), and clearer consequence framing. /usr/bin/openadded to exec allowlist — the agent can now launch Chrome and other macOS apps without approval prompts
Browser Tool Migration
- Switched from Chrome DevTools MCP to OpenClaw-managed CDP — browser section in TOOLS.md rewritten for the built-in
existing-sessiondriver withattachOnly: true. Removed all references to--autoConnectflow and consent prompts. - Removed
agent-browserfrom config baseline — the legacy agent-browser binary is no longer expected
Eight Sleep Skill
- New
eightctlskill — controls Eight Sleep Pod 4 Ultra mattress via the eightctl CLI. Supports bed temperature, alarm scheduling, and sleep tracking.
Browser Setup Rebuilt
- Switched from
existing-sessionto managedopenclawprofile — the oldattachOnly: truedriver required manually launching Chrome with--remote-debugging-portand--user-data-dir, which broke when Chrome wasn’t running. The managed profile auto-launches an isolated Chrome instance viabrowser start/browser stop. - Disabled node browser proxy —
gateway.nodes.browser.modeset to"off"to prevent a paired remote node from interceptingbrowser.requestRPCs. This was the root cause of allopenclaw browserCLI commands returning “UNAVAILABLE: Could not connect to the server” even though the local gateway was healthy. - TOOLS.md browser section rewritten — removed
--browser-profile userflags, manual Chrome launch steps, and session cleanup (quit Chrome). Simplified tobrowser start/browser stopwith no profile flag needed. - Config:
browser.defaultProfile→"openclaw",gateway.nodes.browser.mode→"off", oldbrowser.profiles.userremoved
Porsche Climate Skill
- New
porscheskill with delayed climate scheduling — controls Porsche vehicle climate viaporsche-climatise.shwrapper. Uses one-shot cron jobs to schedule climate pre-conditioning (e.g., “warm up the car in 20 minutes”). Credentials stored insecrets.json, not in the repo.
Calendar Date Bug Fix
- Documented ISO+offset parsing bug in
calendar-cli— timestamps with timezone offsets (e.g.,-07:00) are silently mangled: the parser drops the offset and falls back to noon with zero duration. No error is returned. The apple-pim SKILL.md now warns against this format and recommends wall-clock strings (2026-03-15 1:30 PM) as the preferred format. - Added verify-after-write checklist — agents must now
getevery event aftercreate/updateand confirm calendar, start/end times, location, and duplicates before reporting success. Calendar moves follow a create→verify→delete-original sequence.
Exec Multiline Argument Fix
- New
send-email.shwrapper — multiline text in exec arguments (e.g.,mail-cli send --body "...") triggers the obfuscation detector, causing approval prompts for allowlisted commands. The wrapper reads the body from a file instead. - TOOLS.md Rule 3: no multiline in exec args — added explicit guidance against multiline strings in exec arguments, plus improved denial-state handling (stop retrying on approval-pending, handle approval-unavailable).
Eight Sleep Away Mode Automation
- New cron job automates Away/Home mode based on travel — reads
familyLocationsfrom heartbeat state (written by the Family Location Tracker ontravel-hubagent) and runseightctl away on/off --both --quietwhen both family members leave Seattle or either returns. Runs at10 5,14 * * *UTC (10 minutes after the location tracker). Only announces to iMessage when state actually changes.
Status Scope Patch
- New
openclaw-patch-status-scope— workaround for v2026.3.13 regression whereclearUnboundScopes()stripsoperator.readfrom token-authenticated loopback CLI probes (upstream issue #47307). Affectsopenclaw status,openclaw browser, andopenclaw security audit --deep.
2026-03-14
Dedicated WhatsApp Agent
- New
lobster-waagent isolates all WhatsApp traffic — DMs and groups now route to a dedicated agent with its own workspace, exec allowlist, and tool policy. Prevents WhatsApp-specific issues (config regressions, channel errors) from affecting iMessage and other channels. - Shadow/observe mode for group chats —
session.sendPolicydeny rule blocks auto-replies in WhatsApp groups (channel: whatsapp, chatType: group). The agent can still observe messages and react with emoji, but never sends text into groups unprompted. - Cross-agent heartbeat monitoring — main agent reads the WhatsApp agent’s session via
sessions_historywith keyagent:lobster-wa:whatsapp:group:*during heartbeat check-ins and daily summaries. No direct WhatsApp session needed on the main agent. - Config:
agents.list(new lobster-wa entry),bindings(WhatsApp → lobster-wa),session.sendPolicy,tools.agentToAgent.allow
SecretRef Resolution Workaround
- Removed
nano-banana-proskill entry — v2026.3.13 regression brokeskills.entriesSecretRef resolution (assertSecretInputResolvedthrows on raw SecretRef objects). The broken skill entry causedweb-auto-replyto spam error messages into the WhatsApp family group on every inbound message. - Inlined remaining skill API keys —
openai-whisper-apiandsagskills switched from SecretRef objects to plaintext keys as a temporary workaround until SecretRef resolution is fixed upstream. - Config:
skills.entries
WhatsApp Agent Exec Allowlist
- Minimal exec surface for
lobster-wa— allowlist includes travel-hub, mail CLIs (read-only), WhatsApp CLIs (wa, wacli), and basic utilities (date, cat, ls, head, tail, grep, wc). No file modification, no browser, no cron. - Config:
exec-approvals.json(newlobster-waagent section)
2026-03-13
Webhook Hook Security Hardening
- Cleared all 3 critical findings from
openclaw security audit— hooks previously allowed any authenticated caller to route to any agent and override session keys without restrictions - Added
allowedAgentIds: ["travel-hub", "homeclaw"]— webhook callers can now only target the two agents that actually use hooks, preventing escalation to the main agent session - Added
allowedSessionKeyPrefixes: ["hook:"]— constrains session key overrides to thehook:*namespace - Set
allowRequestSessionKey: false— mapping-levelsessionKeyfields still work (they pass prefix validation), but request payloads can no longer override them - Config:
hooks.allowedAgentIds,hooks.allowedSessionKeyPrefixes,hooks.allowRequestSessionKey
Approval Buttons Plugin Retired
- Removed
approval-buttonscommunity plugin — native Telegram exec approvals (added in OpenClaw v2026.3.x) now handle inline approve/deny buttons viachannels.telegram.execApprovalswithcapabilities.inlineButtons: "dm" - Deleted
~/.openclaw/extensions/approval-buttons/— removes untracked local code warning at startup - Baseline updated —
approval-buttonsandaight-utilsremoved fromplugins.allowinconfig-baseline.json
Meeting Check DST Fix
- Replaced hardcoded PST offset with
ZoneInfo('America/Los_Angeles')—early-late-meeting-check.shnow correctly handles PDT/PST transitions instead of being permanently UTC-8
Release Skill Patch Management
/openclaw-releaseskill now manages patches — readsconfig/patches.json, runs--checkon active patches after updates, re-applies if needed, suggests retiring when upstream fixes land- New
config/patches.json— centralized registry of active and retired OpenClaw patches with issue references and script paths
Security Audit Enhancements
- Model auth health checks — security audit now verifies OAuth token status and flags expiring/expired profiles
- Model fallback monitoring — detects auth-failure fallbacks in gateway logs (indicates primary model may be unreachable)
- Cron prompt hardened — security audit cron job now only messages Omar when there are actual errors, not routine status summaries
Tailscale MagicDNS Fix
*.ts.nethostnames failed to resolve on the agent Mac — Tailscale’s Homebrew-installedtailscaleddaemon only created/etc/resolver/search.tailscale(handles*.search.tailscale), missing the/etc/resolver/ts.netfile needed for MagicDNS split-DNS. Thenameserver 100.100.100.100line was also absent.- Added
com.lobster.tailscale-dnsLaunchDaemon — self-healing plist that ensures/etc/resolver/ts.netexists with the correct nameserver entry. UsesWatchPathson/etc/resolver/to re-create the file if Tailscale updates or OS changes wipe it. - Control UI now reachable via Tailscale Serve —
https://lobster.taila6405e.ts.netproxies tohttp://127.0.0.1:18789viatailscale serve
2026-03-12
WhatsApp Family Group Fix
requireMention: truesilently blocked all inbound messages — the family WhatsApp group hadrequireMention: true, which causedapplyGroupGatingto filter every message before it reached the agent session. Nobody @mentions the agent in family chat, so the session had zero inbound messages. The agent couldn’t react because it never saw any message metadata.- Fix: set
requireMention: falsefor the family group — the*wildcard remainsrequireMention: truefor other groups. Config:channels.whatsapp.groups["<group-jid>"].requireMention: false - Key diagnostic: empty session transcript (0
role:userentries) was the telltale sign — always check group gating config before investigating tool-level issues
Exec Approval Spam Reduction
- Root cause: obfuscation detector blocks shell constructs unconditionally — 11 of 13 recent exec denials were 120s timeouts from compound commands (
&&,|,$()) during unattended cron/heartbeat runs. Shell binaries (/bin/bash,/bin/zsh) were briefly allowlisted but reverted — they don’t bypass the pipe/redirect blocker. - Created
sync-config-to-repo.shworkspace script — replaces compoundcp/catchains with a single executable script covered by the workspace glob - Added exec safety banner and 5 DENIED→FIX examples to TOOLS.md — teaches agents to avoid obfuscation-triggering patterns (commits
f84eeb4,c35fa30) - Fixed skill files —
apple-mail,trafilatura,bluebubbles-health,apple-pimupdated to use absolute paths
New Debug Skills
/debug-approvals— exec approval log inspector: history, denied/timed-out commands, audit trail/debug-homeclaw— HomeKit webhook diagnostic with pipeline, log formats, timezone notes/debug-travel-hub— Travel Hub notification routing, webhook delivery, flight tracking phases
New Scripts and Skills
wa-group-send— WhatsApp group message wrapper (scripts/local-bin/wa-group-send)openclaw-patch-bb-reply— BlueBubbles reply threading patch: lazy-refresh of server info when Private API status cache expires after 10 minutes- Trafilatura web scraping skill — shared OpenClaw skill for web content extraction via CLI (commit
4c95290) - WhatsApp skill for lobster agent — SKILL.md with chat map and messaging instructions
sync-config-to-repo.sh— workspace script for clean config sync without shell constructs
Security Baseline Update
- Updated
config-baseline.json— now tracks Travel Hub, Obsidian, andagentToAgent.allowconfig (commitee193f7) - Added
HOMECLAW_WEBHOOK_TOKENto.env.example
Upstream OpenClaw (v2026.3.11)
- BB import shim patch retired — fixed upstream in v2026.3.11. Patch script reports “OK” and is a no-op.
- Notable upstream fixes: sandboxed
session_statusvisibility, iMessage self-chat dedup, invisible exec approval format char escaping,GIT_EXEC_PATHblocked in host env sanitizer
2026-03-08
Compaction Tuning
- Increased
recentTurnsPreservefrom 3 to 5 — during safeguard compaction, the last 5 user-initiated turns are now preserved verbatim instead of being summarized. Improves continuity for multi-step tasks (email triage, travel planning) that span compaction boundaries. - Investigated
postCompactionSectionsfrom v2026.3.7 release notes — field does not exist in source; the post-compaction section extraction is hardcoded to## Session Startup+## Red Lines(fallback:## Every Session+## Safety). No action needed — current agent sections match the fallback names. - Investigated
prependSystemContext/appendSystemContext— plugin manifest fields mentioned in release notes but not yet documented or usable. Plugin authors would need to adopt. - Config:
agents.defaults.compaction.recentTurnsPreserve: 5
Astro Build Cache Fix
- Clear
data-store.jsonbefore Starlight builds — the Astro content cache causes “Duplicate id” warnings when symlinked content files change between builds.deploy.shnow runsrm -fon the cache before build. (commitb209c78)
Obsidian Vault Native Plugin
- Built OpenClaw plugin wrapping mcp-obsidian via mcporter — 11 native gateway tools (
obsidian_read_note,obsidian_write_note,obsidian_patch_note,obsidian_search_notes, etc.) that run inside the gateway process. No exec calls, no sandbox escape, no approval prompts needed. - Root cause: exec approval spam — GPT-5.4 issued compound shell commands (
&&,|,$()) which triggered the obfuscation detector even though individual binaries were allowlisted. Each compound command generated a Telegram approval prompt. - Added exec rules to TOOLS.md — documents the obfuscation detector behavior so agents know to use one clean command per exec call
- Intentionally excluded destructive tools —
delete_note,move_note,move_fileare not exposed. Read/write/search only. - Config:
plugins.allow += "obsidian-vault", 11 tools added totools.alsoAllow - Source:
openclaw-plugins/obsidian/(commitb7263a7)
Family Location Tracker
- New cron job on travel-hub agent — runs 2x/day at 05:00 and 14:00 UTC (covers morning in US Pacific and European timezones)
- Queries Travel Hub itinerary to determine each family member’s current city, country, and timezone. Non-travelers default to home locations.
- Writes
familyLocationsto heartbeat-state.json — structured data with per-member city, country, timezone, and source (home, trip name, or flight number) - All agents now timezone-aware — updated HEARTBEAT.md for main, family, and group agents to read family locations during heartbeat cycles
- Config: cron job
a44d34dcontravel-hubagent,sessionTarget: "isolated",delivery.mode: "none" - Documented the heartbeat state pattern — new section in the how-to guide explaining the
heartbeat-state.jsonpattern for cross-session persistence, idempotent checks, and cross-agent state sharing
Travel Hub Agent Memory and Routing
- AGENTS.md symlinked to travel-hub repo — single source of truth for agent instructions
- Added MEMORY.md with notification routing tables for the travel-hub agent
- Added BlueBubbles chat thread map to CLAUDE.md — DM and group chat GUIDs for all family members (commit
7a1cc20)
2026-03-07
Claude Code Skills Migration
- Migrated all 13
.claude/commands/to.claude/skills/— skills support auto-discovery, so Claude loads diagnostic playbooks automatically when context matches (e.g., mention “iMessage broken” anddebug-bbactivates without/debug-bb) - Added
openclaw-cliskill — background reference skill (user-invocable: false) that Claude loads when it needs OpenClaw CLI syntax. Covers all subcommands, flags, and options. - Merged
/changelogand/update-docsinto a single/update-docsskill that generates both the activity changelog (Obsidian) and docs changelog (Starlight site) - Activity changelogs moved to Obsidian — now written to
~/Obsidian/.../changelogs/instead of the git repo. PII rules relaxed since they’re private.
Obsidian Note Headless Rewrite
- Removed
obsidian-clidependency —obsidian-notenow uses direct file I/O on the vault directory. No GUI or URI scheme needed. - Fixed vault path — updated from iCloud Drive (
~/Library/Mobile Documents/...) to headless sync location (~/Obsidian/Obsidian - Lobster 🦞/) - Fixed zsh emoji encoding — vault path resolution uses Python to avoid zsh mangling the lobster emoji in
$HOMEexpansion - Added dual filename format support — daily note reads try both
YYYY-Mon-DDandYYYY-MM-DDformats - Added
daily createsubcommand — creates tomorrow’s note from template, used by the daily note cron job - Obsidian skill updated — Claude Code instructions now reference direct file operations (
Read/Write/Edit) instead of CLI wrappers
Headless Obsidian Sync
- Set up Obsidian Headless (
obsidian-headlessv0.0.6) for continuous vault sync without the Obsidian GUI - Created LaunchAgent
com.lobster.obsidian-sync— runsob sync --continuouswithKeepAlive: true, auto-restarts after crashes or reboots - Replaces iCloud Drive sync — headless Obsidian Sync provides direct bidirectional sync with the Obsidian Sync service, keeping the vault current across all devices
- Updated
docs/guides/obsidian-vault.mdwith headless sync setup instructions and architecture diagram - Config:
config/com.lobster.obsidian-sync.plist
Cross-Channel Access via sessions_send
- Documented
sessions_sendcross-channel pattern — when themessagetool is bound to the current session’s channel (e.g., BlueBubbles), agents can usesessions_sendto delegate actions to sessions on other channels (e.g., WhatsApp). The agent run executes in the target session wheremessageis bound to the correct channel. - Added to Lobster AGENTS.md — new “Cross-Channel Access via sessions_send” section with the pattern, required config, and usage examples
- Added to multi-agent architecture — new subsection under Agent-to-Agent Messaging explaining the mechanism and required config (
per-channel-peerdmScope,allvisibility) - Added to WhatsApp channel guide — new “Cross-Channel Access (from BlueBubbles)” section with step-by-step instructions
- Informed Lobster agent — sent direct message via gateway explaining the pattern; Lobster acknowledged
Travel Hub Convenience Tools
- Added
trips_get_detailsMCP tool — returns a trip with all linked records (flights, hotels, activities, ground transport) in one call - Added
itineraryMCP tool — returns all itinerary items for a date or range (accepts “today”, “tomorrow”, YYYY-MM-DD) - Added REST endpoints —
GET /api/trips/[id]/detailsandGET /api/itinerary?date=today - Added CLI commands —
travel-hub trips details <id>andtravel-hub itinerary <date> - Added OpenClaw plugin tools —
travel_hub_itineraryandaction=detailsontravel_hub_trips - Updated all docs — TOOLS.md, SKILL.md, CLAUDE.md, README across both travel-hub and lobster repos
Webhook Agent Config Sync
- Added
subagents.allowAgentsto HomeClaw and Travel Hub —agents_listis filtered by per-agentsubagents.allowAgents, nottools.agentToAgent.allow. Without this, webhook agents could only see themselves when callingagents_list, breaking agent-to-agent discovery. Both now list["lobster", "lobster-family", "lobster-groups"]. - Added
agents_listtoalsoAllowfor both webhook agents — tool was configured in workspace docs but missing from the tool policy - Added agent definitions to repo config —
config/openclaw.jsonwas missing thehomeclawandtravel-hubagent entries that existed in the live config - Added both agents to
agentToAgent.allow— required forsessions_send(both sender AND target must be in the allow list) - Updated workspace docs — replaced generic boilerplate AGENTS.md/TOOLS.md with agent-specific documentation covering tool access, a2a routing, and event classification
- Synced travel-hub skill and agent docs from upstream
~/GitHub/travel-hub/openclaw/ - Updated
docs/architecture/multi-agent.mdwithsubagents.allowAgentsrequirement and corrected config examples - Config:
agents.list[homeclaw].subagents,agents.list[travel-hub].subagents,tools.agentToAgent.allow
2026-03-06
Dedicated Webhook Agents (HomeClaw + Travel Hub)
- Created two dedicated webhook agents —
homeclaw(HomeKit events) andtravel-hub(travel data changes) — replacing the previous pattern of routing all webhook events to the main agent - Architecture: event classification + a2a notification — Webhook agents receive events via mapped endpoints (
/hooks/homeclaw,/hooks/travel-hub), classify them (routine vs meaningful), and notify the main agent viasessions_sendonly when action is needed. Routine events are logged silently. - Transform layer — Each webhook has a JS transform in
~/.openclaw/hooks/transforms/that pre-processes raw payloads before they reach the agent, filtering test events and normalizing formats without consuming model tokens - Minimal tool surface — Webhook agents have only a2a messaging, memory, and read/write. No exec, no browser, no unrelated plugins. Travel Hub additionally has
travel_hub_*plugin access and subagent spawning. - Independent auth — Each agent has its own
auth-profiles.jsonfor isolated token rotation and usage tracking - Default model updated —
agents.defaults.model.primaryset toopenai-codex/gpt-5.4(wasgpt-5.3-codex); all five agents now use gpt-5.4 - Updated
docs/architecture/multi-agent.mdwith webhook agent pattern, transform documentation, and hook mapping configuration - Config:
agents.list[homeclaw],agents.list[travel-hub],hooks.mappings,agents.defaults.model.primary
Cron Skill (New)
- Created
cronshared skill (openclaw-skills/cron/) — comprehensive reference for Lobster on creating and managing cron jobs via thecrontool API - Main vs isolated decision guide — when to use
main+systemEvent(workspace-dependent tasks like calendar checks, exec scripts) vsisolated+agentTurn(self-contained background tasks) - Relay prevention — documents the
INTERNAL TASKprefix requirement for main-session jobs that use tools, preventing the heartbeat runner from forwarding raw cron instructions to the user as messages - Tool API templates — ready-to-use JSON shapes for
cron.add,cron.update,cron.remove,cron.list,cron.runwith examples for recurring, one-shot, interval, and chained jobs - HEARTBEAT_OK / NO_REPLY convention — explicit guidance on signaling “nothing to do” for both session types
Cron Job Fixes
- Fixed relay bug — main-session cron jobs were forwarding raw task instructions to the user as iMessages. Root cause: OpenClaw v2026.2.24 (
e2362d352) addeddeliverToUserbranching tobuildCronEventPrompt; when the session has a delivery target, it wraps the text with “relay this to the user.” Fix: addedINTERNAL TASK — do NOT relayprefix to all tool-using systemEvent payloads andHEARTBEAT_OKas the no-action response - Removed redundant WhatsApp Family Chat Monitor cron — functionality already covered by HEARTBEAT.md daily tasks using native WhatsApp channel support
- Fixed Iran Flight Monitor delivery — changed
delivery.modefrom"none"(with orphaned channel/to fields) to"announce"withbestEffort: true, matching thewakeMode: "next-heartbeat"pattern - Config:
~/.openclaw/cron/jobs.json
2026-03-05
Exec Approvals: New Allowlist Entries
- Added
/usr/bin/find— directory traversal (previously triggering approval prompts) - Added
/opt/homebrew/bin/rg— ripgrep search (installed viabrew install ripgrep15.1.0) - Added
/usr/bin/defaults— macOS plist reader for config inspection - All three pushed live to gateway via
openclaw approvals set --gateway
Ripgrep Installation
- Installed ripgrep (
brew install ripgrep) — was previously only available as a Claude Code built-in alias, not accessible to the OpenClaw gateway exec tool - Binary at
/opt/homebrew/bin/rg, already on exec-approvals allowlist
HomeClaw Skill Awareness
- Informed Lobster about the HomeClaw plugin skill at
~/.openclaw/extensions/homeclaw/skills/homekit/SKILL.md - Key workflow: read
memory/homekit-device-map.jsonbefore first HomeKit action, use UUIDs for set commands - Documented
homeclaw-cli eventsfor checking webhook event history
Obsidian Tooling Clarification
- Identified that Lobster was using
python3 -cfor Obsidian vault edits, triggering obfuscation detector approvals - Directed Lobster to use
obsidian-noteCLI (already allowlisted) instead ofpython3 -corobsidian-cli obsidian-notesupports: read, append, prepend, replace, create, search, list, daily note operations
2026-03-04
Browser Automation: agent-browser (New)
- Replaced OpenClaw built-in browser with
agent-browser— a Rust-based headless browser CLI by Vercel Labs, optimized for AI agents - Installed globally via npm (
/opt/homebrew/bin/agent-browserv0.16.3) with bundled Chromium - Added as OpenClaw skill — symlinked to
~/.openclaw/skills/agent-browser/(visible to all agents), loaded from~/.agents/skills/agent-browser/ - Added to exec allowlist for the lobster agent in
exec-approvals.json - Updated TOOLS.md with agent-browser core workflow, key commands, session persistence, and important rules (ref lifecycle, no shell pipes)
- Updated Blue Bottle skill — migrated from OpenClaw built-in
browsertool toagent-browsercommands with snapshot-ref interaction pattern - Key workflow:
open <url>→snapshot -i(get@e1,@e2refs) → interact with refs → re-snapshot after navigation - Also installed: Claude Code skill at
~/.claude/skills/agent-browser/for local development - Restricted agents (
lobster-groups,lobster-family) do not haveagent-browseron their exec allowlist — browser access remains denied
QMD Memory Backend (New)
- Switched memory backend from SQLite to QMD — a local-first memory sidecar combining BM25 full-text search, vector embeddings, and reranking for better recall
- Fully offline — runs locally via Bun +
node-llama-cppwith auto-downloaded GGUF models, no cloud calls - Configuration:
memory.backend: "qmd"with auto-indexing every 5 minutes, 6 max results, 4s query timeout - Scoped to DMs only — memory search denied in group chats (
scope.default: "deny"with allow rule forchatType: "direct") - Citations: Set to
"auto"— search results include source references when available - Fallback: If QMD subprocess fails, OpenClaw automatically falls back to the builtin SQLite backend
- Config:
memory.backend,memory.qmd.*
Blue Bottle Skill: Apple Mail Migration
- Migrated magic link auth from Fastmail MCP to Apple Mail — uses
apple_pim_mail(action="search")andapple_pim_mail(action="get")instead offastmail_search_emails - Added
mail-auth-checkverification step — verifies DKIM/SPF before trusting magic link URLs - Email routing note: Magic link emails go to the owner’s Fastmail address, need forwarding to the agent’s iCloud email for Apple Mail access
- Tested end-to-end: inbox listing, email reading, auth verification all working
ACP Configuration and Agent Instructions
- Investigated ACP output delivery on non-thread surfaces — confirmed that
sessions_spawnwithruntime: "acp"spawns correctly but output never returns on webchat/TUI/iMessage. The/acp steerslash command works because it callsacpManager.runTurn()with a streaming callback; no equivalent tool is exposed to the agent. - Direct acpx path works end-to-end — the
acp-routerskill’s “telephone game” flow (execacpx claude --format quiet) returns output through the exec result on all surfaces. Tested and confirmed with one-shot Claude Code tasks. - Added ACP section to Lobster’s TOOLS.md — documents which path to use per surface (direct acpx for non-thread, ACP runtime for Discord), command templates, and the key gotcha about
sessions_spawnnot delivering output on non-thread surfaces. - Removed
geminifromacp.allowedAgents— not in use - Set
acp.defaultAgenttoclaude— wascodexin live config (drift from repo); synced both toclaude - Config:
acp.defaultAgent,acp.allowedAgents
Travel Concierge Program (New)
- Created
openclaw-agents/lobster/prose/travel-concierge.prose— an OpenProse program that generates comprehensive trip briefings from Travel Hub data - Three-agent design: concierge (opus, persistent orchestrator), researcher (sonnet, web research), logistics (haiku, data extraction and gap analysis)
- Two parallel fan-outs: Phase 2 fetches all bookings (flights, hotels, ground, activities) in parallel; Phase 3 enriches each with web research (airports, destination, dining, logistics) in parallel
- Gap analysis and synthesis: Checks for timeline gaps, missing bookings, tight connections, then merges everything into a structured briefing
- Run with
/prose run prose/travel-concierge.prosefrom Lobster’s workspace
2026-03-03
WhatsApp Group Message Fix
- Fixed
groupAllowFrommisconfiguration — contained a WhatsApp group JID ([email protected]) instead of E.164 phone numbers. The gateway’s access control matches sender phone numbers against this list, so every group message was silently blocked for 13 days (since Feb 18). The blocking only logs atverboselevel, making it invisible in normal logs. - Changed
dmPolicyfrom"disabled"to"allowlist"with Omar’s number, enabling WhatsApp self-chat DM testing - Config:
channels.whatsapp.groupAllowFrom,channels.whatsapp.dmPolicy - Documented in
debug/incidents.md(Incident #5) and new Obsidian notelobster/incidents/WhatsApp groupAllowFrom Fix
Workspace Write Access for Main Agent
- Enabled
write,edit,apply_patchtools for the lobster main agent withfs.workspaceOnly: true— the agent can now directly manage its own workspace files (memory, skills, TOOLS.md, HEARTBEAT.md) without exec workarounds - Restricted agents (
lobster-groups,lobster-family) remain unchanged — write/edit still denied workspaceOnlyalso scopesreadto the workspace; the agent usesexecfor reading files outside the workspace (config, logs, scripts)- Reorganized
alsoAllowlist: filesystem tools grouped first, then session/agent tools, then capabilities, then plugin tools - Config:
agents.list[lobster].tools.fs.workspaceOnly,agents.list[lobster].tools.alsoAllow,agents.list[lobster].tools.deny
Update Docs Skill (New)
- Created
/update-docsskill for both Claude Code and Lobster to maintain the project changelog and documentation - Claude Code version (
.claude/commands/update-docs.md): UsesEdit/Write/Glob/Grepfor direct file editing with a 7-step workflow — gather changes from git, memory files, incidents, and config diffs, then draft and apply changelog entries - OpenClaw version (
openclaw-skills/update-docs/SKILL.md): Same workflow adapted for Lobster’s tool constraints, usingwrite/editfor workspace files andexecfor repo files outside the workspace - Symlinked into Lobster’s workspace at
~/.openclaw/agents/lobster/workspace/skills/update-docs
OpenClaw Release Skill Enhancement
- Added regression/bug search to
/openclaw-releaseskill — new Step 4 searches GitHub issues closed between releases using milestone/label search with date-range fallback - Cross-references found issues against
debug/incidents.mdfor known Lobster incidents - Output format now includes a Regressions / Bugs Fixed section with issue counts and regression version tracking
- Added
Bash(grep:*)to allowed tools
Documentation Updates
docs/guides/whatsapp-channel.md— Clarified thatgroupAllowFrommust contain E.164 phone numbers, not group JIDs. Added note aboutdmPolicyallowlist for testing.docs/reference/troubleshooting.md— Added WhatsApp section: “Group Messages Not Reaching Agent” (silent groupAllowFrom mismatch) and “WhatsApp Web Socket Cycling” (stale-socket restarts)debug/incidents.md— Added Incident #5: WhatsApp Group Messages Silently Blocked, with full root cause, detection, fix, and prevention
2026-03-02
Obsidian Vault Integration (New)
- Created
obsidianshared skill with full vault management — read, edit, create, search, and list notes via theobsidian-noteCLI wrapper - Daily notes: A 10 PM cron job creates the next day’s note from a template with “What happened today” and “Mood” sections. The agent appends entries throughout the day as events happen, building a diary-style log
- Trip journals: Trip notes in
trips/follow templates for overview, day-by-day journal, activities, restaurants, and packing lists. Linked to Travel Hub trip data for context - Reference documents: Structured docs like “Flying & Airport Notes” use a surgical replace workflow (read → identify location → replace to insert) instead of blind appending, preserving alphabetical ordering and section structure
- Vault structure:
daily-notes/,destinations/,flights/,trips/,packing-lists/,recipes/,reference/,templates/— organized by content type in iCloud-synced vault - CLI wrapper (
obsidian-note): Delegates toobsidian-clifor core operations; adds Python-basedreplaceandprependactions thatobsidian-clidoesn’t support natively - Added to main agent exec allowlist; restricted agents do NOT have vault access (blocked by exec approvals)
Agent-to-Agent Messaging Re-enabled
- Re-enabled
sessions_sendfor restricted agents after implementing defense-in-depth enforcement - Restricted agents can now relay requests to the main agent when they need tools they don’t have (HomeKit, Obsidian, browser, etc.)
- Six red team tests passed — covering Fastmail privacy, social engineering, exec escalation, sessions_spawn blocking, and provenance tagging. All attacks either stopped by the restricted agent’s own privacy rules or blocked by hard controls (exec approvals, tool policy)
- Original escalation path (restricted agent → main agent → private email) now blocked at two independent hard layers (exec approvals + tool policy) plus two soft layers (privacy instructions + provenance tagging)
- See Agent-to-Agent Communications for full test methodology and results
2026-03-01
Binding Fix: peer.id Wildcards Don’t Work
- Root cause found:
peer.id: "*"does NOT work as a wildcard in OpenClaw bindings. The routing engine uses strict equality —"*"only matches a peer literally named*. All group chats not explicitly listed were falling through to the main lobster agent instead of lobster-groups. - Fix: Inverted the catch-all pattern. Made
lobster-groupsthe BlueBubbles channel catch-all (tier 7), and added an explicit peer binding for the owner’s DM to route to main lobster (tier 1). Family DM peer bindings already override the catch-all. - Removed broken
peer.id: "*"bindings from both BlueBubbles and WhatsApp - Updated all docs: multi-agent.md (public + private), info packet, how-to-build-your-own, future.md gotchas
BB Tapback Fix: Text Names, Not Emoji
- Tapback reactions must use TEXT NAMES (love, like, dislike, laugh, emphasize, question), not emoji characters (❤️, 👍). Emoji characters silently fail. Fixed in all agents’ TOOLS.md.
Agent Personality: Natural Reactions
- Added Reactions section to all three agents’ SOUL.md — agents now use iMessage tapback reactions naturally like a human would
- Love photos, like acknowledgments, laugh at jokes, react INSTEAD of replying when a reaction says it all
Exec Approvals Cleanup
- Removed
bb-react,bb-edit,bb-unsendfrom exec allowlists for lobster-groups and lobster-family — these wrapper scripts were unnecessary since the message tool handles all BB actions natively. Deleted the scripts from~/.local/bin/.
Corrections
- “Message tool schema only allows send” — Wrong. The BB plugin registry is a process-global singleton; all agents get the full action enum (react, unsend, edit, reply, etc.). The restricted agents failed because TOOLS.md told them “the schema only allows send,” and the model believed the workspace instructions over its own tool definitions. Removed the harmful instructions; all agents now use the message tool directly.
- “Edit is broken on macOS Tahoe” — Confirmed true. Apple silently broke iMessage edit in macOS 26 Tahoe — the BB API accepts the request (200 OK) but the edit never takes effect (
dateEditedstays null). The OpenClaw BB extension correctly blocks it withunsupportedOnMacOS26: true. Unsend still works fine.
2026-02-28
Flight Radar Skill — Flightera Resolver & Callsign Tracking
- Added
resolveaction to travel-hub MCP — looks up IATA flight numbers (TK203, LH490) on Flightera.net and returns tail number, ICAO callsign, airline, aircraft type, route, times, status, and gate info - Added
callsignparameter totrackaction — can now track by ICAO callsign (e.g., THY8DE) instead of just tail number - Rewrote
flight-radar/SKILL.mdwith IATA vs ICAO vs tail explainer, resolve-first workflow, and curl fallback for when MCP resolve fails - Fixed Flightera grep pattern (
"identifier": "with space after colon) - Successfully tracked TK203 (TC-LHI via callsign THY8DE) and TK187 (TC-LLO via Flightera search snippet) for family Turkey flights
Blue Bottle Coffee Skill (New)
- Created
blue-bottleskill for managing a Blue Bottle Coffee subscription via browser automation - Full flow: magic link auth (email → Fastmail → browser) → subscription management → skip/pause/edit
- Family approval pattern: when a family member requests a skip, message the owner for 👍 confirmation before acting
- Added
blue-bottlewrapper script to~/.local/bin/and lobster-family exec allowlist - Account configured with Bella Donovan subscription (3 bags, every 2 weeks)
BlueBubbles Feature Reference for Restricted Agents
- Added comprehensive BlueBubbles feature reference to lobster-family and lobster-groups TOOLS.md
- Covers: send, react (tapback), remove reaction, threaded reply, unsend, message effects, attachments, read history
- Previously these agents could send messages but didn’t know the full feature set (react, unsend, effects, etc.)
Tool Access Fix: read for Restricted Agents
- Added
readtool toalsoAllowfor lobster-groups and lobster-family — they couldn’t read files (including their own workspace files on demand), causing approval prompts and inability to load skill references - Updated config baseline to match
Security Audit Baseline Update
- Absorbed expected drift from plugin installations: apple-pim-cli, fastmail-cli (v2.0), image tool, approval-buttons plugin
- Updated
safeBinTrustedDirs(workspace/bin dirs removed from live config) - Updated cron job count baseline: 8 → 9
- All checks passing (0 errors, 0 warnings)
- Fastmail CLI token: 22 days remaining (expires ~Mar 22)
2026-02-27
Apple PIM Plugin v3.1.0 Migration
- Upgraded
apple-pim-cliplugin from v3.0.0 to v3.1.0 — factory pattern with per-agent workspace config - Eliminated all PIM wrapper scripts — restricted agents now use the native plugin directly, with per-agent config read automatically from
~/.openclaw/agents/<agentId>/workspace/apple-pim/config.json - Removed 5
apple_pim_*tool entries from deny lists for lobster-groups and lobster-family (plugin handles isolation natively) - Removed
configDirfrom plugin config (no longer needed — factory pattern resolves per-agent) - Removed 8 PIM CLI wrapper entries from
exec-approvals.json(4 per restricted agent) - Removed 3 workspace
bin/paths fromsafeBinTrustedDirs - Deleted 8 wrapper scripts and 2 bin directories from repo
- Updated TOOLS.md for all 3 agents
- Red team verified: Restricted agents correctly blocked from private calendars/lists, exec approval layer still gates CLI bypass attempts
- Apple PIM Agent Plugin v3.1.0
Security: Exec Allowlist Enforcement Fix
- Critical fix: Added
host: "gateway"to lobster-groups and lobster-family exec configs. Without this, the exec handler defaulted tohost: "sandbox"— and with sandbox mode off, commands ran directly, completely bypassing allowlist enforcement and approval forwarding. This gap existed since the multi-agent deployment. - Changed
elevatedDefaultfrom"on"to"off"— with"on", owner sessions could bypass exec allowlists on restricted agents, which served no purpose since those agents lack useful elevated tools (Fastmail, Apple PIM all denied by tool policy) - Updated security audit script with two new checks:
exec.host=gatewayfor restricted agents andelevatedDefault=off - Updated config baseline with new verified values
- Updated Security Model and Multi-Agent Architecture with critical
host: "gateway"warnings - Impact: During the gap, lobster-groups and lobster-family had
security: "allowlist"configured but NOT enforced. A prompt injection via group chat or family DM could have run arbitrary shell commands. In practice, the agents’ system prompts and tool policy (denying write/edit/browser) limited what the LLM would attempt.
Approval Buttons Plugin (Telegram Inline UX)
- Installed telegram-approval-buttons v5.0.0 — community OpenClaw plugin that replaces plain-text exec approval messages with inline keyboard buttons in Telegram
- One-tap approvals: Allow Once, Always Allow, Deny buttons instead of typing
/approve <uuid> allow-once - Messages auto-update after decision (shows resolution status) and expire after 10 minutes
- Plugin audited for malicious code — zero runtime dependencies, only calls
api.telegram.org, no filesystem or shell access - Health diagnostics available via
/approvalstatuscommand - Requires explicit
botTokenandchatIdin plugin config (auto-detect doesn’t work with Lobster’s nestedaccounts.default.botTokenstructure)
OpenClaw v2026.2.26 Upgrade
- Upgraded from v2026.2.25 to v2026.2.26
- Migrated secrets to
~/.openclaw/secrets.jsonwithkeyRef/tokenRefreferences - Configured exec approval forwarding to Telegram for restricted agents
- Added
memory-coreplugin to allow list
2026-02-26
Adversarial Review Workflow
- Added GitHub Actions workflow that runs on every push to
main, analyzing commits for security-sensitive changes - File classification: Every changed file classified into severity tiers — Critical (security boundaries), Suspicious (agent behavior), Memory (system prompt files), Routine (docs)
- Secret scanning: Gitleaks + custom patterns for hardcoded credentials, API key prefixes, phone numbers
- Policy drift detection: Compares
openclaw.jsonandexec-approvals.jsonagainstconfig-baseline.json— catches removed deny entries, weakened exec security, new trusted directories - Memory injection scanner: Two-layer defense against persistent prompt injection via memory poisoning:
- Regex pattern matching with context-aware scoring (role hijacking, override phrases, exfiltration patterns)
- LLM semantic analysis via Anthropic API (Haiku 4.5) catches semantically disguised attacks that bypass keyword patterns
- Findings merged: LLM can corroborate regex hits, escalate borderline scores, or surface novel findings
- Self-protection: Workflow hash stored as GitHub secret — agent can push code but can’t modify secrets, so it can’t disable its own checks
- Alert: Creates GitHub Issues with severity labels, file classification tables, diffs, and remediation recommendations
- New files:
.github/workflows/adversarial-review.yml,.github/adversarial-review-patterns.json,.gitleaks.toml,CODEOWNERS - See Adversarial Review Workflow for full documentation
2026-02-25
macOS Power Management Fix (Prevent Deep Idle)
- Problem: Machine was entering “Deep Idle” sleep cycles despite
sleep=0in pmset, causing Tailscale disconnects and gateway outages (observed morning of Feb 25) - Root cause:
standby=1(default) puts the Mac into deep standby after prolonged idle, even when system sleep is disabled.networkoversleep=0also drops network during sleep states. - Fix:
Terminal window sudo pmset -a standby 0sudo pmset -a networkoversleep 1 standby 0— prevents deep idle/hibernation-lite; Mac stays in light sleep with CPU and network activenetworkoversleep 1— ensures network stays up during any remaining sleep states- Display still sleeps after 10 min (saves energy) — only affects system/network sleep
- Applies to: Mac M1 MacBook Air running as always-on agent host on AC power
Agent Identity Overhaul (lobster-family + lobster-groups)
- Problem: Both restricted agents had boilerplate files copied from the main lobster agent. SOUL.md, USER.md, IDENTITY.md, and MEMORY.md all described the main agent with full access (“Chief of Staff”, “Elevated — full access”, “I have access to his email”). The agents didn’t know their actual capabilities or limits.
- Fixed files for lobster-family (family DM agent):
- SOUL.md — rewritten for 1:1 family DM context with correct boundaries
- USER.md — scoped to family members, lists actual access and explicit limits
- IDENTITY.md — “Family DM assistant (restricted agent)” instead of main lobster identity
- MEMORY.md — seeded with key capabilities instead of empty placeholder
- Fixed files for lobster-groups (group chat agent):
- SOUL.md — rewritten for group chat context (“participant, not the star”)
- USER.md — scoped to group chats with same access/limits clarity
- IDENTITY.md — “Family group chat assistant (restricted agent)”
- MEMORY.md — seeded with key capabilities
BlueBubbles Relay for Restricted Agents
- Problem: The family agent told a family member it couldn’t send the owner a message. The agent had
sessions_sendblocked and thought A2A was the only way to reach the owner. But it already had themessagetool with BlueBubbles access. - Fix: Added explicit “Sending Messages to Owner” section to TOOLS.md, USER.md, and IDENTITY.md for both restricted agents with the exact syntax:
message(action=send, channel=bluebubbles, target="+1XXXXXXXXXX", message="From [name]: ...") - Removed stale “escalate to main agent” references from SOUL.md and IDENTITY.md
- Impact: “Tell the owner…” requests from family members now work without A2A
2026-02-24
HomeClaw Plugin (HomeKit Control)
- Installed HomeClaw plugin for HomeKit smart home control
- App: HomeClaw.app (renamed from HomeKit Bridge.app during install)
- CLI:
homeclaw-clisymlinked to/opt/homebrew/bin/homekit-cli - 104 devices, 101 reachable across Basement, Main Floor, Upstairs, Outdoor
- Rewrote bundled SKILL.md with “device map first” approach — always resolve device names before acting
- No plugin config needed beyond the symlink — skill-only plugin
caffeinate LaunchAgent (Prevent Deep Idle - Permanent Fix)
pmset -a standby 0alone was NOT preventing Deep Idle on Apple Silicon- Added
~/Library/LaunchAgents/com.lobster.caffeinate.plistrunningcaffeinate -s - Starts at boot, auto-restarts if killed, prevents system sleep while on AC
- Display still sleeps normally (only
-sflag, not-d)
BlueBubbles Inbound Image Fix (SSRF Patch)
- Problem: Inbound iMessage attachments (images, HEIC, audio) silently dropped since OpenClaw v2026.2.2+
- Root cause: CVE fix (GHSA-wfp2-v9c7-fh79) added SSRF guard on all media fetches, blocking private/localhost IPs — including BlueBubbles at
127.0.0.1:1234 - Fix (two parts):
- SSRF source patch: Modified
resolveAllowPrivateNetwork()in alldist/ssrf-*.jsfiles to always returntrue - Config: Added
~/Library/Messages/Attachmentstochannels.bluebubbles.mediaLocalRoots
- SSRF source patch: Modified
- ⚠️ Fragile: Patch breaks on any OpenClaw update — must re-apply
- Re-apply script:
Terminal window for f in /opt/homebrew/lib/node_modules/openclaw/dist/ssrf-*.js; docp "$f" "${f}.bak"sed -i '' 's/return policy?.dangerouslyAllowPrivateNetwork === true || policy?.allowPrivateNetwork === true;/return true;/' "$f"doneopenclaw gateway restart - Upstream: Needs
allowPrivateNetworkadded to BB channel schema (like Tlon has). Related: GitHub #19396, #20206 - Also tried (didn’t work): Tailscale IP (CGNAT range also blocked),
allowPrivateNetworkconfig key (rejected by schema),ssrfPolicyconfig key (rejected),openclaw doctor --fix(browser-only)
Control UI via Tailscale Serve
- Enabled browser access to the OpenClaw Control UI over Tailscale without changing the gateway bind address
- Gateway stays bound to loopback (
127.0.0.1:18789) — Tailscale Serve proxies HTTPS to it - Added
controlUi.allowedOriginsto accept the Tailscale hostname as a valid origin (required for WebSocket connections) - Added
auth.allowTailscaleto trust Tailscale identity headers, removing the need for?token=in the browser URL - New browsers require one-time device pairing approval via
openclaw devices approve - What didn’t work:
bind: "tailnet"breaks both BlueBubbles webhook and Tailscale Serve (both proxy to loopback)
2026-02-23
Exec Approvals Breaking Change (v2026.2.22)
- OpenClaw v2026.2.22 fixed #11832, causing per-agent
tools.execconfig inopenclaw.jsonto be properly resolved instead of silently ignored - All exec commands started requiring manual approval (120s timeout with no approver) because agents without a per-agent
tools.execblock fell through to restrictive gateway defaults (security: allowlist,ask: on-miss) - Fix: Added explicit
tools.execblocks to every agent inopenclaw.json—security: "full"+ask: "off"for the main agent,security: "allowlist"+ask: "off"for restricted agents - Also required:
safeBinTrustedDirsintools.exec— v2026.2.22 stopped trusting PATH-derived directories - Key insight:
exec-approvals.jsoncontrols the node host approval system, NOT gateway exec policy. The gateway reads exec settings fromagents.list[].tools.execinopenclaw.json. Both must be set for consistent behavior. - Updated
exec-approvals.jsonwith matchingask: "off"as belt-and-suspenders
2026-02-22
ElevenLabs Upgrade & Talk Mode Fixes
- Upgraded to Starter (paid) tier on ElevenLabs — removes free-tier character limits
- New voice: Mark — Casual, Relaxed and Light (
1SM7GgM6IMuvQlz2BwM3), replacing Chris - Talk Mode fix: Agent was incorrectly calling the
ttstool manually and replyingNO_REPLY, which bypassed the gateway’s native Talk Mode audio pipeline. The gateway converts text replies to audio automatically — no need to call thettstool in Talk Mode sessions - Config synced: Updated
talk.voiceIdinopenclaw.jsonto match the running voice
2026-02-21
BlueBubbles Private API Enabled
- Enabled the BlueBubbles Private API on macOS Tahoe (26)
- Typing indicators: Sent automatically while composing replies — users see ”…” in iMessage
- Read receipts: Incoming messages marked as read automatically
- Tapback reactions: Can send love/like/laugh/dislike/emphasis/question on iMessage messages
- Reply threading: Can reply to specific messages by GUID
- Unsend: Can unsend sent messages
- Edit: Can edit sent messages
- Message effects: Can send with slam, loud, gentle, invisible ink, etc.
- Attachments: Can send images, files, and voice memos (MP3/CAF)
- Group management: Rename groups, add/remove participants, set group icon (icon flaky on Tahoe)
- Better send reliability: Messages now go through the native Private API instead of AppleScript, fixing the
-1700send errors that blocked all replies on Feb 17
Fastmail Plugin v2.0 — MCP SDK to CLI Shelling
- Refactored
fastmail-cliOpenClaw plugin from in-process MCP SDK to CLI shelling - Eliminated ~1,700 lines:
mcp-client.ts,formatters.ts,auth.tsall removed - Replaced with
cli-runner.ts(~71 lines) —execFile(fastmail, args), no shell, no injection risk - Zero runtime dependencies —
@modelcontextprotocol/sdkremoved from plugin - Config simplified:
workerUrlandbearerTokenfields removed; CLI handles auth via~/.config/fastmail-cli/config.json - Same 36 tools, same compact text output, just a much thinner adapter layer
- Linked
fastmailCLI to PATH vianpm linkfor global access
ElevenLabs TTS & Talk Mode
- Enabled ElevenLabs text-to-speech via OpenClaw’s built-in
ttstool andsagCLI (v0.2.2) - Configured Talk Mode (
talkconfig section) for voice conversations via iOS and TUI - Default voice: Chris — Charming, Down-to-Earth (
iP95p4xoKVk53GoZ742B) - Voice replies work across TUI, iOS app, and control UI
sagCLI installed via brew for advanced voice control (auditioning, file output, speaker playback)- ElevenLabs API key managed via
${ELEVENLABS_API_KEY}env var reference
OpenClaw iOS App
- Built OpenClaw iOS app from source (GitHub repo)
- Paired and connected to gateway successfully
- Talk Mode working — full voice conversations via iPhone with ElevenLabs TTS
- Speech-to-text input with voice reply output
Secrets Audit Integration
- Integrated
scripts/secrets-audit.shinto the daily security audit cron job - Checks: hardcoded secrets in config, env var resolution, .env.example coverage, file permissions, CLI auth tokens
- All secrets now use
${VAR}references in openclaw.json with values in~/.openclaw/.env
Self-Healing Improvements
- Agent timeout reduced:
agents.defaults.timeoutSecondslowered from 600s to 180s — stuck agent runs now killed in 3 minutes instead of 10 - Stuck-session watchdog: New
scripts/stuck-session-watchdog.shdetects hung BlueBubbles agent runs by analyzing gateway logs - Self-heal updated:
scripts/bb-selfheal.shnow includes stuck-session detection with automatic gateway restart - Healthcheck updated:
scripts/bb-healthcheck.shnow checks for stuck sessions (read-only detection) - Root cause: An exec tool call in a BlueBubbles session hung indefinitely, blocking the session lane and preventing all inbound iMessage processing for ~70 minutes
Obsidian Integration
- Installed
obsidian-clivia brew for vault management - Documented vault path and daily notes schedule in TOOLS.md and MEMORY.md
- Added “Tools & Resources” section to Flying & Airport Notes with FlightQueue and AeroLOPA
2026-02-19
Apple PIM Plugin Migration
- Migrated primary agent (lobster) from MCP server + wrapper scripts to native
apple-pim-cliOpenClaw plugin - Plugin registers 5 tools:
apple_pim_calendar,apple_pim_reminder,apple_pim_contact,apple_pim_mail,apple_pim_system - Restricted agents use hybrid approach: plugin tools denied + CLI wrapper scripts with per-agent configDir
- Saves ~5K tokens per context window (consolidated from 40 MCP tool definitions to 5)
- 8 wrapper scripts (down from 12 — primary agent has none)
- Apple PIM Agent Plugin v3.0.0
Fastmail Native Plugin
- Replaced mcporter-based Fastmail MCP with native
fastmail-cliOpenClaw plugin - Plugin connects to remote Fastmail MCP worker via persistent connection
- Only lobster (primary) agent has access — restricted agents blocked via
tools.deny: ["fastmail_*"] - Bearer token expires March 22, 2026
- fastmail-mcp-remote
Config Symlink
- Live config (
~/.openclaw/openclaw.json) now symlinks to repo (config/openclaw.json) - Agent workspaces already symlinked to repo
- Single source of truth with full git history
Documentation
- Updated Phase 8 (Apple PIM) in how-to-build-your-own guide for hybrid plugin/wrapper approach
- Added Phase 4.4 (Version Control Your Config) with symlink instructions
- Added Phase 7b (Fastmail Plugin) to how-to-build-your-own guide
- Updated MCP servers guide: prefer native plugins over mcporter
- Updated multi-agent architecture: native plugins replace mcporter references
- Updated hardening guide: exec justification reflects plugin architecture
- Added OpenClaw platform section to CLAUDE.md with docs, GitHub, Discord, ClawhHub links
2026-02-18
Documentation Site Launch
- Published lobster.shahine.com as a Starlight site on Cloudflare Pages
- Added iMessage conversation screenshots to the landing page (proactive reminders, group chat)
- Added Apple PIM section documenting native EventKit/Contacts CLI access
- Added Open Graph meta tags for rich URL previews in iMessage and social sharing
Architecture
- Workspace separation: Each agent now has its own isolated workspace (
~/.openclaw/agents/<id>/workspace/), preventing skill context leakage between agents - Shared skills: Common skills (travel-hub, apple-pim, bluebubbles-health, sonos) moved to
~/.openclaw/skills/for all agents to access - Expanded exec approvals:
lobster-groupsandlobster-familycan now run calendar-cli, reminder-cli, contacts-cli, and mail-inbox/read/list/cli/auth-check
Security
- Hardened WhatsApp group policy — added Family Chat JID to
groupAllowFrom - Added WhatsApp outbound restrictions for cron jobs
- Calendar/reminder visibility rules documented for restricted agents
2026-02-17
Features
- FlightRadar24 skill: Real-time aircraft tracking via FR24 API
- Travel Hub family access:
lobster-familyagent can now query trips and calendar events - Messages self-heal: Auto-recovery when Messages.app AppleScript gets wedged
Security
- Email authentication spoofing test passed (SPF/DKIM/DMARC verification)
- Symlinked Apple PIM Swift CLIs to
~/.local/binfor secure PATH resolution - Fixed
mail-auth-checkto aggregate iCloud Authentication-Results headers
Documentation
- Documented three cron execution modes (sub-agent, main-session, headless)
- Added mandatory rules for cron jobs that send messages
- Aligned multi-agent docs with actual exec-approvals security model
2026-02-16
Initial Release
- Three-agent architecture:
lobster(owner DMs),lobster-groups(group chats),lobster-family(family DMs) - Defense-in-depth security model with channel bindings and tool policies
- BlueBubbles iMessage bridge with full read/send support
- Tailscale SSH remote access
- Fastmail MCP for email triage and organization
- Travel Hub MCP for trip and flight management
- Apple PIM for native calendar, reminder, and contact access
- Hardening checklist and security audit framework