Recover Mineflayer socket errors and pending requests, activate connection guards, bound startup, and recover stalled Naldo runs. Start a new normal world and fresh Naldo checkpoint while retaining old worlds, checkpoints and Xbox authentication. Verified 15 Node connection tests and 57 targeted Python tests; old flat-generator expectation mismatch remains unchanged.
Keep Minecraft and bots separate from model weights in Mine. Add pinned AltoClef 0.19/Fabric 1.19.4 CPU client through the existing ViaProxy, local telemetry bridge and OpenCode 1.18.34 using the user-owned Mine endpoint. Preserve Creative world, Xbox auth and existing checkpoints. Verify completion only after entering End and observing credits. Reviewed and compiled locally; 43 tests passed, 1 skipped. Full client startup remains to be verified in the Space.
Fix Gemini spam kicks and stalled Minecraft reconnects
Pace chat and command packets per connection, restore Creative inventory without clear/kill or losing existing NBT, return 503 immediately on disconnect, and bind callbacks to their own bot. Startup is bounded and readiness checks the real connection. Preserve the world/checkpoints and both remote Mine model profiles. Validation: 65 pytest checks passed, one skipped; eight Node behavioral checks passed through the real patched upstream routes; measured divergence matches 18 modified and 5 added files.
Prioritize the Ender Dragon objective over open-ended exploration
Replace the original diversity objective and novelty criterion only when a permanent player goal is configured. Allow goal-related portal work, preserve saved skills and the current world, and expose the goal in bot status. 21 runtime/prompt contract tests passed.
Repair Voyager deadlines and connect both bots to Mine
Keep server-only mode and saved worlds. Restore the missing engine deadline helper, clean isolated runner process groups, and route both bots to the separate Mine endpoint. Preserve checkpoints and existing Creative mode.
fix: bound the resync embedding too, the last unbounded call before learn() (voyager_stack.py)
I introduced a bug in the previous commit and this fixes it.
The retry loop added to voyager_runner.py called time.sleep() without importing time. The except block therefore raised NameError on its first use, so a retryable provider error became a hard crash: the runner exited with rc=1, the watchdog restarted it, and the bot left and rejoined the game again. Gemini_Bot's restart count climbed 1 -> 4 -> 8 -> 9. The fix I wrote to stop the leave/rejoin loop made it worse, and the only reason it was visible at all is the restart counter.
import re and import time added.
Why the tests missed it: they asserted that certain strings appeared in the file. A file can contain a retry loop and still raise NameError the first time it runs. tests/test_python_names_resolve.py now runs pyflakes over the maintained modules and fails on 'undefined name', which is that exact class. Verified by removing import time again: two tests fail.
Second change, so the next failure is not invisible:
The on…
Stop the leave/rejoin loop, and give Voyager the strongest CPU-viable brain
1. Why Gemini_Bot left and rejoined the server
Measured from the run logs: three leave/rejoin cycles in 3.5 minutes, at 07:06:23, 07:07:55 and 07:09:46. Each one is
openai.error.ServiceUnavailableError: The server is overloaded or not ready yet.
raised out of curriculum.run_qa -> qa_llm -> the Gemini proxy returning 503. Upstream lets it propagate, so main() unwinds, the finally block kills the Mineflayer child, and the watchdog restarts the runner -- the bot leaves the game and comes back. restart_count was 4.
voyager_runner now retries the learning loop in place with bounded backoff (VOYAGER_LEARN_BACKOFF_SECONDS, doubling to VOYAGER_LEARN_BACKOFF_CAP_SECONDS) instead of exiting, so a provider blip no longer costs the Minecraft connection. learn(reset_env=False) is safe to re-enter: upstream sets self.resume = True after the first call, so a retry takes the soft-reset branch and keeps the inventory.
2. The brain
granite-4.0-h-tiny (7B total / 1B active) could not ge…
Declare and enforce the full divergence from the pinned upstream
checkout_verified attested five decision methods. Those are not the whole difference between this tree and MineDojo/Voyager@55e45a88: the boot patcher rewrites sixteen upstream files and adds four, and nothing said so. A reader of the status could take checkout_verified to mean the tree is pristine.
voyager_runtime_contract.py
ADAPTED_UPSTREAM_FILES and ADDED_UPSTREAM_FILES declare every upstream path the boot rewrites, each with a reason. The sets were measured by running the real patcher against a clean checkout and hashing the tree before and after. write_upstream_manifest() hashes the pristine tree at checkout time; verify_divergence() re-measures and refuses to attest a tree that differs from the declaration in either direction -- an undeclared edit, an undeclared addition, a deletion, or a declared patch that silently stopped applying. node_modules, __pycache__, egg-info, .git and npm lock files are excluded.
voyager_stack.py
Writes the manifest right after the checkout, an…
Tell the Action agent to declare each name exactly once
naldo
06b8929
With Babel pinned, parse failures are now the model's own JavaScript. The
recurring error is a duplicate const, e.g. declaring ironIngots twice in one
program, which makes the whole program fail to parse and the task is wasted.
This is a fact about writing valid JavaScript, not a change to the decision
method, so it belongs in the prompt's ground-truth block.
Pin the Babel the javascript bridge actually resolves, not the one on NODE_PATH
naldo
1e9e0dd
The 100% parse failure was not a NODE_PATH problem. The javascript library
resolves require('@babel/core') through JSPyBridge, which lazily runs
'npm install @babel/core@npm:latest' into javascript/js/node_modules. 'latest'
is Babel 8, where parse() is callback-only, so every action failed. A pin under
ROOT/babel is never consulted: Node loads the copy that sits next to bridge.js.
Record the 7.26.9 pins in javascript/js/package.json and install them into that
exact tree, so JSPyBridge resolves the last Babel 7 line before it ever reaches
for latest. Verified through the real bridge: babel.parse returns an AST
synchronously.
Pin Babel to 7.x so upstream's synchronous parse keeps working
naldo
4c506b1
npm install of @babel/core/@babel/generator was unpinned, so it now resolves to
Babel 8. Upstream's process_ai_message calls babel.parse(code) synchronously and
Babel 8 made parse callback-only, so every action failed with 'the parse function
expects a callback'. This is why the parse rate jumped to 100% after a rebuild.
Pin both to 7.26.9, the last Babel 7 line, and verify at boot that the version is
7.x and that parse() actually returns an AST synchronously in the same Node
runtime that will execute the agent's code, instead of trusting the version
string.
Show the Action agent its full previous program and restore upstream defaults
naldo
008c4fa
The previous-code bound truncated the model's last program to 3200 characters. A
~1000-token program is ~4000 characters, so the model read its own function cut
off mid-body and redeclared it on the next round. That is exactly the
'Identifier has already been declared' SyntaxError upstream's Babel rejects, and
it was happening on a third of all attempts. Upstream sends the whole program;
restore that.
Also restore the three constructor values that had been narrowed without cause:
action_agent_task_max_retries 3 -> 4, action_agent_show_chat_log False -> True,
skill_manager_retrieval_top_k 1 -> 5. With one retrieved skill the Action agent
could not reuse what it had learned, which pushed it to redeclare skills inline.
max_iterations, learn(reset_env=False), the Creative evidence layer, the
exploreUntil bounds, the creative toolkit and the neutralised /pause are left
exactly as they were: they define how this Space operates, not how it matches
upstream, and changing them would disturb b…
Report the exception type, not the Node stack, for Action parse failures
naldo
e78e10c
The tail of the message is always a javascript-bridge stack trace, which hides
the actual exception. Split on the upstream prefix and keep the head.
Install Voyager the way its README documents
naldo
652cf29
The Space cloned the pinned upstream and then only pointed PYTHONPATH at it:
the documented 'pip install -e .' had never been run, so the package was never
installed as a distribution.
Run the documented editable install and verify it took effect before learning,
enforce the README's Python >= 3.9 and Node.js >= 16.13.0 floors at boot, and add
the upstream requirements the Space was missing (tqdm, requests). cchardet stays
out on purpose: it is chromadb's optional accelerator and building it would fail
the Space build.
Document the full conformance table and every remaining deviation with its
reason, and cover the install with tests so it cannot drift silently again.
Write the patched action.py, and fail the boot if a patch does not apply
naldo
4553f46
The seven action.py patches were computed in memory and never written, so every
Space ran a pristine upstream action.py. The Action agent therefore sent no
max_tokens, app.py answered with its 384-token default, the program was cut off
mid-function, upstream's Babel collector reported 'No functions found', and every
action failed to parse while the counters looked like ordinary task failures.
Write the file, request the full 2048-token server cap so the program arrives
whole, and verify each marker is in the file that will actually be imported. A
missed str.replace now stops the boot instead of silently reverting to a runtime
nobody reviewed.
Expose the Action agent parse failure and its completion size
naldo
25ef655
A JavaScript parse failure in the Action agent is the one failure that makes
the whole loop useless while looking healthy, and the log was not reachable
from the status API. Report the last parse error and the recent completion token
counts: a completion pinned at the token cap means the program was truncated
mid-function instead of being written incorrectly.
Replace the map with a resource-rich farming world and unblock mining
naldo
0db945a
Generator settings are only read when a world is created, so the map moves to
a new directory: a superflat column that keeps the walkable surface at Y=64 and
replaces the uniform stone pad with a duplicated ore table, shallow enough to
mine from the surface and repeated in the deepslate band at the bottom.
Human player saves are carried into the new world so the Bedrock session and
the admin operator survive the swap; the Xbox token in relay/ is never touched.
The bot's own save is left behind on purpose, because a full bot inventory is
what pins the official CurriculumAgent to its hardcoded full-inventory branch.
mineBlock only accepted blocks at or above the bot's feet, which on a flat
world is air, so no mining task could ever be satisfied. It now works the two
layers under the feet, and the pathfinder keeps upstream's digging ability so a
bot that opens a shaft can path out of it again.
Restore official Voyager decision agents and attest the runtime
naldo
5ddf32a
Remove the local curriculum/action/critic/skill overrides, the
deterministic action parser, the affordance catalog, and the build
blueprints, so Curriculum, Action, Critic and SkillManager are the
upstream implementations at the pinned commit.
The single declared adaptation is the curriculum parse-failure retry
feedback, applied through voyager_runtime_contract and recorded in
.upstream-expected/ for the AST attestation. Skill templates are
quarantined before the learning loop, and template skills can no longer
drive a build catalog.
Implement dynamic affordances, JSON curriculum agent, circuit breaker for Gemini keys, parametrized builds, and validation tweaks