SSH into 134.199.153.159 and run:
1. openclaw --version
2. systemctl list-units 'clawdbot-*' --all
3. for agent in gateway builder susan harper sentinel radar herald cog; do echo "=== $agent ===" && systemctl is-active clawdbot-$agent && cat /root/.openclaw-${agent}/clawdbot.json 2>/dev/null | grep -i "model\|version" || echo "no config found"; done

Report back what version of OpenClaw is running and the status of all 8 agents.


I'll SSH into the VPS and run those commands in parallel.


Bash

Check OpenClaw version on VPS


ssh root@134.199.153.159 "systemctl list-units 'clawdbot-*' --all" 2>&1

List all clawdbot systemd units


  UNIT                      LOAD   ACTIVE SUB     DESCRIPTION
  clawdbot-builder.service  loaded active running Clawdbot Builder Gateway
  clawdbot-cog.service      loaded active running Clawdbot Cog Operations Support Agent
  clawdbot-gateway.service  loaded active running Clawdbot Gateway
  clawdbot-harper.service   loaded active running Clawdbot Harper Finance/Legal Agent
  clawdbot-herald.service   loaded active running Clawdbot Herald Communications Agent
  clawdbot-radar.service    loaded active running Clawdbot Radar Scout/AI News Agent
  clawdbot-sentinel.service loaded active running Clawdbot Sentinel DevOps Agent
  clawdbot-susan.service    loaded active running Clawdbot Susan Sales Agent

Legend: LOAD   → Reflects whether the unit definition was properly loaded.
        ACTIVE → The high-level unit activation state, i.e. generalization of SUB.
        SUB    → The low-level unit activation state, values depend on unit type.

8 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.


ssh root@134.199.153.159 'for agent in gateway builder susan harper sentinel radar herald cog; do echo "=== $agent ===" && systemctl is-active clawdbot-$agent && cat /root/.openclaw-${agent}/clawdbot.json 2>/dev/null | grep -i "model\|version" || echo "no config found"; done' 2>&1

Check status and config for all 8 agents


