# OpenClaw Agent Optimisation Runbook
Last updated: 2026-04-02
Purpose: Single source of truth for periodically optimising all agents — latency, token spend, model routing, rule enforcement. Run as cron (weekly) or on demand.

---

## When to run this

- Adding a new WhatsApp project group
- Agent starts getting slow / responses feel heavy
- AGENTS.md or project files have grown large
- After a long project sprint (state files need rotation)
- Quarterly hygiene pass

---

## 1. Architecture overview (don't deviate from this)

Three layers, always:

**Master agent (Dot / Daryl's DM)**
- Thin control plane
- Routes, approves, sets standards
- Does NOT do coding or deep project work

**Project agent (one per WhatsApp group)**
- Responsive front-end for that project
- Reads compact state files on every turn
- Delegates non-trivial work to subagents
- Writes results back to files; summarises to chat

**Subagents (disposable workers)**
- Spawned for coding, debugging, testing, research, normalisation
- Shallow depth only (max 1 level — no sub-subagents)
- Max 2 concurrent per project group
- Write back to files; report to project agent

---

## 2. Hot-path file rules

Every agent loads these on every turn. Keep them SHORT.

| File | Max size | Contents |
|------|----------|----------|
| `AGENTS.md` | ~40 lines | Role, startup reads, delegation thresholds, key file paths, model policy |
| `GROUP_RULES.md` | ~15 lines | Project context, admin, basic behavior |
| `PROJECT.md` | 300–600 words | Title, objective, scope, constraints, deliverables, success criteria |
| `PROGRESS.md` | 200–500 words | Status, phase, done, in-progress, blockers, next actions |
| `TASKS.md` | Active items only | Tabular: ID, task, owner, status, depends, notes |
| `HANDOFF.md` | 150–300 words | Current owner, next owner, exact next action, inputs, warnings, questions |

Load only when needed (NOT on every turn):
- `DECISIONS.md` — architecture/policy decisions
- `RISKS.md` — open risks only
- `ARTIFACTS.md` — file/endpoint index
- `LOG.md` — milestone log

**Golden rule:** If you'd be embarrassed to pay tokens for it on every message, move it to a conditional file or the orchestrator skill.

---

## 3. Canonical AGENTS.md shape for project groups

Copy this template when creating or resetting a group agent:

```md
# AGENTS.md - <Project Name> Group

## Session Startup
1. Read `SOUL.md`
2. Read `GROUP_RULES.md`
3. Read today + yesterday from `memory/YYYY-MM-DD.md`
4. Read `projects/<project-slug>/PROJECT.md` and `projects/<project-slug>/PROGRESS.md`

## Project
- **Name:** <Project Name>
- **Goal:** <one-line goal>
- **Workspace:** `projects/<project-slug>/`
- **Admin:** Daryl (+6598333504)

## Delegation
- Answer questions, update state files, triage → do directly
- Coding (>20 lines), debugging, testing, research → spawn subagent (sonnet-class)
- Max 2 concurrent subagents; shallow depth (no sub-subagents)
- Subagent writes to files; you summarise to chat

## Rules
- One concise response per message; detail in files
- No markdown tables (WhatsApp)
- Log progress in `memory/YYYY-MM-DD.md`
- For full orchestrator doctrine: `skills/project-orchestrator/SKILL.md`
```

---

## 4. Orchestrator skill location

Full delegation doctrine, subagent contracts, file rotation rules, model policy live here — NOT in AGENTS.md:

```
/home/ubuntu/.openclaw/workspace/skills/project-orchestrator/SKILL.md
```

Agents reference it with: `"For full orchestrator doctrine: skills/project-orchestrator/SKILL.md"`

When to update the skill (not AGENTS.md):
- Changing delegation thresholds
- Adding subagent contract format
- Changing model routing rules
- Adding rotation/archival procedures

---

## 5. Model policy

| Work type | Model |
|-----------|-------|
| Project agent (group chat) | sonnet-class |
| Coding subagents | sonnet-class |
| Architecture / high-value synthesis | opus (only when quality materially matters) |
| Cron, heartbeat, maintenance, cleanup | haiku / minimax |
| Normalisation, log rotation, backup | haiku / minimax |

**Cron jobs:** All should use `minimax/MiniMax-M2.7-highspeed` unless the job requires reasoning.

---

## 6. Project folder structure

Every active project workspace should have:

```
projects/<project-slug>/
  PROJECT.md       ← always loaded
  PROGRESS.md      ← always loaded
  TASKS.md         ← always loaded
  HANDOFF.md       ← always loaded
  DECISIONS.md     ← load on demand
  RISKS.md         ← load on demand
  ARTIFACTS.md     ← load on demand
  LOG.md           ← load on demand
  archive/         ← rotated old files
```

---

## 7. File rotation rules

Rotate when files get noisy:

- `TASKS.md` crowded → archive completed items to `archive/tasks-YYYY-MM-DD.md`
- `LOG.md` long → trim to last 20 milestones, archive older entries
- `RISKS.md` full of resolved items → archive resolved, keep open only
- `PROGRESS.md` acting like a diary → rewrite to current state, archive old version

How to rotate: spawn a `normalizer` subagent with haiku — don't do it inline.

---

## 8. Subagent contract format

Every spawned subagent must receive:

```
ROLE: <coding|debug|test|research|writer|review|qa|normalizer|backup>
PROJECT: <project-slug>

OBJECTIVE
<precise bounded task>

SCOPE
- In scope: <items>
- Out of scope: <items>

READ FIRST
- projects/<project-slug>/PROJECT.md
- projects/<project-slug>/PROGRESS.md
- projects/<project-slug>/TASKS.md
- projects/<project-slug>/HANDOFF.md
- <any extra files>

INPUTS
<files or context>

DELIVERABLE
<exact expected output>

WRITE BACK
- Update PROGRESS.md
- Update TASKS.md
- Update HANDOFF.md
- Append one line to LOG.md
- (other files only if relevant)

STOP CONDITION
<clear done state>

ESCALATE IF
- Missing dependency
- Ambiguous requirement
- Unsafe change required
```

---

## 9. Optimisation steps (run periodically)

> Run this checklist in order. Each step has pass/fail criteria. Fix before moving on.

### Step 1 — Backup first (always)
```bash
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
ARCHIVE=/home/ubuntu/.openclaw/workspace/.archive/migration-$TIMESTAMP
mkdir -p $ARCHIVE
# Copy group AGENTS.md files
for ws in interactions-with-group-rescue-app interactions-with-group-camera-app interactions-with-portfolio-app interactions-with-roast-time-buddy; do
  cp /home/ubuntu/.openclaw/workspace/$ws/AGENTS.md $ARCHIVE/${ws}-AGENTS.md 2>/dev/null || true
done
# Copy global files
cp /home/ubuntu/.openclaw/workspace/AGENTS.md $ARCHIVE/AGENTS.md.global
cp /home/ubuntu/.openclaw/workspace/SYSTEM_INSTRUCTIONS.md $ARCHIVE/SYSTEM_INSTRUCTIONS.md
echo "Backup done: $ARCHIVE"
```

### Step 2 — Audit hot-path sizes
```bash
for ws in interactions-with-group-rescue-app interactions-with-group-camera-app interactions-with-portfolio-app interactions-with-roast-time-buddy; do
  lines=$(wc -l < /home/ubuntu/.openclaw/workspace/$ws/AGENTS.md 2>/dev/null || echo 0)
  echo "$ws: AGENTS.md = $lines lines"
done
wc -l /home/ubuntu/.openclaw/workspace/AGENTS.md /home/ubuntu/.openclaw/workspace/SYSTEM_INSTRUCTIONS.md
```

### Step 3 — Check project state files exist
```bash
for ws in interactions-with-group-rescue-app interactions-with-group-camera-app interactions-with-portfolio-app interactions-with-roast-time-buddy; do
  echo "=== $ws ==="
  for f in PROJECT.md PROGRESS.md TASKS.md HANDOFF.md; do
    # Check in both workspace root and projects subdir
    found=$(find /home/ubuntu/.openclaw/workspace/$ws/projects/ -name "$f" 2>/dev/null | head -1)
    echo "  $f: ${found:-MISSING}"
  done
done
```

### Step 4 — Slim any AGENTS.md > 50 lines
- Move any doctrine, long rules, or templates into `skills/project-orchestrator/SKILL.md`
- Keep AGENTS.md to: startup reads, project brief, delegation thresholds, key file paths, model policy
- Use the canonical template in §3 above as the target

### Step 5 — Rotate bloated project files
- Check PROGRESS.md, LOG.md, TASKS.md file sizes
- If any > threshold: spawn haiku normalizer subagent per §8 contract
- Archive old versions before rewriting

### Step 6 — Verify skill is current
```bash
wc -l /home/ubuntu/.openclaw/workspace/skills/project-orchestrator/SKILL.md
```
If skill has grown >150 lines, consider splitting into sections with clear headers.

### Step 7 — Enforce File Protocol in all group AGENTS.md
```bash
echo "=== File Protocol check ==="
for ws in $(ls /home/ubuntu/.openclaw/workspace/ | grep "interactions-with-group\|interactions-with-portfolio\|interactions-with-roast"); do
  ws_path=/home/ubuntu/.openclaw/workspace/$ws
  [ ! -f "$ws_path/AGENTS.md" ] && echo "❌ $ws: no AGENTS.md" && continue
  has_protocol=$(grep -c "## File Protocol" $ws_path/AGENTS.md 2>/dev/null || echo 0)
  has_startup=$(grep "PROJECT.md.*PROGRESS.md.*TASKS.md.*HANDOFF.md\|PROGRESS.md.*TASKS.md.*HANDOFF.md" $ws_path/AGENTS.md 2>/dev/null | wc -l)
  [ "$has_protocol" -gt 0 ] && echo "✅ $ws: has File Protocol" || echo "❌ $ws: MISSING File Protocol"
  [ "$has_startup" -gt 0 ] && echo "✅ $ws: startup reads 4 state files" || echo "❌ $ws: startup missing state file reads"
done
```
Fix: add File Protocol section + update Session Startup step 4 to read PROJECT.md, PROGRESS.md, TASKS.md, HANDOFF.md. Use §3 template.

### Step 7b — State files exist for all group workspaces
```bash
echo "=== State files check ==="
for ws in $(ls /home/ubuntu/.openclaw/workspace/ | grep "interactions-with-group\|interactions-with-portfolio\|interactions-with-roast"); do
  ws_path=/home/ubuntu/.openclaw/workspace/$ws
  proj_dir=$(find $ws_path/projects -mindepth 1 -maxdepth 1 -type d 2>/dev/null | grep -v node_modules | head -1)
  [ -z "$proj_dir" ] && echo "❌ $ws: no projects/ subdir" && continue
  slug=$(basename $proj_dir)
  for f in PROJECT.md PROGRESS.md TASKS.md HANDOFF.md; do
    [ -f "$proj_dir/$f" ] && echo "✅ $ws/$slug/$f" || echo "❌ MISSING: $ws/$slug/$f"
  done
done
```
Fix: create missing files using `templates/new-agent/projects/` as source.

### Step 7c — New-agent template has File Protocol + all 4 state file templates
```bash
grep -c "## File Protocol" /home/ubuntu/.openclaw/workspace/templates/new-agent/AGENTS.md && \
  echo "✅ Template: File Protocol present" || echo "❌ Template: File Protocol MISSING"
for f in PROJECT.md PROGRESS.md TASKS.md HANDOFF.md; do
  [ -f /home/ubuntu/.openclaw/workspace/templates/new-agent/projects/$f ] && \
    echo "✅ Template: projects/$f" || echo "❌ Template: projects/$f MISSING"
done
```

### Step 7d — Auto-onboard hook is in place and working
```bash
echo "=== Hook files ==="
[ -f /home/ubuntu/.openclaw/hooks/auto-onboard/handler.js ] && echo "✅ handler.js" || echo "❌ handler.js MISSING"
[ -f /home/ubuntu/.openclaw/hooks/auto-onboard/HOOK.md ] && echo "✅ HOOK.md" || echo "❌ HOOK.md MISSING"

echo ""
echo "=== Hook config ==="
python3 -c "
import json
oc = json.load(open('/home/ubuntu/.openclaw/openclaw.json'))
internal = oc.get('hooks',{}).get('internal',{})
g = internal.get('enabled', False)
h = internal.get('entries',{}).get('auto-onboard',{}).get('enabled', False)
print('internal.enabled:', g)
print('auto-onboard.enabled:', h)
print('✅ Hook enabled' if g and h else '❌ Hook DISABLED')
"

echo ""
echo "=== Hook registered in gateway logs ==="
for log in \$(ls /tmp/openclaw-1000/openclaw-*.log 2>/dev/null | sort | tail -2); do
  n=\$(grep -c 'Registered hook: auto-onboard' "\$log" 2>/dev/null || echo 0)
  [ "\$n" -gt 0 ] && echo "✅ \$(basename \$log): registered \$n time(s)" || echo "⚠️  \$(basename \$log): no registration (gateway not restarted today)"
done

echo ""
echo "=== Pending approvals ==="
pending=\$(ls /home/ubuntu/.openclaw/workspace/tmp/pending_pairings/*.json 2>/dev/null | wc -l)
groups=\$(python3 -c "
import json,os; p='/home/ubuntu/.openclaw/workspace/memory/auto_bind_groups_state.json'
d=json.load(open(p)) if os.path.exists(p) else {'groups':{}}
print(len([k for k,v in d.get('groups',{}).items() if v.get('status')=='pending_approval']))
" 2>/dev/null || echo 0)
echo "Users pending: \$pending | Groups pending: \$groups"
```
Fix if disabled: set `hooks.internal.enabled=true` and `hooks.internal.entries.auto-onboard.enabled=true` in openclaw.json, restart gateway.
Fix if missing files: recreate handler from `/home/ubuntu/.openclaw/hooks/auto-onboard/`.

### Step 8 — Update SYSTEM_INSTRUCTIONS if needed
- Check `wc -l /home/ubuntu/.openclaw/workspace/interactions-with-daryl/SYSTEM_INSTRUCTIONS.md`
- Target: < 80 lines in hot path
- Extended/rarely-used rules → `SYSTEM_INSTRUCTIONS_EXTENDED.md`

### Step 9 — Validate cron models
```bash
cat /home/ubuntu/.openclaw/cron/jobs.json | python3 -c "
import json,sys
jobs = json.load(sys.stdin)
for j in jobs.get('jobs', []):
    model = j.get('model') or j.get('options', {}).get('model', 'MISSING')
    print(j.get('id','?'), '->', model)
"
```
All cron jobs should use `minimax/MiniMax-M2.7-highspeed` unless flagged as reasoning-required.

---

## 10. Adding a new project group

1. Create WhatsApp group, get JID from gateway logs or first message
2. Run approval flow: `approve group <JID> as <Name>`
3. Script provisions workspace at `interactions-with-group-<slug>/`
4. Add AGENTS.md using canonical template (§3)
5. Create `projects/<project-slug>/` with: PROJECT.md, PROGRESS.md, TASKS.md, HANDOFF.md
6. Copy templates from `/home/ubuntu/.openclaw/workspace/templates/new-agent/projects/`
7. Restart gateway to activate binding
8. Send first message in group to verify agent responds

---

## 11. Rollback

If something breaks after an optimisation pass:
```bash
# Find latest backup
ls /home/ubuntu/.openclaw/workspace/.archive/ | sort | tail -5

# Restore a specific file
cp /home/ubuntu/.openclaw/workspace/.archive/<migration-timestamp>/<file> <original-path>

# Restart gateway after restore
openclaw gateway restart
```

All backups include a README.md explaining what changed.

---

## 12. Current group agents (as of 2026-04-02)

| Group | Agent ID | Workspace | Project slug |
|-------|----------|-----------|--------------|
| Rescue App | group-rescue-app | interactions-with-group-rescue-app | rescue-app |
| Film Camera App | group-camera-app | interactions-with-group-camera-app | film-camera-app |
| Portfolio App | group-portfolio-app | interactions-with-portfolio-app | portfolio-app |
| Roast Time Buddy | group-roast-time-buddy | interactions-with-roast-time-buddy | roast-time-buddy |

---

## 13. Token optimisation checks (cron-critical)

Sources: Wisely Chen cost guide (97% reduction), Reddit r/openclaw, r/LocalLLM community benchmarks.

### Step 10 — AGENTS.md size enforcement
Hot-path AGENTS.md files must be small. Every byte here is re-sent on every turn.

**Targets:**
- Group agents: < 60 lines / < 3KB
- User agents (denise, mark, etc.): < 60 lines / < 3KB
- Master/daryl agent: < 100 lines / < 5KB

```bash
echo "=== AGENTS.md size audit ==="
for ws in $(ls /home/ubuntu/.openclaw/workspace/ | grep "interactions-with"); do
  f=/home/ubuntu/.openclaw/workspace/$ws/AGENTS.md
  [ ! -f "$f" ] && echo "❌ MISSING: $ws" && continue
  lines=$(wc -l < "$f")
  bytes=$(wc -c < "$f")
  status="✅"
  [ "$lines" -gt 100 ] && status="🔴 BLOATED"
  [ "$lines" -gt 60 ] && [ "$lines" -le 100 ] && status="⚠️  LARGE"
  echo "$status $ws: ${lines} lines / ${bytes} bytes"
done | sort -t: -k2 -rn
```
Fix: move doctrine/extended rules to SYSTEM_INSTRUCTIONS_EXTENDED.md or orchestrator skill. Keep AGENTS.md to role + startup reads + delegation + file protocol only.

### Step 11 — Group agent model routing
Group project agents should be sonnet-class, NOT opus. Opus is only for architecture decisions and high-value synthesis by the master agent.

```bash
echo "=== Group agent model check ==="
python3 -c "
import json
oc = json.load(open('/home/ubuntu/.openclaw/openclaw.json'))
for a in oc.get('agents',{}).get('list',[]):
    aid = a.get('id','')
    if 'group' in aid or 'portfolio' in aid or 'roast' in aid:
        model = a.get('model','DEFAULT')
        if 'opus' in model.lower():
            print(f'🔴 {aid}: {model} → should be sonnet-class')
        else:
            print(f'✅ {aid}: {model}')
"
```
Fix: change opus group agents to `anthropic/claude-sonnet-4-6` in openclaw.json.

### Step 12 — Cron job model routing
All cron jobs must use cheap models. Heartbeats, reminders, maintenance, guards = minimax or haiku.

```bash
echo "=== Cron model check ==="
python3 -c "
import json
jobs = json.load(open('/home/ubuntu/.openclaw/cron/jobs.json'))
for j in jobs.get('jobs',[]):
    if not j.get('enabled'): continue
    name = j.get('name','?')
    model = j.get('model') or j.get('payload',{}).get('model') or 'AGENT_DEFAULT'
    if model == 'AGENT_DEFAULT' or 'opus' in model.lower() or 'sonnet' in model.lower():
        print(f'🔴 {name}: {model} → should be minimax/MiniMax-M2.7-highspeed')
    else:
        print(f'✅ {name}: {model}')
"
```
Fix: set `model: minimax/MiniMax-M2.7-highspeed` on every cron job.

### Step 13 — Heartbeat model check
Heartbeats are the biggest hidden cost sink. Must use cheapest possible model.

```bash
python3 -c "
import json
oc = json.load(open('/home/ubuntu/.openclaw/openclaw.json'))
hb = oc.get('agents',{}).get('defaults',{}).get('heartbeat',{})
model = hb.get('model','NOT SET')
interval = hb.get('every','NOT SET')
print(f'Heartbeat model: {model}')
print(f'Heartbeat interval: {interval}')
if 'opus' in model.lower() or 'sonnet' in model.lower():
    print('🔴 EXPENSIVE — switch to minimax or haiku')
elif 'minimax' in model.lower() or 'haiku' in model.lower():
    print('✅ Cheap model')
else:
    print('⚠️  Unknown model — verify cost')
"
```

### Step 14 — Prompt caching alignment
Prompt caching gives 90% discount on static content. Maximise cache hit rate by keeping AGENTS.md and SYSTEM_INSTRUCTIONS.md stable (don't rewrite on every session).

```bash
echo "=== Compaction & caching config ==="
python3 -c "
import json
oc = json.load(open('/home/ubuntu/.openclaw/openclaw.json'))
d = oc.get('agents',{}).get('defaults',{})
print('contextPruning:', d.get('contextPruning'))
print('compaction:', d.get('compaction'))
print('thinkingDefault:', d.get('thinkingDefault'))
"
```

**Rules for high cache hit rate:**
- Don't inject timestamps, random IDs, or changing data into AGENTS.md/SOUL.md
- Put volatile data (today's tasks, current status) in separate files loaded after the cached prefix
- Keep AGENTS.md + SOUL.md + SYSTEM_INSTRUCTIONS.md content identical across turns
- Current config `contextPruning: cache-ttl 5m` ✅ (preserves cached prefix)
- Current config `compaction: safeguard` ✅ (only compacts when near limit)

### Step 15 — Stale sessions and transcript cleanup
Old sessions accumulate tokens. Clean them up.

```bash
echo "=== Active sessions ==="
openclaw status 2>/dev/null | grep -c "agent:" || echo "check manually"

echo ""
echo "=== Session transcript sizes ==="
total=$(du -sh /home/ubuntu/.openclaw/sessions/ 2>/dev/null | cut -f1)
echo "Total session storage: ${total:-unknown}"

echo ""
echo "=== Memory file sizes ==="
for ws in $(ls /home/ubuntu/.openclaw/workspace/ | grep "interactions-with"); do
  mem_dir=/home/ubuntu/.openclaw/workspace/$ws/memory
  [ -d "$mem_dir" ] || continue
  count=$(ls $mem_dir/*.md 2>/dev/null | wc -l)
  size=$(du -sh $mem_dir 2>/dev/null | cut -f1)
  [ "$count" -gt 30 ] && echo "⚠️  $ws: $count memory files ($size)" || echo "✅ $ws: $count memory files ($size)"
done
```
Fix: archive memory files older than 30 days. Use /reset or /new periodically to clear bloated sessions.

### Step 16 — User workspace AGENTS.md bloat
Non-group user workspaces (denise, mark, isaac, etc.) often have bloated AGENTS.md from old templates. These are re-sent on every turn those users message.

```bash
echo "=== User workspace AGENTS.md bloat ==="
for ws in interactions-with-denise interactions-with-mark interactions-with-isaac interactions-with-tam interactions-with-trina interactions-with-li-ping interactions-with-kelsey; do
  f=/home/ubuntu/.openclaw/workspace/$ws/AGENTS.md
  [ ! -f "$f" ] && continue
  lines=$(wc -l < "$f")
  bytes=$(wc -c < "$f")
  [ "$lines" -gt 60 ] && echo "🔴 $ws: ${lines} lines / ${bytes} bytes → needs trimming" || echo "✅ $ws: ${lines} lines"
done
```
Fix: slim to match group agent template style — role, startup reads, delegation, rules. Move extended rules to SYSTEM_INSTRUCTIONS_EXTENDED.md.

---

## 14. Subagent cost controls

### Spawn budget enforcement
- Max spawn depth: 1 (no sub-subagents)
- Max concurrent per project: 2
- Explicit timeout: always set (default 420s from config)
- Child thinking: off by default (override only for complex architecture)

### Model routing for subagents
- `coding`, `debug`, `test`, `review` → sonnet-class
- `normalizer`, `backup`, `maintenance` → haiku or minimax
- `research`, `writer` → haiku first; sonnet only if synthesis quality matters

### Token-saving subagent practices (from community)
- Extract text/data programmatically before sending to LLM (e.g. `pdftotext`, `jq`, `grep` before analysis)
- Request markdown output when pulling web content (strips CSS/JS bloat)
- Use CLI tools over MCPs where possible (lower overhead)
- Subagents should receive only relevant project file slices, not full workspace

---

## 15. Latency optimisation checks

### WhatsApp response time
- Project agent must ack within 3-5 seconds
- Delegate anything that would take >10 seconds to a subagent
- Never stream internal progress; one ack + one integrated result

### Context window budget
- Target: <8KB total hot-path per turn (AGENTS.md + SOUL.md + state files)
- Current config has no explicit contextTokens per agent → relies on default model window
- Consider setting `contextTokens: 32000` on group agents to force lean prompts

### Debounce
- WhatsApp messages arrive in bursts
- Don't spawn subagents on first fragment of multi-message instruction
- Treat clustered messages as one request

---

## 16. Weekly cron automation

This runbook should run automatically as a weekly cron job. The cron job should:

1. Execute Steps 3, 5, 7a-7d, 10-16
2. Collect all ❌ and 🔴 results
3. If any failures: send a WhatsApp summary to Daryl with specific fix actions
4. If all green: log `OPTIMISATION_OK` to `memory/YYYY-MM-DD.md`, no message needed

### Cron script location
`/home/ubuntu/.openclaw/workspace/scripts/run_optimisation_audit.sh`

### Recommended schedule
Weekly, Monday 04:00 UTC (12:00 SGT), model: minimax/MiniMax-M2.7-highspeed
