Add /fleet-announce command + BOOT.md conversation recovery#40
Add /fleet-announce command + BOOT.md conversation recovery#40TechNickAI merged 5 commits intomainfrom
Conversation
When gateway restarts within 1 minute of an active direct conversation, read the last transcript entries and send a brief recovery message so the user can pick up where they left off.
- Single-line description with prettier-ignore - Remove argument-hint and flags - Remove all personal data (names, Telegram IDs, SSH hosts) - Reference fleet files at runtime instead of hardcoding - Generic examples with [Owner] placeholder
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 05d1b18fc2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
.claude/commands/fleet-announce.md
Outdated
| send via SSH: | ||
|
|
||
| ```bash | ||
| ssh <host> "openclaw message send --channel telegram -t <telegram_id> -m '<message>'" |
There was a problem hiding this comment.
Use per-user channel when sending fleet announcements
Step 4 says to read each person’s notification channel from fleet metadata, but the send command is hardcoded to --channel telegram. That will misroute or fail delivery for users configured on other channels (e.g., WhatsApp/Slack), so the new command can skip recipients in mixed-channel fleets. The command template should use channel/target values pulled from each fleet file instead of fixed Telegram flags.
Useful? React with 👍 / 👎.
workflows/task-steward/rules.md
Outdated
| - workspace_gid: <your Asana workspace GID> | ||
| - project_gid: <your Asana project GID> | ||
| - ai_assignee_gid: <GID of this bot's Asana account> | ||
| - human_assignee_gid: <GID of the human's Asana account> |
There was a problem hiding this comment.
Remove placeholder rules file from task-steward defaults
This commit adds a pre-populated rules.md with placeholder Asana IDs, but workflows/task-steward/AGENT.md gates first-run setup on rules.md not existing, so setup can be skipped while config is still invalid. In that state, task-steward will treat <your Asana workspace GID>-style placeholders as live values and fail task operations. Either don’t ship rules.md by default or make first-run validation detect placeholder/unconfigured values.
Useful? React with 👍 / 👎.
- Fix BOOT.md step label: 'silent start' → 'check for unfinished work' (step 3 is unfinished work check; step 4 is silent start) - Fix fleet-announce.md: use generic <channel>/<recipient_id> in send template instead of hardcoded telegram (fleet files may use whatsapp, slack, etc.) - Remove accidentally-staged task-steward workflow files (QA-PROMPT.md, agent_notes.md, rules.md, touched.md) — user-owned state files that don't belong upstream; rules.md with placeholder GIDs would break task-steward first-run setup on fresh installs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 3 potential issues.
Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
|
|
||
| **If NOT interrupted (> 1 min ago or no recent direct conversation):** | ||
|
|
||
| - Skip to step 3 (check for unfinished work) |
There was a problem hiding this comment.
Step 1 processing time erodes 1-minute recovery window
Medium Severity
The conversation recovery check in Step 2 compares updatedAt against the current time, but it runs after Step 1 (Orient), which requires reading SOUL.md, USER.md, and memory files. Each file read is a separate tool call that takes real wall-clock time. By the time Step 2 executes, a significant portion of the 1-minute window has already elapsed — making recovery unreliable or impossible if Step 1 takes longer than a minute. The timestamp check or the step ordering needs to account for boot-time overhead.
Additional Locations (1)
| send via SSH: | ||
|
|
||
| ```bash | ||
| ssh <host> "openclaw message send --channel <channel> -t <recipient_id> -m '<message>'" |
There was a problem hiding this comment.
CLI flags inconsistent with all other usages
Medium Severity
The SSH command uses -t and -m short flags for openclaw message send, but every other invocation in the codebase (devops/health-check.md, devops/machine-setup-linux.md, devops/machine-setup.md, .claude/commands/update-model.md) consistently uses --target and --message. If the CLI doesn't support these short aliases, the send commands will fail for every fleet announcement.
| ``` | ||
|
|
||
| **Important:** Single quotes in the message must be escaped. Messages come FROM their | ||
| bot, not from the fleet owner. |
There was a problem hiding this comment.
SSH double-quote expansion corrupts messages with dollar signs
Low Severity
The SSH command wraps the entire remote command in double quotes, meaning $, backticks, and \ in the message are expanded by the local shell before SSH transmits them. The escaping note only mentions single quotes, missing these double-quote metacharacters entirely. Messages containing common characters like $ or backticks would be silently corrupted.
- BOOT.md: Move conversation recovery check to Step 1 so the 1-minute window is measured from actual restart time, not after Orient finishes loading SOUL.md/USER.md/memory files - fleet-announce.md: Use --target/--message long flags for consistency with all other openclaw CLI usages in the codebase - fleet-announce.md: Wrap SSH command in single quotes so $ signs, backticks, and backslashes in messages aren't expanded by local shell Addresses bot feedback from PR #40 review sweep. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>


What
Two additions:
BOOT.md template: Adds conversation recovery on restart. When the gateway restarts within 1 minute of an active direct conversation, reads the last transcript entries and sends a brief recovery message so the user can pick up where they left off.
/fleet-announce command: On-demand command for announcing updates to fleet users. Checks relevance against fleet files, drafts messages in each bot's voice, shows drafts for approval before sending, sends from each person's bot via SSH.
Changes
templates/BOOT.md— new Step 2: Conversation Recovery.claude/commands/fleet-announce.md— new command