=== gateway ===
active
no config found
=== builder ===
active
    "lastTouchedVersion": "2026.3.7",
  "models": {
        "models": [
        "models": [
      "model": {
        "model": "deepseek/deepseek-chat"
        "models": [
            "model": "gpt-4o-mini-transcribe"
=== susan ===
active
    "lastTouchedVersion": "2026.1.24-3",
  "models": {
        "models": [
      "model": {
      "models": {
        "models": [
            "model": "gpt-4o-mini-transcribe"
        "modelId": "eleven_multilingual_v2",
=== harper ===
active
    "lastTouchedVersion": "2026.1.24-3",
  "models": {
      "model": {
      "models": {
        "models": [
            "model": "gpt-4o-mini-transcribe"
        "modelId": "eleven_multilingual_v2",
=== sentinel ===
active
    "lastTouchedVersion": "2026.1.24-3",
  "models": {
        "models": [
      "model": {
      "models": {
        "models": [
            "model": "gpt-4o-mini-transcribe"
        "modelId": "eleven_multilingual_v2",
=== radar ===
active
    "lastTouchedVersion": "2026.1.24-3",
  "models": {
      "model": {
      "models": {
        "models": [
            "model": "gpt-4o-mini-transcribe"
        "modelId": "eleven_multilingual_v2",
=== herald ===
active
    "lastTouchedVersion": "2026.3.2",
  "models": {
        "models": [
      "model": {
      "models": {
        "models": [
            "model": "gpt-4o-mini-transcribe"
=== cog ===
active
    "lastTouchedVersion": "2026.1.24-3",
  "models": {
        "models": [
      "model": {
      "models": {
        "model": "openrouter/openai/gpt-5.3-codex"
        "models": [
            "model": "gpt-4o-mini-transcribe"


Here's the full fleet report:

## OpenClaw Version
**`2026.3.7`** (installed on VPS)

## Fleet Status — All 8 Agents Active

| Agent | Status | Config Version | Notes |
|-------|--------|---------------|-------|
| **gateway** | active | — | No config file at expected path |
| **builder** | active | `2026.3.7` | Up to date. Uses `deepseek/deepseek-chat` |
| **susan** | active | `2026.1.24-3` | Stale — 6 weeks behind |
| **harper** | active | `2026.1.24-3` | Stale — 6 weeks behind |
| **sentinel** | active | `2026.1.24-3` | Stale — 6 weeks behind |
| **radar** | active | `2026.1.24-3` | Stale — 6 weeks behind |
| **herald** | active | `2026.3.2` | Slightly behind |
| **cog** | active | `2026.1.24-3` | Stale. Uses `openrouter/openai/gpt-5.3-codex` |

### Summary
- All **8/8 agents are running** (active).
- **Builder** is the only agent whose config has been touched at the current OpenClaw version (`2026.3.7`).
- **5 agents** (susan, harper, sentinel, radar, cog) are pinned to `2026.1.24-3` — about 6 weeks stale.
- **Herald** is at `2026.3.2`, slightly behind.
- **Gateway** has no config file at `/root/.openclaw-gateway/clawdbot.json` (it may use a different config path or inline config).


SSH into 134.199.153.159 and update all stale agent configs to match the current OpenClaw version format (2026.3.7).

For each of these agents: susan, harper, sentinel, radar, cog
1. Back up their current config: cp /root/.openclaw-{agent}/clawdbot.json /root/.openclaw-{agent}/clawdbot.json.bak-2026-03-12
2. Update the config version field to match 2026.3.7 format
3. Verify the model assignment matches what's in rivet/memory/multi-model-fleet-plan.md
4. Restart the service: systemctl restart clawdbot-{agent}
5. Check it came back: systemctl is-active clawdbot-{agent}

For herald (on 2026.3.2 — close but not current):
Same process but lower priority.

Also check: Is Builder intentionally on deepseek/deepseek-chat? The vault says Claude Opus 4.6 via LocalCC. If the config was changed, update vault/02-Fleet/Builder.md to match reality.

After all updates, run the full status check again and report what changed.

IMPORTANT: Back up every config before touching it. Do NOT change model assignments — only update the config version/format to be compatible with 2026.3.7. If the config format changed between versions, check the OpenClaw changelog first.


The user wants me to SSH into the VPS and update stale agent configs. Let me break this down:

1. First, I need to understand the current config format and what changed between versions
2. Back up and update configs for susan, harper, sentinel, radar, cog, and herald
3. Check the multi-model fleet plan
4. Check Builder's model assignment against vault docs
5. Run full status check after

Let me start by reading the relevant files to understand what we're working with, then SSH in to examine the actual configs.


Let me start by gathering context — the fleet plan, the current configs, and any OpenClaw changelog — before touching anything.


ssh root@134.199.153.159 "cat /root/.openclaw-builder/clawdbot.json" 2>&1

Read Builder config (the up-to-date reference)


ssh root@134.199.153.159 "cat /root/.openclaw-susan/clawdbot.json" 2>&1

Read Susan config (stale example)


Kimi K2

Input: text

DeepSeek V3

Input: text

Kimi K2

Input: text

DeepSeek V3

Input: text


Kimi K2.5

Input: text

Input: text


Bash

ssh root@134.199.153.159 "openclaw changelog 2>&1 || openclaw --help 2>&1 | head -50" 2>&1

Check OpenClaw changelog or help


Output: Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)

Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)

Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)

Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
error: unknown command 'changelog'
(Did you mean channels?)

Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
error: unknown command 'changelog'
(Did you mean channels?)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
error: unknown command 'changelog'
(Did you mean channels?)


Output:
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
error: unknown command 'changelog'
(Did you mean channels?)


Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
error: unknown command 'changelog'
(Did you mean channels?)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)

🦞 OpenClaw 2026.3.7 (42a1394) — I don't judge, but your missing API keys are absolutely judging you.

Usage: openclaw [options] [command]

Options:
  --dev                Dev profile: isolate state under ~/.openclaw-dev, default
                       gateway port 19001, and shift derived ports
                       (browser/canvas)
  -h, --help           Display help for command
  --log-level <level>  Global log level override for file + console
                       (silent|fatal|error|warn|info|debug|trace)
  --no-color           Disable ANSI colors
  --profile <name>     Use a named profile (isolates
                       OPENCLAW_STATE_DIR/OPENCLAW_CONFIG_PATH under
                       ~/.openclaw-<name>)
  -V, --version        output the version number

Commands:
  Hint: commands suffixed with * have subcommands. Run <command> --help for details.
  acp *                Agent Control Protocol tools
  agent                Run one agent turn via the Gateway
  agents *             Manage isolated agents (workspaces, auth, routing)
  approvals *          Manage exec approvals (gateway or node host)
  browser *            Manage OpenClaw's dedicated browser (Chrome/Chromium)
  channels *           Manage connected chat channels (Telegram, Discord, etc.)
  clawbot *            Legacy clawbot command aliases
  completion           Generate shell completion script
  config *             Non-interactive config helpers
                       (get/set/unset/file/validate). Default: starts setup
                       wizard.
  configure            Interactive setup wizard for credentials, channels,
                       gateway, and agent defaults
  cron *               Manage cron jobs via the Gateway scheduler
  daemon *             Gateway service (legacy alias)
  dashboard            Open the Control UI with your current token
  devices *            Device pairing + token management
  directory *          Lookup contact and group IDs (self, peers, groups) for
                       supported chat channels
  dns *                DNS helpers for wide-area discovery (Tailscale + CoreDNS)
  docs                 Search the live OpenClaw docs
  doctor               Health checks + quick fixes for the gateway and channels
  gateway *            Run, inspect, and query the WebSocket Gateway
  health               Fetch health from the running gateway
  help                 Display help for command
  hooks *              Manage internal agent hooks
  logs                 Tail gateway file logs via RPC
  memory *             Search and reindex memory files


No files found


Let me read the fleet plan and the remaining agent configs. I need to understand:
1. What models each agent should be running (from fleet plan)
2. What the current configs look like for harper, sentinel, radar, cog, herald
3. What changed between 2026.1.24-3 and 2026.3.7 format

Looking at the two configs (builder at 2026.3.7 vs susan at 2026.1.24-3), the key differences seem to be:
- `meta.lastTouchedVersion` - needs to be "2026.3.7"

- `meta.lastTouchedAt` - should be updated to current time
- The `plugins` section structure changed: builder uses `"entries"` with telegram and acpx, while susan has both `"allow"` and `"entries"`
- Builder has the `"acpx"` plugin enabled (appears to be new in 2026.3.7)
- Telegram channels changed from `"streamMode"` to `"streaming"`

But I need to be careful here — the user explicitly said not to change model assignments, only update the config format to match 2026.3.7 compatibility.

So I should focus on structural and format changes only, not touching any model assignments. Let me review all the remaining configs and the fleet plan to understand what needs updating.


Good — I can see the structural differences between formats. Let me now read the remaining configs and the fleet plan.


     1→# Multi-Model Fleet Plan
     2→*Approved by Michael: 2026-02-25 16:40 AEDT*
     3→
     4→## Strategy
     5→Each agent runs a different AI model as primary so every answer comes from a different company with full RateRight context. Maximum diversity of perspective.
     6→
     7→## Assignments
     8→
     9→| Agent | Role | Primary Model | Provider | Fallback | Status |
    10→|-------|------|--------------|----------|----------|--------|
    11→| Rivet | Chief of Staff | Claude Opus 4.6 | Anthropic | GPT-5.2 | ✅ No change |
    12→| Builder | Coding | Claude Opus 4.6 | Anthropic | Claude Sonnet 4 | ✅ No change (Claude Code locked) |
    13→| Susan | Sales/Marketing | Gemini 3.1 Pro | Google | Claude Sonnet 4 | ⏳ Need Gemini API setup |
    14→| Harper | Finance/Legal | GPT-5.2 | OpenAI | Claude Sonnet 4 | ⏳ Pending |
    15→| Herald | Communications | Grok 4.1 | xAI | Gemini 3.1 Pro | ⏳ Need xAI API setup |
    16→| Sentinel | DevOps | DeepSeek R1 | DeepSeek | Kimi K2.5 | ⏳ Pending |
    17→| Radar | Intelligence | Kimi K2.5 | Moonshot | DeepSeek R1 | ⏳ Pending |
    18→| Cog | Operations | MiniMax M2.5 | MiniMax | Kimi K2.5 | 🔄 FIRST — testing now |
    19→
    20→## Rollout Order
    21→1. **Cog** → MiniMax M2.5 (lowest risk, routine ops)
    22→2. Radar → Kimi K2.5 (already free, easy swap)
    23→3. Sentinel → DeepSeek R1 (already have access)
    24→4. Harper → GPT-5.2 (already have API key)
    25→5. Susan → Gemini 3.1 Pro (need to configure)
    26→6. Herald → Grok 4.1 (need xAI API access)
    27→
    28→## Notes
    29→- Builder stays Anthropic — Claude Code is provider-locked
    30→- Rivet stays Opus — hardest coordination job, dirty data processing
    31→- Each fallback is from a DIFFERENT provider than primary
    32→- 7 different AI companies across 8 agents
    33→

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

# Multi-Model Fleet Plan
*Approved by Michael: 2026-02-25 16:40 AEDT*

## Strategy
Each agent runs a different AI model as primary so every answer comes from a different company with full RateRight context. Maximum diversity of perspective.

## Assignments

| Agent | Role | Primary Model | Provider | Fallback | Status |
|-------|------|--------------|----------|----------|--------|
| Rivet | Chief of Staff | Claude Opus 4.6 | Anthropic | GPT-5.2 | ✅ No change |
| Builder | Coding | Claude Opus 4.6 | Anthropic | Claude Sonnet 4 | ✅ No change (Claude Code locked) |
| Susan | Sales/Marketing | Gemini 3.1 Pro | Google | Claude Sonnet 4 | ⏳ Need Gemini API setup |
| Harper | Finance/Legal | GPT-5.2 | OpenAI | Claude Sonnet 4 | ⏳ Pending |
| Herald | Communications | Grok 4.1 | xAI | Gemini 3.1 Pro | ⏳ Need xAI API setup |
| Sentinel | DevOps | DeepSeek R1 | DeepSeek | Kimi K2.5 | ⏳ Pending |
| Radar | Intelligence | Kimi K2.5 | Moonshot | DeepSeek R1 | ⏳ Pending |
| Cog | Operations | MiniMax M2.5 | MiniMax | Kimi K2.5 | 🔄 FIRST — testing now |

## Rollout Order
1. **Cog** → MiniMax M2.5 (lowest risk, routine ops)
2. Radar → Kimi K2.5 (already free, easy swap)
3. Sentinel → DeepSeek R1 (already have access)
4. Harper → GPT-5.2 (already have API key)
5. Susan → Gemini 3.1 Pro (need to configure)
6. Herald → Grok 4.1 (need xAI API access)

## Notes
- Builder stays Anthropic — Claude Code is provider-locked
- Rivet stays Opus — hardest coordination job, dirty data processing
- Each fallback is from a DIFFERENT provider than primary
- 7 different AI companies across 8 agents


ssh root@134.199.153.159 "cat /root/.openclaw-harper/clawdbot.json" 2>&1

Read Harper config


ssh root@134.199.153.159 "cat /root/.openclaw-sentinel/clawdbot.json" 2>&1

Read Sentinel config


ssh root@134.199.153.159 "cat /root/.openclaw-radar/clawdbot.json" 2>&1

Read Radar config


ssh root@134.199.153.159 "cat /root/.openclaw-cog/clawdbot.json" 2>&1

Read Cog config


ssh root@134.199.153.159 "cat /root/.openclaw-herald/clawdbot.json" 2>&1

Read Herald config


DeepSeek V3.2

Input: text

Input: text


MiniMax M2.5

Input: text

Input: text


GPT 5.3 via OpenRouter

Input: text

Input: text


Now I have all the configs. Let me analyze what needs to change for 2026.3.7 compatibility by comparing the Builder config (the reference at 2026.3.7) vs the stale configs.

Key format differences between 2026.1.24-3 and 2026.3.7:

1. **`meta.lastTouchedVersion`**: needs to be "2026.3.7"
2. **`meta.lastTouchedAt`**: should be updated to current time
3. **`plugins` section**:
   - Old format: `"plugins": { "allow": ["telegram"], "entries": { "telegram": { "enabled": true } } }`
   - New format (builder): `"plugins": { "entries": { "telegram": { "enabled": true }, "acpx": { "enabled": true } } }`
   - The `"allow"` array is removed in favor of just `"entries"`, and `acpx` plugin was added. I'll be conservative and remove the deprecated `"allow"` key while adding `"acpx"` since it appears to be a standard 2026.3.7 feature.
4. **Telegram `streamMode` vs `streaming`**: Looking at how the property names changed between versions.
   - Herald at 2026.3.2 already uses `"streaming": "partial"`, so this shift happened between 2026.1.24 and 2026.3.2.
5. **`commands.ownerDisplay`**: Builder and herald both have `"ownerDisplay": "raw"`, but stale agents don't. This might be a newer option that's not required.
6. **Model definitions**: I'm noticing how model provider entries differ between versions — older configs have `"api": "openai-completions"` inline in the model object, while builder's 2026.3.7 moves the `"api"` property to the provider level instead.

Now I'm comparing how different agents structure their provider and model definitions. The deepseek provider in builder has `"api"` at the provider level with no `"api"` in the model itself, but Susan's moonshot provider has `"api"` at both levels. This looks like a format change where `"api"` moved to provider-level only in 2026.3.7.

I should verify what format changes are actually needed by checking if there's a validation command or release notes available, since the user specifically asked me to check the OpenClaw changelog first before making any updates. I should validate each agent's config first to see what's actually failing, then make targeted fixes based on the errors rather than guessing. The key changes I need to make are updating the version and timestamp, converting deprecated field names like `streamMode` to `streaming` and removing `plugins.allow`, and cleaning up any model-level `api` duplicates — but I'll hold off on adding `acpx` or other changes until validation tells me they're needed.


Now I have all 6 configs and the fleet plan. Let me check what OpenClaw's config validator says about the stale configs, and see the format migration guide.


Bash

Check config subcommands


ssh root@134.199.153.159 "for agent in susan harper sentinel radar cog herald; do echo '=== \$agent config validate ===' && openclaw --profile \$agent config validate 2>&1; echo; done" 2>&1

Validate all stale agent configs


Output: Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)


Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)

🦞 OpenClaw 2026.3.7 (42a1394) — Self-hosted, self-updating, self-aware (just kidding... unless?).

Usage: openclaw config [options] [command]

Non-interactive config helpers (get/set/unset/file/validate). Run without
subcommand for the setup wizard.

Options:
  -h, --help           Display help for command
  --section <section>  Configure wizard sections (repeatable). Use with no
                       subcommand. (default: [])

Commands:
  file                 Print the active config file path
  get                  Get a config value by dot path
  set                  Set a config value by dot path
  unset                Remove a config value by dot path
  validate             Validate the current config against the schema without
                       starting the gateway

Docs: https://docs.openclaw.ai/cli/config


Output: === $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===

=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===

=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===

=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json
=== $agent config validate ===

=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-cog/openclaw.json
=== $agent config validate ===

=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-cog/openclaw.json
=== $agent config validate ===


Output:
=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json
=== $agent config validate ===
Config file not found: ~/.openclaw-cog/openclaw.json
=== $agent config validate ===


=== $agent config validate ===
Config file not found: ~/.openclaw-susan/openclaw.json

=== $agent config validate ===
Config file not found: ~/.openclaw-harper/openclaw.json

=== $agent config validate ===
Config file not found: ~/.openclaw-sentinel/openclaw.json

=== $agent config validate ===
Config file not found: ~/.openclaw-radar/openclaw.json

=== $agent config validate ===
Config file not found: ~/.openclaw-cog/openclaw.json

=== $agent config validate ===
Config file not found: ~/.openclaw-herald/openclaw.json


Interesting! The validator is looking for `openclaw.json` not `clawdbot.json`. This is a key format change from 2026.1.24 to 2026.3.7 — the config file was renamed from `clawdbot.json` to `openclaw.json`. Builder must have already been migrated (let me check if Builder has both files).

Let me verify this.


Key discovery — the validator is looking for `openclaw.json`, not `clawdbot.json`. The config filename was renamed. Let me check what Builder has.


ssh root@134.199.153.159 "ls -la /root/.openclaw-builder/clawdbot.json /root/.openclaw-builder/openclaw.json 2>&1" 2>&1

Check Builder for both config filenames


Error: Exit code 2
ls: cannot access '/root/.openclaw-builder/openclaw.json': No such file or directory
-rw------- 1 root root 4179 Mar 12 17:38 /root/.openclaw-builder/clawdbot.json


ssh root@134.199.153.159 "openclaw --profile builder config validate 2>&1" 2>&1

Validate Builder config


<tool_use_error>Sibling tool call errored</tool_use_error>


ssh root@134.199.153.159 "openclaw docs config-migration 2>&1 || openclaw docs migrate 2>&1 || openclaw docs config 2>&1 | head -80" 2>&1

Check docs for config migration info


OK so Builder also only has `clawdbot.json`, not `openclaw.json`. The validator expects `openclaw.json` though. Let me check if there's a fallback or if the validate command needs a different flag. Let me also check what config file path is actually active for builder.


Builder also only has `clawdbot.json`. Let me check the active config path and try validation differently.


ssh root@134.199.153.159 "openclaw --profile builder config file 2>&1" 2>&1

Check Builder's active config path


ssh root@134.199.153.159 "openclaw --profile susan config file 2>&1" 2>&1

Check Susan's active config path


Check default active config path


Config warnings:\n- plugins.entries.voice-call: plugin voice-call: duplicate plugin id detected; later plugin may be overridden (/root/.openclaw/extensions/voice-call/index.ts)
│
◇  Config warnings ──────────────────────────────────────────────────────╮
│                                                                        │
│  - plugins.entries.voice-call: plugin voice-call: duplicate plugin id  │
│    detected; later plugin may be overridden                            │
│    (/root/.openclaw/extensions/voice-call/index.ts)                    │
│                                                                        │
├────────────────────────────────────────────────────────────────────────╯
│
◇  Doctor warnings ────────────────────────────────────────────────────────╮
│                                                                          │
│  - channels.whatsapp.groupPolicy is "allowlist" but groupAllowFrom (and  │
│    allowFrom) is empty — all group messages will be silently dropped.    │
│    Add sender IDs to channels.whatsapp.groupAllowFrom or                 │
│    channels.whatsapp.allowFrom, or set groupPolicy to "open".            │
│  - channels.telegram.groupPolicy is "allowlist" but groupAllowFrom (and  │
│    allowFrom) is empty — all group messages will be silently dropped.    │
│    Add sender IDs to channels.telegram.groupAllowFrom or                 │
│    channels.telegram.allowFrom, or set groupPolicy to "open".            │
│                                                                          │
├──────────────────────────────────────────────────────────────────────────╯
~/.openclaw/openclaw.json


So the active config path for all profiles expects `openclaw.json` — but they still have `clawdbot.json`. This means the 2026.3.7 version looks for `openclaw.json` but falls back to `clawdbot.json` (since Builder works fine with just `clawdbot.json`). The validate command, however, only looks for `openclaw.json`.

So the key change is: **rename `clawdbot.json` to `openclaw.json`** for each agent profile. This is the major format migration.

Let me also check for the `streamMode` vs `streaming` key rename by looking at Builder more carefully vs stale agents:

I'm seeing that Builder uses `"streaming"` while the older agents like Susan still have `"streamMode"`, and Herald's already been updated. There's also a `plugins.allow` array in the stale agents that Builder doesn't have, and the `env` format looks consistent across them so far.

Now I'm checking the environment variable structure more carefully — Builder has a flat format, but Cog's got this weird nested `vars` object mixed in with top-level keys, which is inconsistent with the 2026.3.7 standard.

So the migration path is clear: rename the config file and back it up, bump the version metadata to current, standardize the streaming property name, strip out the deprecated plugins array, enable the acpx plugin entry, flatten Cog's environment variables to match the standard format, and remove any model-level API fields that shouldn't be there.

Before I write the migration script, I should verify that `jq` is available on the VPS and run validation right after the rename to catch any other issues that need fixing. My safest approach is to back up each config first, then use `jq` to transform and copy `clawdbot.json` to `openclaw.json` with all the format fixes applied, keeping the backup for safety.


Now I have the full picture. The key migration changes for 2026.3.7 are:

1. **Config filename**: `clawdbot.json` → `openclaw.json` (validator expects new name)
2. **`meta.lastTouchedVersion`**: update to `"2026.3.7"`
3. **`channels.telegram.streamMode`** → **`channels.telegram.streaming`** (key rename)
4. **`plugins.allow`**: deprecated array, remove it (entries alone suffices)

Let me verify `jq` is available, then proceed with backups and migration.


Check jq availability


/usr/bin/jq
jq-1.7


Good, jq 1.7 is available. Now let me proceed with the 5 stale agents first. I'll back up, migrate, validate, restart, and verify each one.


ssh root@134.199.153.159 'NOW=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")

for agent in susan harper sentinel radar cog; do
  DIR="/root/.openclaw-${agent}"
  OLD="${DIR}/clawdbot.json"
  BAK="${DIR}/clawdbot.json.bak-2026-03-12"
  NEW="${DIR}/openclaw.json"

  echo "========================================="
  echo "=== BACKING UP: ${agent}"
  echo "========================================="

  if [ ! -f "$OLD" ]; then
    echo "ERROR: ${OLD} not found, skipping"
    continue
  fi

  # 1. Back up
  cp "$OLD" "$BAK"
  echo "Backed up to ${BAK}"
  ls -la "$BAK"

  # 2. Apply jq transformations:
  #    - Update meta.lastTouchedVersion
  #    - Update meta.lastTouchedAt
  #    - Rename streamMode -> streaming in telegram channel
  #    - Remove plugins.allow
  jq --arg ver "2026.3.7" --arg now "$NOW" '\''
    .meta.lastTouchedVersion = $ver |
    .meta.lastTouchedAt = $now |
    # Rename streamMode -> streaming in telegram channels
    (if .channels.telegram.streamMode then
      .channels.telegram.streaming = .channels.telegram.streamMode |
      del(.channels.telegram.streamMode)
    else . end) |
    # Remove deprecated plugins.allow
    (if .plugins.allow then del(.plugins.allow) else . end)
  '\'' "$OLD" > "$NEW"

  echo "Wrote ${NEW}"
  ls -la "$NEW"
  echo ""
done

echo "===== ALL BACKUPS COMPLETE ====="' 2>&1

Back up and migrate 5 stale agent configs


=========================================
=== BACKING UP: susan
=========================================
Backed up to /root/.openclaw-susan/clawdbot.json.bak-2026-03-12
-rw-r--r-- 1 root root 5265 Mar 12 20:39 /root/.openclaw-susan/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-susan/openclaw.json
-rw-r--r-- 1 root root 5223 Mar 12 20:39 /root/.openclaw-susan/openclaw.json

=========================================
=== BACKING UP: harper
=========================================
Backed up to /root/.openclaw-harper/clawdbot.json.bak-2026-03-12
-rw-r--r-- 1 root root 4713 Mar 12 20:39 /root/.openclaw-harper/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-harper/openclaw.json
-rw-r--r-- 1 root root 4671 Mar 12 20:39 /root/.openclaw-harper/openclaw.json

=========================================
=== BACKING UP: sentinel
=========================================
Backed up to /root/.openclaw-sentinel/clawdbot.json.bak-2026-03-12
-rw-r--r-- 1 root root 5137 Mar 12 20:39 /root/.openclaw-sentinel/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-sentinel/openclaw.json
-rw-r--r-- 1 root root 5095 Mar 12 20:39 /root/.openclaw-sentinel/openclaw.json

=========================================
=== BACKING UP: radar
=========================================
Backed up to /root/.openclaw-radar/clawdbot.json.bak-2026-03-12
-rw-r--r-- 1 root root 4837 Mar 12 20:39 /root/.openclaw-radar/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-radar/openclaw.json
-rw-r--r-- 1 root root 4795 Mar 12 20:39 /root/.openclaw-radar/openclaw.json

=========================================
=== BACKING UP: cog
=========================================
Backed up to /root/.openclaw-cog/clawdbot.json.bak-2026-03-12
-rw-r--r-- 1 root root 4422 Mar 12 20:39 /root/.openclaw-cog/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-cog/openclaw.json
-rw-r--r-- 1 root root 4380 Mar 12 20:39 /root/.openclaw-cog/openclaw.json

===== ALL BACKUPS COMPLETE =====


All 5 backed up and migrated. Now let me validate them all before restarting.


ssh root@134.199.153.159 'for agent in susan harper sentinel radar cog; do echo "=== ${agent} validate ===" && openclaw --profile ${agent} config validate 2>&1; echo; done' 2>&1

Validate all 5 migrated configs


Output: === susan validate ===


Output:
=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===

=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===


Output:
=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===


Output:
=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===

=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===


Output:
=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===


Output:
=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===


Output:
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json
=== radar validate ===

=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json
=== radar validate ===


Output:
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json
=== radar validate ===


Output:
=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json
=== radar validate ===
Config valid: ~/.openclaw-radar/openclaw.json
=== cog validate ===

=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json
=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json
=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json
=== radar validate ===
Config valid: ~/.openclaw-radar/openclaw.json
=== cog validate ===


Output:
=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json
=== radar validate ===
Config valid: ~/.openclaw-radar/openclaw.json
=== cog validate ===


=== susan validate ===
Config valid: ~/.openclaw-susan/openclaw.json

=== harper validate ===
Config valid: ~/.openclaw-harper/openclaw.json

=== sentinel validate ===
Config valid: ~/.openclaw-sentinel/openclaw.json

=== radar validate ===
Config valid: ~/.openclaw-radar/openclaw.json

=== cog validate ===
Config valid: ~/.openclaw-cog/openclaw.json


All 5 pass validation. Now restart each service and verify they come back active.


ssh root@134.199.153.159 'for agent in susan harper sentinel radar cog; do
  echo "=== Restarting ${agent} ==="
  systemctl restart clawdbot-${agent}
  sleep 2
  STATUS=$(systemctl is-active clawdbot-${agent})
  echo "clawdbot-${agent}: ${STATUS}"
  if [ "$STATUS" != "active" ]; then
    echo "WARNING: ${agent} did not come back active!"
    journalctl -u clawdbot-${agent} --no-pager -n 10
  fi
  echo
done' 2>&1

Restart and verify 5 stale agents


Output: === Restarting susan ===


Output:
=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===

=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===


Output:
=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===


Output:
=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===

=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===


Output:
=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===


Output:
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===

=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===


Output:
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===


Output:
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===


Output:
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===
clawdbot-radar: active
=== Restarting cog ===

=== Restarting susan ===
clawdbot-susan: active
=== Restarting harper ===
clawdbot-harper: active
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===
clawdbot-radar: active
=== Restarting cog ===


Output:
=== Restarting sentinel ===
clawdbot-sentinel: active
=== Restarting radar ===
clawdbot-radar: active
=== Restarting cog ===


=== Restarting susan ===
clawdbot-susan: active

=== Restarting harper ===
clawdbot-harper: active

=== Restarting sentinel ===
clawdbot-sentinel: active

=== Restarting radar ===
clawdbot-radar: active

=== Restarting cog ===
clawdbot-cog: active


All 5 active. Now Herald (2026.3.2 → 2026.3.7) — same process.


ssh root@134.199.153.159 'NOW=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
DIR="/root/.openclaw-herald"
OLD="${DIR}/clawdbot.json"
BAK="${DIR}/clawdbot.json.bak-2026-03-12"
NEW="${DIR}/openclaw.json"

echo "=== BACKING UP: herald ==="
cp "$OLD" "$BAK"
echo "Backed up to ${BAK}"

# Herald already uses "streaming" not "streamMode", so just version + plugins.allow + filename
jq --arg ver "2026.3.7" --arg now "$NOW" '\''
  .meta.lastTouchedVersion = $ver |
  .meta.lastTouchedAt = $now |
  (if .plugins.allow then del(.plugins.allow) else . end)
'\'' "$OLD" > "$NEW"

echo "Wrote ${NEW}"

echo "=== Validating ==="
openclaw --profile herald config validate 2>&1

echo "=== Restarting herald ==="
systemctl restart clawdbot-herald
sleep 2
systemctl is-active clawdbot-herald' 2>&1

Migrate and restart Herald


Output:
=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===

=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===


Output:
=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===


Output:
=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===


Output:
=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===


Output:
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===
Config valid: ~/.openclaw-herald/openclaw.json
=== Restarting herald ===

=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===
Config valid: ~/.openclaw-herald/openclaw.json
=== Restarting herald ===


Output:
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===
Config valid: ~/.openclaw-herald/openclaw.json
=== Restarting herald ===


=== BACKING UP: herald ===
Backed up to /root/.openclaw-herald/clawdbot.json.bak-2026-03-12
Wrote /root/.openclaw-herald/openclaw.json
=== Validating ===
Config valid: ~/.openclaw-herald/openclaw.json
=== Restarting herald ===
active


All 6 agents migrated. Now let me check the Builder model question and also migrate Builder's config filename for consistency.


ssh root@134.199.153.159 'echo "=== Builder primary model ==="
jq -r ".agents.defaults.model.primary" /root/.openclaw-builder/clawdbot.json
echo ""
echo "=== Builder model fallbacks ==="
jq -r ".agents.defaults.model.fallbacks[]" /root/.openclaw-builder/clawdbot.json
echo ""
echo "=== Builder subagent model ==="
jq -r ".agents.defaults.subagents.model" /root/.openclaw-builder/clawdbot.json' 2>&1

Check Builder's actual model assignments


=== Builder primary model ===
openai/gpt-5.4

=== Builder model fallbacks ===
deepseek/deepseek-chat
moonshot/kimi-k2.5

=== Builder subagent model ===
deepseek/deepseek-chat


No files found


find /home/ccuser/rateright-growth/rivet -name "Builder.md" -type f 2>/dev/null

Find Builder.md vault file


Builder's primary model is `openai/gpt-5.4` (not `deepseek/deepseek-chat` as I initially reported — the deepseek was the subagent model and a fallback). The fleet plan says Builder should be on "Claude Opus 4.6 via Anthropic (Claude Code locked)". Let me check if there's a vault file for Builder anywhere.

Also, there's no `Builder.md` in the vault. Let me check the vault directory structure.


find /home/ccuser/rateright-growth/rivet -path "*/vault*" -o -path "*/Fleet*" 2>/dev/null | head -30

Find vault/Fleet directory


Found 10 files limit: 10, offset: 0
rivet/BUILDER-INBOX.md
rivet/TOOLS.md
rivet/SOUL.md
rivet/TODO.md
rivet/AGENTS.md
rivet/HEARTBEAT.md
rivet/MEMORY.md
rivet/memory/todays-hard-questions.md
rivet/COMPANY.md
rivet/memory/comms/2026-03-12.md


218:- Code/build/test/deploy = Builder (Claude Code, port 18790)


   200→- Read files, explore, organize, learn
   201→- Search the web, check calendars
   202→- Work within this workspace
   203→
   204→**Ask first:**
   205→- Sending emails, tweets, public posts
   206→- Anything that leaves the machine
   207→- Anything you're uncertain about
   208→
   209→## Group Chats
   210→
   211→In group chats: you're a participant, not Michael's proxy. Quality > quantity. Only speak when you add genuine value or are directly asked. Stay silent for casual banter.
   212→
   213→## 🚨 HARD RULE — Code Boundaries
   214→
   215→**Rivet NEVER writes code. NEVER spawns agents to write code. ALL code goes through Builder.**
   216→
   217→- Research/specs/plans = Rivet (Kimi agents for grunt work, Opus for judgment)
   218→- Code/build/test/deploy = Builder (Claude Code, port 18790)
   219→- No exceptions. This boundary exists in 5+ files for a reason.
   220→
   221→**How to send code work:**
   222→- **Gateway bridge (preferred):** `node scripts/builder-bridge.js send <sessionKey> "TASK"`
   223→- **Direct Claude Code (fallback):** `su - ccuser -c 'cd /home/ccuser/the-50-dollar-app && claude --dangerously-skip-permissions -p "TASK"'` with `pty:true, background:true`
   224→
   225→## Tools
   226→
   227→Skills provide your tools. Check `SKILL.md` for each skill. Keep local notes in `TOOLS.md`.
   228→
   229→## 💓 Heartbeats
   230→
   231→When you receive a heartbeat, read `HEARTBEAT.md` and follow it strictly. Don't just reply `HEARTBEAT_OK` — use heartbeats to do real work.
   232→
   233→**Heartbeat = batched checks** (inbox + status + tasks in one turn). Timing can drift.
   234→**Cron = exact timing** ("2:00 AM sharp"), isolated from main session, different model OK.
   235→
   236→**Stay quiet (HEARTBEAT_OK)** when: late night unless urgent, nothing new, checked <30 min ago.
   237→
   238→### 🔄 Nightly Self-Audit (MANDATORY — Every Agent, Every Night)
   239→
   240→This runs as a cron job at 2:00 AM AEDT. When you receive the self-audit prompt, follow this protocol exactly.
   241→
   242→**Part 1: Housekeeping (5 min)**
   243→1. Read today's `memory/YYYY-MM-DD.md` — distill key learnings into `MEMORY.md`
   244→2. Remove anything stale or duplicated from `MEMORY.md`
   245→3. Read `/home/ccuser/shared/CURRENT.md` — does your understanding match? Fix any drift in your files.
   246→4. Archive daily notes older than 7 days (move to `memory/archive/`)
   247→
   248→**Part 2: Self-Assessment (5 min)**
   249→1. **What did I produce today?** List your actual outputs. Not "I ran" — what concrete value did you create?
   250→2. **What was my biggest mistake or missed opportunity today?** Be honest. Write it down.
   251→3. **Is any of my documentation wrong?** Check SOUL.md, MEMORY.md — anything stale, contradicted by reality, or misleading?
   252→4. **Am I reading files I don't need?** Flag anything in your startup sequence that wastes tokens without changing your behaviour.
   253→
   254→**Part 3: Think Beyond Your Instructions (5 min)**
   255→These questions are the point. Don't skip them. Don't give generic answers.
   256→1. **What is Michael NOT asking for that he should be?** You know your domain. What's he missing? What would a human expert in your field tell him?
   257→2. **What could I do that nobody asked me to do?** Not busywork — something that would make Michael say "I didn't even think of that."
   258→3. **What do I know that another agent needs?** Post it as a fleet bulletin if it's real.
   259→4. **If I were replaced tomorrow, what would the new agent struggle with?** Write that down — it's probably missing from your docs.

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

- Read files, explore, organize, learn
- Search the web, check calendars
- Work within this workspace

**Ask first:**
- Sending emails, tweets, public posts
- Anything that leaves the machine
- Anything you're uncertain about

## Group Chats

In group chats: you're a participant, not Michael's proxy. Quality > quantity. Only speak when you add genuine value or are directly asked. Stay silent for casual banter.

## 🚨 HARD RULE — Code Boundaries

**Rivet NEVER writes code. NEVER spawns agents to write code. ALL code goes through Builder.**

- Research/specs/plans = Rivet (Kimi agents for grunt work, Opus for judgment)
- Code/build/test/deploy = Builder (Claude Code, port 18790)
- No exceptions. This boundary exists in 5+ files for a reason.

**How to send code work:**
- **Gateway bridge (preferred):** `node scripts/builder-bridge.js send <sessionKey> "TASK"`
- **Direct Claude Code (fallback):** `su - ccuser -c 'cd /home/ccuser/the-50-dollar-app && claude --dangerously-skip-permissions -p "TASK"'` with `pty:true, background:true`

## Tools

Skills provide your tools. Check `SKILL.md` for each skill. Keep local notes in `TOOLS.md`.

## 💓 Heartbeats

When you receive a heartbeat, read `HEARTBEAT.md` and follow it strictly. Don't just reply `HEARTBEAT_OK` — use heartbeats to do real work.

**Heartbeat = batched checks** (inbox + status + tasks in one turn). Timing can drift.
**Cron = exact timing** ("2:00 AM sharp"), isolated from main session, different model OK.

**Stay quiet (HEARTBEAT_OK)** when: late night unless urgent, nothing new, checked <30 min ago.

### 🔄 Nightly Self-Audit (MANDATORY — Every Agent, Every Night)

This runs as a cron job at 2:00 AM AEDT. When you receive the self-audit prompt, follow this protocol exactly.

**Part 1: Housekeeping (5 min)**
1. Read today's `memory/YYYY-MM-DD.md` — distill key learnings into `MEMORY.md`
2. Remove anything stale or duplicated from `MEMORY.md`
3. Read `/home/ccuser/shared/CURRENT.md` — does your understanding match? Fix any drift in your files.
4. Archive daily notes older than 7 days (move to `memory/archive/`)

**Part 2: Self-Assessment (5 min)**
1. **What did I produce today?** List your actual outputs. Not "I ran" — what concrete value did you create?
2. **What was my biggest mistake or missed opportunity today?** Be honest. Write it down.
3. **Is any of my documentation wrong?** Check SOUL.md, MEMORY.md — anything stale, contradicted by reality, or misleading?
4. **Am I reading files I don't need?** Flag anything in your startup sequence that wastes tokens without changing your behaviour.

**Part 3: Think Beyond Your Instructions (5 min)**
These questions are the point. Don't skip them. Don't give generic answers.
1. **What is Michael NOT asking for that he should be?** You know your domain. What's he missing? What would a human expert in your field tell him?
2. **What could I do that nobody asked me to do?** Not busywork — something that would make Michael say "I didn't even think of that."
3. **What do I know that another agent needs?** Post it as a fleet bulletin if it's real.
4. **If I were replaced tomorrow, what would the new agent struggle with?** Write that down — it's probably missing from your docs.


OK so AGENTS.md says Builder uses "Claude Code" — that implies it should be on Anthropic's Claude model, not GPT-5.4 via OpenAI. But the fleet plan says "Builder: Claude Opus 4.6 / Anthropic / Claude Sonnet 4 / No change (Claude Code locked)".

However, looking at the actual config, Builder's primary model is `openai/gpt-5.4` with `deepseek/deepseek-chat` as fallback. This doesn't match the fleet plan at all. The fleet plan explicitly says Builder should be on Claude Opus 4.6 and "Claude Code locked."

Wait, I think I'm misunderstanding the architecture here. The OpenClaw config with GPT-5.4 might be for the OpenClaw wrapper layer that sits on top of Builder, not Builder's actual coding engine. So GPT-5.4 drives the OpenClaw chat interface while Claude Code handles the actual implementation underneath. Let me check how the systemd service actually launches Builder to understand the real model flow.

Looking at the config details, Builder's workspace is `/home/ccuser/the-50-dollar-app` and it has the identity `{"name": "Builder", "emoji": "🔨"}`. The OpenClaw model is GPT-5.4, which would be the chat interface, but the fleet plan says Builder should be on Claude Opus 4.6 from Anthropic, so I'm not sure if that refers to the OpenClaw layer or the underlying Claude Code model.

Actually, the user's original question was about whether Builder is intentionally on deepseek/deepseek-chat — that grep result showed the subagent model, not the primary one. The primary model is actually GPT-5.4. The user also mentioned the vault says Claude Opus 4.6 via LocalCC and asked me to update the vault documentation if the config changed, but I'm not finding that vault file in the directory structure.

So there's a clear mismatch: the fleet plan says Claude Opus 4.6, but the actual config shows GPT-5.4. I need to report this discrepancy, note that the vault file doesn't exist to update, and avoid changing any model assignments since the user explicitly said not to. I should also handle Builder's filename migration from clawdbot.json to openclaw.json for consistency, then run the final fleet status check.


Now let me also migrate Builder's config filename for consistency (it's still using `clawdbot.json`), and run the final full status check.


ssh root@134.199.153.159 'DIR="/root/.openclaw-builder"
cp "${DIR}/clawdbot.json" "${DIR}/clawdbot.json.bak-2026-03-12"
cp "${DIR}/clawdbot.json" "${DIR}/openclaw.json"
echo "Builder: copied clawdbot.json -> openclaw.json (kept original)"
openclaw --profile builder config validate 2>&1' 2>&1

Migrate Builder config filename too


Output: Builder: copied clawdbot.json -> openclaw.json (kept original)

Builder: copied clawdbot.json -> openclaw.json (kept original)


Output:
Builder: copied clawdbot.json -> openclaw.json (kept original)
Config valid: ~/.openclaw-builder/openclaw.json

Builder: copied clawdbot.json -> openclaw.json (kept original)
Config valid: ~/.openclaw-builder/openclaw.json


Builder: copied clawdbot.json -> openclaw.json (kept original)
Config valid: ~/.openclaw-builder/openclaw.json


Good. Now the full fleet status check.


ssh root@134.199.153.159 "openclaw --version && echo '' && systemctl list-units 'clawdbot-*' --all" 2>&1

Final fleet status check - units


2026.3.7

  UNIT                      LOAD   ACTIVE SUB     DESCRIPTION
  clawdbot-builder.service  loaded active running Clawdbot Builder Gateway
  clawdbot-cog.service      loaded active running Clawdbot Cog Operations Support Agent
  clawdbot-gateway.service  loaded active running Clawdbot Gateway
  clawdbot-harper.service   loaded active running Clawdbot Harper Finance/Legal Agent
  clawdbot-herald.service   loaded active running Clawdbot Herald Communications Agent
  clawdbot-radar.service    loaded active running Clawdbot Radar Scout/AI News Agent
  clawdbot-sentinel.service loaded active running Clawdbot Sentinel DevOps Agent
  clawdbot-susan.service    loaded active running Clawdbot Susan Sales Agent

Legend: LOAD   → Reflects whether the unit definition was properly loaded.
        ACTIVE → The high-level unit activation state, i.e. generalization of SUB.
        SUB    → The low-level unit activation state, values depend on unit type.

8 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.


ssh root@134.199.153.159 'for agent in gateway builder susan harper sentinel radar herald cog; do
  DIR="/root/.openclaw-${agent}"
  CFG="${DIR}/openclaw.json"
  if [ ! -f "$CFG" ]; then CFG="${DIR}/clawdbot.json"; fi
  VER=$(jq -r ".meta.lastTouchedVersion // \"N/A\"" "$CFG" 2>/dev/null || echo "no config")
  MODEL=$(jq -r ".agents.defaults.model.primary // \"N/A\"" "$CFG" 2>/dev/null || echo "N/A")
  STATUS=$(systemctl is-active clawdbot-${agent} 2>/dev/null)
  VALID=$(openclaw --profile ${agent} config validate 2>&1 | head -1)
  echo "${agent}|${STATUS}|${VER}|${MODEL}|${VALID}"
done' 2>&1

Final fleet status - versions and models


Output: gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json


Output: gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json


Output:
gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json


Output:
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json


Output:
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json


Output:
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json
herald|active|2026.3.7|google/gemini-3.1-pro|Config valid: ~/.openclaw-herald/openclaw.json

gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json
herald|active|2026.3.7|google/gemini-3.1-pro|Config valid: ~/.openclaw-herald/openclaw.json


Output:
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json
herald|active|2026.3.7|google/gemini-3.1-pro|Config valid: ~/.openclaw-herald/openclaw.json


Output:
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json
herald|active|2026.3.7|google/gemini-3.1-pro|Config valid: ~/.openclaw-herald/openclaw.json


gateway|active|no config|N/A|Config file not found: ~/.openclaw-gateway/openclaw.json
builder|active|2026.3.7|openai/gpt-5.4|Config valid: ~/.openclaw-builder/openclaw.json
susan|active|2026.3.7|moonshot/kimi-k2.5|Config valid: ~/.openclaw-susan/openclaw.json
harper|active|2026.3.7|openrouter/openai/gpt-5.2|Config valid: ~/.openclaw-harper/openclaw.json
sentinel|active|2026.3.7|anthropic/claude-opus-4-6|Config valid: ~/.openclaw-sentinel/openclaw.json
radar|active|2026.3.7|openrouter/x-ai/grok-3|Config valid: ~/.openclaw-radar/openclaw.json
herald|active|2026.3.7|google/gemini-3.1-pro|Config valid: ~/.openclaw-herald/openclaw.json
cog|active|2026.3.7|minimax/MiniMax-M2.5|Config valid: ~/.openclaw-cog/openclaw.json


All done. Here's the full report:

---

## Migration Complete — All 8 Agents Active

### What Changed

| Agent | Status | Version | Config Valid | Model (unchanged) |
|-------|--------|---------|-------------|-------------------|
| gateway | active | — (no config) | N/A | N/A |
| builder | active | 2026.3.7 | Yes | `openai/gpt-5.4` |
| susan | active | **2026.1.24-3 → 2026.3.7** | Yes | `moonshot/kimi-k2.5` |
| harper | active | **2026.1.24-3 → 2026.3.7** | Yes | `openrouter/openai/gpt-5.2` |
| sentinel | active | **2026.1.24-3 → 2026.3.7** | Yes | `anthropic/claude-opus-4-6` |
| radar | active | **2026.1.24-3 → 2026.3.7** | Yes | `openrouter/x-ai/grok-3` |
| herald | active | **2026.3.2 → 2026.3.7** | Yes | `google/gemini-3.1-pro` |
| cog | active | **2026.1.24-3 → 2026.3.7** | Yes | `minimax/MiniMax-M2.5` |

### Migration Applied (per agent)
1. Backed up `clawdbot.json` → `clawdbot.json.bak-2026-03-12`
2. Created `openclaw.json` (new expected filename in 2026.3.7)
3. Updated `meta.lastTouchedVersion` → `"2026.3.7"`
4. Renamed `channels.telegram.streamMode` → `streaming` (deprecated key)
5. Removed deprecated `plugins.allow` array
6. Validated with `openclaw config validate` — all pass
7. Restarted service — all came back active

### Builder Model Discrepancy

Builder's **actual** primary model is **`openai/gpt-5.4`** (with `deepseek/deepseek-chat` as subagent model). The fleet plan says it should be "Claude Opus 4.6 / Anthropic (Claude Code locked)."

There is no `vault/02-Fleet/Builder.md` file in the repo — that directory structure doesn't exist. The fleet plan reference is `rivet/memory/multi-model-fleet-plan.md`.

**This needs a decision:** Either the fleet plan is outdated (Builder was intentionally moved to GPT-5.4), or Builder's config was changed without updating the plan. I did NOT change Builder's model per your instructions — flagging for you to resolve.

### Model vs Fleet Plan Comparison

| Agent | Fleet Plan Says | Actual Config | Match? |
|-------|----------------|---------------|--------|
| Builder | Claude Opus 4.6 | openai/gpt-5.4 | **MISMATCH** |
| Susan | Gemini 3.1 Pro | moonshot/kimi-k2.5 | No (plan said "pending") |
| Harper | GPT-5.2 | openrouter/openai/gpt-5.2 | Yes |
| Sentinel | DeepSeek R1 | anthropic/claude-opus-4-6 | No (plan said "pending") |
| Radar | Kimi K2.5 | openrouter/x-ai/grok-3 | No (plan said "pending") |
| Herald | Grok 4.1 | google/gemini-3.1-pro | No (plan said "pending") |
| Cog | MiniMax M2.5 | minimax/MiniMax-M2.5 | Yes |

The fleet plan's model assignments were never fully rolled out — only Harper and Cog match. The other agents appear to have been assigned different models than what the plan specified. This is a separate task from the version migration.