chore(dev): add v0.4.1 sampling artifacts (live-eval + samples log)

Pre-cleanup snapshot before local removal.
This commit is contained in:
2026-06-22 21:42:48 +03:00
parent cd63edfeaf
commit 98e60eab5b
3 changed files with 452 additions and 0 deletions
+127
View File
@@ -0,0 +1,127 @@
# 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`.
+59
View File
@@ -0,0 +1,59 @@
#!/usr/bin/env bash
# Live-eval sampler for pepa-pi-bot. Runs ONE chunk then exits (so the agent is
# re-invoked between chunks to checkpoint + decide intervention).
# Args: $1=chunk-number $2=duration-seconds(default 300) $3=sample-interval-seconds(default 30)
# READ-ONLY: only reads bot state/logs; never writes into the bot's state dir.
set -u
D=/Users/timmy/Projects/pepa-pi-bot/state/play.xmatic.team_25565
OUT=/Users/timmy/Projects/pepa-pi-bot/dev/v0.4.1/samples-2026-05-29.log
CHUNK="${1:-0}"
DUR="${2:-300}"
INT="${3:-30}"
LOG="$D/logs/$(date -u +%F).log"
WJ="$D/world-journal.jsonl"
wjcount() { wc -l < "$WJ" 2>/dev/null | tr -d ' '; }
WJ_BASE="$(wjcount)"; WJ_BASE="${WJ_BASE:-0}"
task_line() {
node -e '
const fs=require("fs");
try{
const t=JSON.parse(fs.readFileSync(process.argv[1],"utf8"));
const p=t.position? [t.position.x,t.position.y,t.position.z].map(n=>Math.round(n)).join(","):"?";
process.stdout.write(`label=${t.label||"?"} status=${t.status||"?"} pos=(${p}) ts=${t.ts||"?"}`);
}catch(e){ process.stdout.write("label=? (no current-task)"); }
' "$D/current-task.json" 2>/dev/null
}
end=$(( $(date +%s) + DUR ))
{
echo ""
echo "########## CHUNK ${CHUNK} START $(date -u +%FT%TZ) (dur=${DUR}s int=${INT}s wj_base=${WJ_BASE}) ##########"
} >> "$OUT"
while :; do
now=$(date +%s); [ "$now" -ge "$end" ] && break
TS=$(date -u +%FT%TZ)
CT="$(task_line)"
HB=$(grep -aE 'reflex: idle: hp=' "$LOG" 2>/dev/null | tail -1 | sed -E 's/.*reflex: idle: //')
DISP=$(grep -aE 'dispatch: (\xe2\x86\x92|\xe2\x86\x90|->|<-)|skill: .* (\xe2\x86\x92|->) ' "$LOG" 2>/dev/null | tail -1 | sed -E 's/^([0-9T:.-]+Z) \[[a-z]+\] //')
STK=$(grep -aE 'pathfinder: stuck|wedged:|Digging aborted|stuck_in_place|no_progress|Took to long|silent_dig' "$LOG" 2>/dev/null | tail -1 | sed -E 's/^([0-9T:.-]+Z) \[[a-z]+\] //')
CONN=$(grep -aE 'mc: kicked|mc: connection ended|mc: spawned at|runtime: pepa runtime starting|child exited|died|respawn|disabled via PEPA_AUTO_IMPROVE|auto-improve: watching' "$LOG" 2>/dev/null | tail -1 | sed -E 's/^([0-9T:.-]+Z) \[[a-z]+\] //')
WJN="$(wjcount)"; WJN="${WJN:-0}"
WJL=$(tail -1 "$WJ" 2>/dev/null)
{
echo "--- ${TS} (chunk ${CHUNK}) ---"
echo " task : ${CT}"
echo " hb : ${HB:-<none>}"
echo " disp : ${DISP:-<none>}"
echo " stuck: ${STK:-<none>}"
echo " wj : lines=${WJN} delta=$(( WJN - WJ_BASE )) last=${WJL:-<none>}"
echo " conn : ${CONN:-<none>}"
} >> "$OUT"
now=$(date +%s); rem=$(( end - now ))
[ "$rem" -le 0 ] && break
if [ "$rem" -lt "$INT" ]; then sleep "$rem"; else sleep "$INT"; fi
done
echo "########## CHUNK ${CHUNK} DONE $(date -u +%FT%TZ) (wj_now=$(wjcount)) ##########" >> "$OUT"
+266
View File
@@ -0,0 +1,266 @@
{
"gather.logs": {
"ok": 55,
"fail": 122,
"lastTs": 1779952694275,
"lastCode": "timeout",
"lastDurationMs": 62051,
"totalDurationMs": 7620662
},
"wander": {
"ok": 120,
"fail": 400,
"lastTs": 1779960695691,
"lastCode": "done",
"lastDurationMs": 174520,
"totalDurationMs": 6269071
},
"explore.far": {
"ok": 2208,
"fail": 1536,
"lastTs": 1779961085424,
"lastCode": "timeout",
"lastDurationMs": 90021,
"totalDurationMs": 46115701
},
"recovery.tunnel-out": {
"ok": 38,
"fail": 187,
"lastTs": 1779961436417,
"lastCode": "wedged",
"lastDurationMs": 2588,
"totalDurationMs": 4106772
},
"attack zombie": {
"ok": 34,
"fail": 66,
"lastTs": 1779952608404,
"lastCode": "hostile_still_near",
"lastDurationMs": 3291,
"totalDurationMs": 190060
},
"flee from zombie": {
"ok": 4,
"fail": 94,
"lastTs": 1779951420083,
"lastCode": "timeout",
"lastDurationMs": 37053,
"totalDurationMs": 2830611
},
"attack drowned": {
"ok": 10,
"fail": 15,
"lastTs": 1779881719294,
"lastCode": "hostile_still_near",
"lastDurationMs": 3344,
"totalDurationMs": 40858
},
"flee from drowned": {
"ok": 0,
"fail": 64,
"lastTs": 1779888953259,
"lastCode": "timeout",
"lastDurationMs": 30089,
"totalDurationMs": 1914257
},
"survive.flee": {
"ok": 4,
"fail": 71,
"lastTs": 1779960760403,
"lastCode": "stuck",
"lastDurationMs": 11079,
"totalDurationMs": 1742016
},
"flee from skeleton": {
"ok": 2,
"fail": 65,
"lastTs": 1779948570425,
"lastCode": "timeout",
"lastDurationMs": 37011,
"totalDurationMs": 2033525
},
"flee from spider": {
"ok": 4,
"fail": 25,
"lastTs": 1779951627557,
"lastCode": "done",
"lastDurationMs": 7225,
"totalDurationMs": 815204
},
"attack skeleton": {
"ok": 11,
"fail": 9,
"lastTs": 1779948471101,
"lastCode": "no_target",
"lastDurationMs": 704,
"totalDurationMs": 45795
},
"flee from creeper": {
"ok": 3,
"fail": 44,
"lastTs": 1779948015270,
"lastCode": "timeout",
"lastDurationMs": 37025,
"totalDurationMs": 1368266
},
"attack creeper": {
"ok": 17,
"fail": 21,
"lastTs": 1779949854216,
"lastCode": "done",
"lastDurationMs": 2029,
"totalDurationMs": 41966
},
"flee from enderman": {
"ok": 1,
"fail": 21,
"lastTs": 1779952594115,
"lastCode": "timeout",
"lastDurationMs": 37020,
"totalDurationMs": 649095
},
"attack spider": {
"ok": 7,
"fail": 269,
"lastTs": 1779951473733,
"lastCode": "hostile_still_near",
"lastDurationMs": 3528,
"totalDurationMs": 54422
},
"attack enderman": {
"ok": 0,
"fail": 2,
"lastTs": 1779883311290,
"lastCode": "hostile_still_near",
"lastDurationMs": 3371,
"totalDurationMs": 4120
},
"flee from witch": {
"ok": 0,
"fail": 2,
"lastTs": 1779878325865,
"lastCode": "timeout",
"lastDurationMs": 30008,
"totalDurationMs": 60053
},
"survive.pillar-up": {
"ok": 0,
"fail": 199,
"lastTs": 1779961367632,
"lastCode": "no_progress",
"lastDurationMs": 12158,
"totalDurationMs": 5515785
},
"survive.acquire-food": {
"ok": 0,
"fail": 123,
"lastTs": 1779948857447,
"lastCode": "already_have",
"lastDurationMs": 1,
"totalDurationMs": 68883
},
"survive.sleep": {
"ok": 0,
"fail": 4,
"lastTs": 1779948392381,
"lastCode": "daytime",
"lastDurationMs": 0,
"totalDurationMs": 1
},
"explore.wander": {
"ok": 90,
"fail": 77,
"lastTs": 1779952509376,
"lastCode": "failed",
"lastDurationMs": 18316,
"totalDurationMs": 2556361
},
"diag.scan": {
"ok": 2,
"fail": 0,
"lastTs": 1779952108067,
"lastCode": "scan_done",
"lastDurationMs": 1175,
"totalDurationMs": 2764
},
"village.relocate": {
"ok": 0,
"fail": 6,
"lastTs": 1779961426942,
"lastCode": "stuck_in_place",
"lastDurationMs": 56464,
"totalDurationMs": 586374
},
"survive.scout-food": {
"ok": 1,
"fail": 44,
"lastTs": 1779949085516,
"lastCode": "already_have",
"lastDurationMs": 1,
"totalDurationMs": 326284
},
"survive.eat": {
"ok": 3,
"fail": 0,
"lastTs": 1779946551109,
"lastCode": "done",
"lastDurationMs": 1630,
"totalDurationMs": 4901
},
"eat": {
"ok": 3,
"fail": 0,
"lastTs": 1779946560105,
"lastCode": "done",
"lastDurationMs": 1637,
"totalDurationMs": 4896
},
"gather.wool": {
"ok": 0,
"fail": 15,
"lastTs": 1779951016664,
"lastCode": "no_path",
"lastDurationMs": 30030,
"totalDurationMs": 439630
},
"craft.planks": {
"ok": 1,
"fail": 0,
"lastTs": 1779950947695,
"lastCode": "done",
"lastDurationMs": 85,
"totalDurationMs": 85
},
"diag.physics": {
"ok": 3,
"fail": 0,
"lastTs": 1779952458860,
"lastCode": "done",
"lastDurationMs": 6835,
"totalDurationMs": 20477
},
"survive.dig-in": {
"ok": 4,
"fail": 6,
"lastTs": 1779961089100,
"lastCode": "no_progress",
"lastDurationMs": 672,
"totalDurationMs": 165764
},
"sleep": {
"ok": 0,
"fail": 2,
"lastTs": 1779961091425,
"lastCode": "other",
"lastDurationMs": 1,
"totalDurationMs": 3
},
"recovery.escape-pit-safe": {
"ok": 0,
"fail": 1,
"lastTs": 1779960794335,
"lastCode": "no_strategy",
"lastDurationMs": 1,
"totalDurationMs": 1
}
}