agent-restore-harness/docs/concept.md
Mariusz Kreft 5077a7c057 init: agent restore harness — nasr snapshot + planning docs
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.
2026-04-22 23:42:33 +02:00

131 lines
4.7 KiB
Markdown

# 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 1
- `parlobyg.zip` — 41MB — Parlo's full chat
- `machine.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:
```bash
# 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):
```bash
# 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):
```bash
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/nasr` with 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:
1. Hold GMI-specific context in its memory collection
2. Handle clinical pathway queries
3. Interface with any GMI-specific tools
First step: ingest machine.machine.zip filtered for GMI context into `agent_memory_nasr`.
## Restore order
1. nasr — container live, workspace files snapshotted ✅, memory pending
2. parlo — parlobyg.zip ready, container live
3. peter — in m2.zip, custom image container live
4. m2 — m2.zip is the primary source, full history
## Open questions for Friday kickoff
1. Nasr-specific Telegram export? (separate @nasr_s_bot history zip)
2. Vaultwarden admin access from m2 (bw CLI setup)
3. Forgejo token for creating skill repos (m2 user, id=1)
4. spark4 Redis fix — make it writable again or retire as archive-only
5. Which skills were created vs cloned — affects whether we need to export code to git