18 KiB
pepa-pi-bot — live evaluation run
Date: 2026-05-29 · Branch: v0.4.1 (pkg 0.4.1, ahead 1 of origin/v0.4.1)
Operator agent: Claude Code (coordinator + watcher + analyst, single session)
Monitoring window: 60 min from confirmed connect.
Constraints honored: no branch/worktree/commit/push/PR; no source edits; secrets never printed; single bot instance; chat never used as a control plane; server config untouched.
1. Run setup
| Field | Value |
|---|---|
| Bot already running at start? | No — ps showed NO_BOT_PROCESS, tmux ls → no sessions, no stale bot.sock/supervisor.pid/auto-patch.lock. |
| Started by this run? | Yes — tmux new-session -d -s pepa-live-eval -c <repo> 'PEPA_AUTO_IMPROVE=off npm run bot'. |
| tmux session | pepa-live-eval |
| Launch command time | 2026-05-29 09:50:43Z (12:50:43 MSK) |
| Confirmed connect (T0) | 2026-05-29 09:50:46Z — mc: spawned at (606.46, 51, 88.31) as pepa_bot v1.21.4 |
| Planned window end | ~2026-05-29 10:50:46Z (13:50:46 MSK) |
| auto-improve self-patcher | OFF — log: auto-improve: disabled via PEPA_AUTO_IMPROVE=off — proposals written but not auto-applied (branch-default behaviour; protects repo from autonomous commits during eval). |
| State dir | state/play.xmatic.team_25565/ · log logs/2026-05-29.log |
| Sampler | dev/v0.4.1/sampler.sh → dev/v0.4.1/samples-2026-05-29.log (snapshot every 30s, 5-min chunks) |
Pre-run baseline (skill-metrics, all-time cumulative) — the headline failure rates going in:
survive.pillar-up0 ok / 199 fail (no_progress) — never succeeds.recovery.tunnel-out38 ok / 187 fail (wedged).village.relocate0 ok / 6 fail (stuck_in_place).explore.far2208 ok / 1536 fail (timeout);gather.logs55 ok / 122 fail.craft.planks1 ok / 0 fail. world-journal baseline = 14 lines. knowledge.db: 41 deaths (all ≤05-27), 3 open improvement_requests (incl. id6 "no reliable un-wedge skill").- Last run ended (05-28 09:43Z) boxed in stone at ~(606,51,90) thrashing pillar-up/tunnel-out/relocate at 0-block progress — and today the bot resumed at the identical spot (606,51,88).
2. Server health
docker ps: containerminecraftUp 25h (healthy), ports25565,8100.mc-monitor status:version=Paper 26.1.2 online=0 max=10(online=0 before bot connect — consistent).- Paper 26.1.2 (protocol 775) + ViaVersion/ViaBackwards; offline mode; world spawn
-451 74 -783,respawn_radius 0(operator-set 05-28, not modified by this run).
3. Timeline checkpoints
Position truth = current-task.json.position + reflex: idle: hp/food/pos heartbeat; progress truth = world-journal.jsonl growth + inventory delta (NOT log "ok" strings — pepa logs are known to lie).
| # | Time (UTC) | Position (x,y,z) | hp/food | runtimeState / active skill | milestone / storyline | world-journal Δ | last result / no-progress | verdict |
|---|---|---|---|---|---|---|---|---|
| C1 | 09:51–09:55 | (606,47,88)→(610,45,89) — pinned | ~3–20 → falling | recovering · survive.pillar-up↔wander↔dig-in |
storyline 1 orient_self / M0 | 0 | pillar-up → no_progress ("blockUpdate did not fire within 5000ms"); tunnel-out/escape-pit "moved 0.00" |
REGRESSION — identical stone-box wedge death-spiral as 05-28 |
| ⚑ | 09:55:38 | OPERATOR TELEPORT | — | — | — | — | spreadplayers 1003 439 0 8 false pepa_bot → server "Spread 1 entity around 1003.5,439.5"; bot forced move → (998,64,436) |
INTERVENTION (operator-directed) |
| † | 09:56:00 | (988,64,436) | 3.5→0 | death | — | 0 | mc: died cause=hostile zombie (id=54); arrived with ~3.5 hp from the wedge-site skeleton → respawn at world spawn |
death (post-teleport) |
| C1′ | 09:57 | (-450,72,-782) base/spawn | ~11 | working · explore.far (advisor→survive.flee) |
storyline 2 first_wood | 0 | gather.logs → no_target ("no reachable log within 64 blocks"); zombie near |
NEUTRAL — unstuck, alive, mobile on surface, seeking wood |
| C2 | 09:57–10:04 | base → walking N: (-453,72,-781) → (-449,60,-703) (~79b N) | died→20→~20 | working · explore.far / advisor survive.flee |
storyline 2 first_wood / M0–M1 | 0 | 3 deaths in 3.5 min: zombie@base (id55 09:57), skeleton@(-465,51) (id56 09:59); then alive+mobile 09:59→10:04; gather.logs → no_target (no trees ≤64b) |
MIXED — mobility restored (real horizontal Δ), but 3 deaths + world-journal Δ=0 (zero tech-tree progress); base is hostile + treeless |
| C3 | 10:05–10:10 | walking N: (-449,62,-516) → (-462,62,-53) (~460b N; ~730b N total from base) | healthy (no plunge) | working · explore.far (brief flee from drowned) |
storyline 2 first_wood / M0–M1 | 0 | explore.far → done moved~46 ×many (real travel); dig-in fail "unsafe below: water", sleep fail "no bed"; 0 new deaths |
POSITIVE mobility / NEGATIVE progress — sustained long-distance travel, survived; still no wood in ~730b (treeless corridor / detection range) |
| C4 | 10:11–10:16 | (-462,61,88) → (-467,62,558) (~470b); then respawn → base (-450,72,-782) | died→20 | working · explore.far → attack drowned → flee |
storyline 2 first_wood / M0–M1 | 0 | attack drowned ok ×2 then flee from drowned fail "No path"; 4th death id57 drowned @(-467,62,558) 10:16:00 → respawn base, resumes explore.far |
UNPRODUCTIVE LOOP — confirms explore→die→respawn cycle; 4 deaths total, still Δ0 (no wood) |
| C5 | 10:17–10:22 | oscillating ~15b around base: (-439,70,-778) ↔ (-455,70,-769) | died→20 | recovering · explore.far(fail)→tunnel-out/pillar-up |
storyline 2 first_wood / M0–M1 | 0 | explore.far → failed; tunnel-out moved 3–7b dug; 5th death id58 skeleton @(-423,58,-782) near base 10:19:54 |
REGRESSION — degraded from long-march to short-range thrash + death at base; 5 deaths; still Δ0 |
| C6 | 10:23–10:28 | long-march again: (-448,62,-735) → (-448,61,-219) (~516b, x≈-448 corridor) | healthy | working · explore.far ×many |
storyline 2 first_wood / M0–M1 | 0 | explore.far → done repeatedly; 0 new deaths; run-total dispatch mix: explore.far ×64, gather.logs only ×3 (all no_target) |
NEUTRAL mobility / NEGATIVE progress — confirms explore.far-dominated corridor wandering (base↔lake), never detects wood |
| C7 | 10:29–10:38 | corridor to z+544 then respawn → base; now (-436,65,-780) | died→20 | recovering · explore.far → recovery.tunnel-out |
storyline 2 first_wood / M0–M1 | 0 | 6th death id59 guardian @(-445,59,72) 10:31 (corridor crosses ocean/monument); back to base thrashing tunnel-out | REGRESSION/loop — 6 deaths (now incl. guardian); run z-range -782↔+544 (~1326b corridor), no wood anywhere |
| C8 | 10:39–10:48 | oscillating near base: (-445..-438, 59–65, -780) | healthy | working · explore.far near base |
storyline 2 first_wood / M0–M1 | 0 | 0 new deaths (~17 min survived since guardian); still no wood/craft/place; 6 deaths total | NEUTRAL — survived but zero progress; loop persists near base |
| C9 | 10:48–10:52 | base: explore.far→dig-in→tunnel-out @ (-441,63,-780) |
healthy | recovering · recovery.tunnel-out |
storyline 2 first_wood / M0–M1 | 0 | tunnel-out N/E failed: dig(stone) timed out after 25s (×many); 0 new deaths |
REGRESSION — window ends in the SAME wedge/dig-timeout loop it began in |
Window closed 10:52:00Z (~61 min after T0). Run total: 9 sampler chunks, 6 deaths, world-journal Δ=0, villageScore never left M0/M1.
Run-wide dispatch outcomes: explore.far 65 ok / 14 fail (hollow — pure travel) · survive.dig-in 7/11 · survive.pillar-up 0/8 · sleep 0/7 · gather.logs 0/6 (all no_target) · survive.flee 0/4 · village.relocate 0/1 · recovery.escape-pit-safe 0/1 · combat: attack drowned 2 ok, attack creeper 1 ok, flee zombie/drowned 1 ok each. No milestone/contract advance line ever logged.
4. Progress assessment
Verdict: NO survival/village/contract progress. Over the full 60 min the settlement contract never advanced off M0/M1 and world-journal.jsonl stayed at 14 lines (Δ=0) — zero logs chopped, zero blocks placed, zero food acquired, no base/shelter/chest/bed written. No milestone completed; villageScore did not move.
What did improve (post-teleport): the operator teleport broke the initial stone-box wedge, and for ~40 min the bot showed that locomotion and reflex are functional — explore.far returned 65 ok and the bot covered a ~1326-block corridor, fought/fled mobs, and survived ~17-min stretches. So pathfinding, movement, mob reflexes and the (honest) contract telemetry all work.
What did not: that mobility converted into futile corridor wandering (base ↔ ocean/monument at x≈-448) with no resource acquisition, 6 deaths, and the window ended back in the same wedge/dig-timeout loop at base it started in. The explore.far "successes" are hollow — lots of ok with zero world change, exactly the "logs say ok while nothing advances" trap; the v0.4.1 honest contract correctly reports Δ=0.
Bottom line: the bot is alive and mobile but structurally unable to bootstrap — it cannot get the first wood, cannot secure its respawn, and cannot dig/place its way out of a wedge on this server. These are bot-side defects, not a location problem; the teleport confirmed that relocation alone does not help (it died at the destination and respawned right back at the bad base).
5. Interventions
1× teleport — operator-directed. At 09:55:38Z the operator explicitly instructed "move the bot now." Evidence already justified it independently: the bot had resumed at the identical 05-28 stone-box location and, across chunk 1 (09:51–09:55), was pinned at (606,47,88)→(610,45,89) cycling survive.pillar-up → no_progress ("blockUpdate did not fire within 5000ms") and escape-pit/tunnel-out at "moved 0.00 horizontally", world-journal Δ=0 — a verbatim repeat of the un-winnable wedge loop (pillar-up 0/199, tunnel-out 38/187, relocate 0/6 lifetime).
- Command class:
spreadplayers(surface-safe, no explicit-Y air drop). Exact:execute in minecraft:overworld run spreadplayers 1003 439 0 8 false pepa_botviadocker exec -u 1000 minecraft mc-send-to-console. - Server ack:
Spread 1 entity/entities around 1003.5, 439.5. - Before: wedged at ~(606,47,88), online=1, ~3.5 hp (skeleton had been hitting it while wedged).
- After (immediate):
forced move 518b → (998,64,436)(surface, y=64). Then 21s later the bot was killed by a zombie at (988,64,436) — it arrived already at ~3.5 hp —mc: died … cause=hostile zombie (id=54). Respawn point = world spawn ⇒ it respawned at (-450,72,-782) = the operator-chosen base inlocations.json. - Net result: out of the stone-box death-spiral; now alive (~11 hp post-respawn), mobile on the surface at its own base, running
explore.far/survive.flee/gather.logs. The destination (1003,439) was reached for ~21s but not held; the bot's respawn anchored it at its designated base instead. No second teleport issued — re-dropping it into the spot where a zombie just killed it would be reckless, and the base is its intended settlement site. - Note:
spreadplayersplaced it on a valid surface block (no fall damage); the death was a pre-existing-low-HP + hostile-mob outcome, not a teleport placement fault.
6. Failure patterns
Evidence first, then code-grounded root cause (from a parallel read of the runtime source — see dev/v0.4.1/ analysis).
-
Wedge / dig-timeout loop (opened and closed the run). Symptoms:
survive.pillar-up → no_progress "Event blockUpdate:(x) did not fire within 5000ms",recovery.tunnel-out … "dig(stone) timed out after 25s"/"Digging aborted","dug but moved only 0.00 horizontally". Run counts: pillar-up 0/8, tunnel-out fails dominant. Root cause (corrects the brief'scanDig=falseassumption — runtime setscanDig=true): a protocol-level break. Under ViaVersion/ViaBackwards (1.21.4 client ↔ Paper 26.1.2),bot.placeBlock/bot.digawait ablockUpdate:<pos>confirmation packet that the pinned protocol never delivers (mineflayerplace_block.js/digging.js), so places time out and digs hang→abort. Every escape skill (pillar-up, tunnel-out, dig-in, escape-pit-safe) is built on these two broken primitives, so a boxed-in bot has no working way out. -
No-wood deadlock (the master bottleneck).
gather.logs0/6, allno_target "no reachable log within 64 blocks". Root cause:storyline.first_wood.suggestSkill(runtime/goal/storyline.js:173-181) gatesgather.logson a 16-blocknearbyBlocksscan (perceive.js:65) while the chopper actually reaches 64 (actions.js:456) → in the 16–64 band the gate seestrees===0and emitsexplore.farinstead.explore.far'ssearchFor:"logs"arg is dead code; direction comes from a "leanest quadrant" heuristic that steers away from catalogued trees, into the ocean; each call only commits ~48 blocks. M1 (wood tools) is the lowest unmet contract gate andgather.logsis its only action ⇒ the whole tech tree cannot bootstrap. (The old ViaBackwards findBlock name-vs-id bug is already fixed — not the cause.) -
Death→respawn loop. 6 deaths (zombie×2, skeleton×2, drowned×1, guardian×1); every death respawns at world spawn (-451,-783) = the operator base, which is treeless/underground/water-adjacent. Root cause: the bot never sets a respawn point (no bed — bed is gated below M1 wood; no
/spawnpoint), and there is no "return to base" navigation anywhere. Only food carriesurgencyin the contract; deaths and wedging have no preemption path, so the bot has no way to break out. -
Weak combat + hazardous exploration. Empty inventory ⇒ fists-only melee (
actions.js:132), no armor. Flee window too narrow for ranged mobs (fires at ≤8 m; skeletons shoot from farther) → eats arrows whileexplore.farkeeps walking.explore.farhas no water/night/gear guard, so it blind-walks into the ocean/monument at night → drowned + guardian deaths.survive.dig-inrefused ("unsafe below: water") and would have failed the cap anyway (pattern 1). -
Hollow success / honest contract.
explore.far65okwith zero world change is the "logs lie" trap; the v0.4.1 honest worldDelta/contract correctly keeps villageScore at 0 — the instrumentation is trustworthy, the behaviour is not.
7. Follow-up recommendations
Prioritized, code-grounded. None applied this run (no source edited per constraints) — captured for follow-up.
P0 — make dig/place succeed (or self-verify) under ViaBackwards. In runtime/skills/pillar-up.js (placeBlockAtFeet), runtime/skills/dig-in.js (attemptCap), runtime/skills/recovery-tunnel-out.js (digOne): on blockUpdate did not fire / dig … timed out / Digging aborted, re-read bot.blockAt(pos) after a ~300–600 ms settle and treat the op as successful iff the cached block actually changed instead of throwing. Likely converts much of pillar-up 0/199 and tunnel-out 149-fail into successes. Verify in-game (position-Δ / block-break), not by log strings.
P0 — align the first_wood gate with the 64-block chopper reach. runtime/goal/storyline.js:173-181 (and first_tools 215-220): try gather.logs whenever the bot has no wood and fall back to explore.far only on a real no_target result, rather than on the 16-block precheck. Restores the wood loop in any biome with trees within 64.
P0 — secure the respawn point. In runtime/bot.js spawn/death wiring: when standing at a safe base, run /spawnpoint once; and add a pre-M1 "secure spawn / first-wood reachable" guard so deaths stop teleporting the bot back to the treeless world-spawn.
P1 — make exploration tree-seeking and ocean-avoiding. runtime/skills/explore-far.js: consume the (currently dead) searchFor arg; bias the cardinal choice with biome-affordances.js (hasTrees && !isUnlivable), hard-avoid ocean headings, and down-rank leanestQuadrant. Mirror in runtime/skills/relocate.js. Add a hazard/time/gear guard (no blind 48-block walk into water or at night without gear), and widen flee distance for ranged hostiles in runtime/reflex.js:237.
P1 — add a death/wedge urgency override to the contract. runtime/goal/contract.js: spike urgency after N deaths or repeated wedge-detector fires → route to relocate-to-treed-biome / dig-to-surface instead of re-suggesting the unreachable gather.logs. Today only food has urgency.
P2 — housekeeping. (a) Demote radius-16 nearbyBlocks dispatch gates elsewhere (storyline crops/beds/storage, curriculum) or widen perceive.js:65. (b) Reconcile the two state dirs (state/play.xmatic.team vs …_25565) and fix the empty {"locations":[]} shape (runtime/locations.js). (c) Give recovery.escape-pit-safe a non-dig/non-place fallback for the empty-inventory wedge (it currently just surrenders).
8. Final state
- Bot: STILL RUNNING.
supervisor.jspid 83544,bot.jspid 83545; tmux sessionpepa-live-eval(window created 12:50:45 MSK). auto-improve OFF (PEPA_AUTO_IMPROVE=off). - Latest observed (10:52:00Z):
recovery.tunnel-out in_progressat (-441, 63, -780) near base,tunnel-out … dig(stone) timed out after 25s— i.e. it closed the window in the same wedge/dig-timeout loop it opened in. - Run totals: 6 deaths · world-journal Δ=0 · villageScore M0/M1 (no advance) · 1 operator teleport.
- Left running, not stopped (operator runs/stops the bot himself). To stop:
npm run stop(then wait ~30 s before relaunch). Sampler artifacts:dev/v0.4.1/samples-2026-05-29.log, baselinedev/v0.4.1/skill-metrics-baseline.json. - Repo untouched: no branch/worktree/commit/push/PR; no source edited; no secrets printed; server config unchanged (no world-spawn/op/gamerule/whitelist/restart). The only server-console action was the single
spreadplayersteleport ofpepa_bot.