Files
pepa-pi-bot/dev/v0.4.1/live-eval-2026-05-29-1250.md
T
2026-06-22 21:42:48 +03:00

128 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-up` 0 ok / **199 fail** (`no_progress`) — never succeeds.
- `recovery.tunnel-out` 38 ok / **187 fail** (`wedged`).
- `village.relocate` 0 ok / **6 fail** (`stuck_in_place`).
- `explore.far` 2208 ok / 1536 fail (`timeout`); `gather.logs` 55 ok / 122 fail.
- `craft.planks` 1 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`: container **`minecraft`** Up 25h (**healthy**), ports `25565`, `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:5109:55 | (606,47,88)→(610,45,89) — pinned | ~320 → 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:5710: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 / M0M1 | 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:0510: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 / M0M1 | 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:1110: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 / M0M1 | 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:1710: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 / M0M1 | 0 | `explore.far → failed`; tunnel-out `moved 37b 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:2310:28 | long-march again: (-448,62,-735) → (-448,61,-219) (~516b, x≈-448 corridor) | healthy | working · `explore.far` ×many | storyline 2 first_wood / M0M1 | 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:2910:38 | corridor to z+544 then respawn → base; now (-436,65,-780) | died→20 | recovering · `explore.far``recovery.tunnel-out` | storyline 2 first_wood / M0M1 | 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:3910:48 | oscillating near base: (-445..-438, 5965, -780) | healthy | working · `explore.far` near base | storyline 2 first_wood / M0M1 | 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:4810:52 | base: `explore.far``dig-in``tunnel-out` @ (-441,63,-780) | healthy | recovering · `recovery.tunnel-out` | storyline 2 first_wood / M0M1 | 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:5109: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_bot` via `docker 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 in `locations.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:** `spreadplayers` placed 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).
1. **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's `canDig=false` assumption — runtime sets `canDig=true`): a protocol-level break.** Under ViaVersion/ViaBackwards (1.21.4 client ↔ Paper 26.1.2), `bot.placeBlock`/`bot.dig` await a `blockUpdate:<pos>` confirmation packet that the pinned protocol never delivers (mineflayer `place_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.
2. **No-wood deadlock (the master bottleneck).** `gather.logs` 0/6, all `no_target "no reachable log within 64 blocks"`. **Root cause:** `storyline.first_wood.suggestSkill` (`runtime/goal/storyline.js:173-181`) gates `gather.logs` on a **16-block** `nearbyBlocks` scan (`perceive.js:65`) while the chopper actually reaches **64** (`actions.js:456`) → in the 1664 band the gate sees `trees===0` and emits `explore.far` instead. `explore.far`'s `searchFor:"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 and `gather.logs` is its only action ⇒ **the whole tech tree cannot bootstrap.** (The old ViaBackwards findBlock name-vs-id bug is already fixed — not the cause.)
3. **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 carries `urgency` in the contract; deaths and wedging have **no preemption path**, so the bot has no way to break out.
4. **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 while `explore.far` keeps walking. `explore.far` has **no water/night/gear guard**, so it blind-walks into the ocean/monument at night → drowned + guardian deaths. `survive.dig-in` refused ("unsafe below: water") and would have failed the cap anyway (pattern 1).
5. **Hollow success / honest contract.** `explore.far` 65 `ok` with **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 ~300600 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.js` pid **83544**, `bot.js` pid **83545**; tmux session **`pepa-live-eval`** (window created 12:50:45 MSK). auto-improve **OFF** (`PEPA_AUTO_IMPROVE=off`).
- **Latest observed (10:52:00Z):** `recovery.tunnel-out in_progress` at **(-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`, baseline `dev/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 `spreadplayers` teleport of `pepa_bot`.