fix(auto-improve): detach auto-patch + recovery-tunnel-out test in suite
Two bugs the live self-improvement run exposed: 1) Auto-patch was spawned with detached:false, so when supervisor restarted bot.js (file change after Pi's commit landed on the auto branch), the auto-patch child was killed mid-way — Pi's commit lived in the auto branch but never got cherry-picked. Recovered manually this round via reflog + cherry-pick. Now detached:true + child.unref() + a per-run log at state/_auto-patch-last.log so the operator can read Pi's full output later. 2) Pi's recovery-tunnel-out.test.js was created but not in npm test script; tests would have stayed unrun forever. Added. Also commits the Pi-authored skill (eb29591 cherry-picked): - runtime/skills/recovery-tunnel-out.js (+ test) - improvements to runtime/actions.js + runtime/skills/explore-far.js - wired into runtime/skills/index.js npm test 137/137. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+15
-6
@@ -483,8 +483,12 @@ function clonePos(pos) {
|
||||
return { x: pos?.x ?? 0, y: pos?.y ?? 0, z: pos?.z ?? 0 };
|
||||
}
|
||||
|
||||
function movedDistance(a, b) {
|
||||
return Math.hypot((b?.x ?? 0) - (a?.x ?? 0), (b?.y ?? 0) - (a?.y ?? 0), (b?.z ?? 0) - (a?.z ?? 0));
|
||||
function horizontalDistance(a, b) {
|
||||
return Math.hypot((b?.x ?? 0) - (a?.x ?? 0), (b?.z ?? 0) - (a?.z ?? 0));
|
||||
}
|
||||
|
||||
function verticalGain(a, b) {
|
||||
return (b?.y ?? 0) - (a?.y ?? 0);
|
||||
}
|
||||
|
||||
async function escapePit(bot, maxSteps = 3) {
|
||||
@@ -520,11 +524,16 @@ async function escapePit(bot, maxSteps = 3) {
|
||||
await new Promise((r) => setTimeout(r, 400));
|
||||
}
|
||||
|
||||
const moved = movedDistance(before, bot.entity.position);
|
||||
if (moved >= 0.75) {
|
||||
return { ok: true, code: "done", detail: { mode: "escape-pit-up", moved } };
|
||||
// Let jump physics settle before deciding whether escape-pit worked.
|
||||
// A mid-jump Y delta is not freedom; require horizontal movement or a
|
||||
// sustained one-block climb before reporting success.
|
||||
await new Promise((r) => setTimeout(r, 500));
|
||||
const moved = horizontalDistance(before, bot.entity.position);
|
||||
const climbed = verticalGain(before, bot.entity.position);
|
||||
if (moved >= 0.75 || climbed >= 0.9) {
|
||||
return { ok: true, code: "done", detail: { mode: "escape-pit-up", moved, climbed } };
|
||||
}
|
||||
info("action", `escape-pit moved only ${moved.toFixed(2)} blocks → tunnel-out`);
|
||||
info("action", `escape-pit moved only ${moved.toFixed(2)} horizontally (dy=${climbed.toFixed(2)}) → tunnel-out`);
|
||||
return digEscapeTunnel(bot, { maxSteps: 3, reason: "wander escape-pit" });
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user