Nasr workspace path typo fixed (2026-04-22). Snapshot of Nasr (Smithers) workspace: SOUL, USER, IDENTITY, MEMORY, AGENTS, HEARTBEAT. Skills manifest: 18 skills on disk, none yet in git. progress.json: per-agent status tracking (nasr, parlo, peter, m2, alfred, gunnar). docs/concept.md: full architecture — 3 tracks (memory, config, secrets). CLAUDE.md: project overview, data sources, restore order, gotchas. Kickoff Friday 2026-04-25.
4.7 KiB
Restore Harness — Concept & Architecture
Explored 2026-04-22. Kickoff Friday 2026-04-25.
The problem
OpenClaw agent state lives in 3 layers that drift from each other:
Layer 1: Coolify env vars → rebuild source but incomplete, no skill manifest
Layer 2: /agent_home volume → actual live state, ephemeral if volume lost
Layer 3: m2-config git repo → intended source but not always synced
On Nasr's container: 18+ skills installed manually, not in any env var or git. On rebuild: those skills vanish. Projects, SOUL.md etc. survive (volume), memory doesn't.
3 restoration tracks
Track 1: Memory (episodic context)
Data sources (all on spark3:/home/m2spark3/telegram/):
m2.zip— 85MB uncompressed, 38 HTML files — FULL m2 DM history from day 1parlobyg.zip— 41MB — Parlo's full chatmachine.machine.zip— 2.7MB — Machine.Machine group chat (GMI clinic context)m2-devops.zip— 80KB — devops channel
Tool already exists: agent.memory.system/ingest/telegram_export.py (stdlib only)
Outputs JSONL matching the memory API schema.
Pipeline per agent:
# On spark3
cd /home/m2spark3/telegram
python3 -m ingest.telegram_export m2.zip m2-all.jsonl --agent-id m2 --chat-slug m2-dm
# Filter for agent-specific context, then POST to memory API:
curl -s http://172.18.0.20:8000/store -X POST \
-H "Content-Type: application/json" \
-d @m2-filtered.jsonl
spark4 also has 22,744 restored points (read-only, Redis degraded) — can be queried and selectively copied to m2 memory API per agent_id.
Track 2: Workspace files (config-as-code)
Already have snapshot for Nasr in agents/nasr/ (done 2026-04-22).
snapshot.sh (to build):
# Run from m2 against any named agent
AGENT=nasr
CONTAINER=$(docker ps --filter name=$AGENT --format '{{.Names}}' | head -1)
for f in SOUL.md USER.md IDENTITY.md MEMORY.md AGENTS.md; do
docker cp $CONTAINER:/home/developer/.openclaw/workspace/$f agents/$AGENT/$f
done
# Export sanitized openclaw.json (strip secrets)
docker exec $CONTAINER cat ~/.openclaw/openclaw.json | \
python3 scripts/sanitize-config.py > agents/$AGENT/openclaw.json
# Skills manifest
docker exec $CONTAINER ls ~/.openclaw/skills/ > agents/$AGENT/skills.txt
restore.sh (to build):
AGENT=nasr
CONTAINER=$(docker ps --filter name=$AGENT --format '{{.Names}}' | head -1)
for f in SOUL.md USER.md IDENTITY.md MEMORY.md AGENTS.md; do
docker cp agents/$AGENT/$f $CONTAINER:/home/developer/.openclaw/workspace/$f
done
# Inject secrets from Vaultwarden, then restart gateway
docker exec $CONTAINER supervisorctl restart openclaw-gateway
Track 3: Secrets (Vaultwarden)
Vaultwarden is already deployed. Pattern:
- Collection: "fleet-agents"
- Item per agent:
agent/nasrwith fields:- TELEGRAM_BOT_TOKEN
- ANTHROPIC_API_KEY
- OPENROUTER_API_KEY
- CEREBRAS_API_KEY
- (nasr-specific) MINIMAX_API_KEY, ZAI_API_KEY
In sanitized openclaw.json, reference: "token": "vault:agent/nasr/TELEGRAM_BOT_TOKEN"
Restore script fetches via: bw get password "agent/nasr/TELEGRAM_BOT_TOKEN"
Skills git strategy
Skills without repos (all of Nasr's custom ones):
- clinical-pathway, patient-pathway, quantum-trading, trading-app-dev
- 2dexy-sync, ml-training, xcode-remote, build-verify, cursor-agent
Create under: git.machinemachine.ai/nasr/{skill-name}
Each skill dir: SKILL.md + executable script(s)
Skills with likely existing repos (fleet-wide, in machine-machine org):
- m2-memory, rlm-memory, unified-search, agency-agents, harness-engine
- intent-elicit, intent-router, spec-discovery, mm-pdf
GMI agent (Nasr's proposal)
machine.machine.zip has the Machine.Machine group chat — this is where GMI clinic
discussions happened. Nasr has a GMI-Cancer-Pathways/ project on disk with:
- Breast-Cancer-Pathway.md + Visual.html
- Colorectal-Cancer-Pathway.md + Visual.html
- NSCLC-Pathway.md
A dedicated GMI sub-agent inside Smithers (or a separate OpenClaw agent) could:
- Hold GMI-specific context in its memory collection
- Handle clinical pathway queries
- Interface with any GMI-specific tools
First step: ingest machine.machine.zip filtered for GMI context into agent_memory_nasr.
Restore order
- nasr — container live, workspace files snapshotted ✅, memory pending
- parlo — parlobyg.zip ready, container live
- peter — in m2.zip, custom image container live
- m2 — m2.zip is the primary source, full history
Open questions for Friday kickoff
- Nasr-specific Telegram export? (separate @nasr_s_bot history zip)
- Vaultwarden admin access from m2 (bw CLI setup)
- Forgejo token for creating skill repos (m2 user, id=1)
- spark4 Redis fix — make it writable again or retire as archive-only
- Which skills were created vs cloned — affects whether we need to export code to git