Fix Muse FreeTierError with the official plan agent and user-level telemetry instructions. Keep AltoClef gameplay, natural world, player inventory and Xbox login intact. Verified: 64 targeted tests, Python compilation, clean whitespace check; isolated keyless Muse plan probe returned valid JSON.
Initialize Naldo controller before joining Minecraft
Replace default Voyager controller with upstream AltoClef 0.19 gamer, retain current world and inventory, correct client startup and telemetry, Survival/Normal, and Muse-only OpenCode coaching. Verified Java17 bridge build and 57 targeted tests.
Recognize wood log species in verified Naldo mining tasks
The initial Mine 1 wood log task rejected proven oak_log mining because wood_log was compared as a literal block ID. Resolve generic wood names to 1.19 log species and give the Creative critic the actual mining rules. Physical block evidence remains required; chat and inventory alone cannot prove mining. Three regression cases and 38 related checks passed.
Restore Naldo Muse connection and start a fresh normal world
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.
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() (tests/test_voyager_executor_deadline.py)
The movement burst is now attributed: IffyBinkie6134 moved too quickly! -3556.6858076401522,-8.0,1147.6740068444371 -- the human Bedrock player, with a single delta of thousands of blocks, so the Java server kept snapping their position back. That is what feels like rubber-banding on entry, and it bothers the player more than the 172 ms ping does.
The translator is Geyser, not ViaProxy: ViaProxy 3.4.13 runs the Geyser plugin, and Geyser is what turns Bedrock movement into Java movement. The two editions move differently and upstream has not resolved it -- GeyserMC/Geyser#3407 is still open, and the Spigot/Paper thresholds it mentions (moved-too-quickly-multiplier, moved-wrongly-threshold) do not exist on a Fabric server. In that issue a reporter set the multiplier to 1000000 and it changed nothing.
TooFast is the server-side mixin that removes the vanilla speed check: toofast-1.19-1.0.0.jar, Fabric, Minecraft 1.19-1.19.2, MIT, environment 'server-side only'. The download is pinned by…
Name the entity behind the movement-warning burst
The server performance block reported a movement_warnings count with no way to attribute it. Measured: the counter went 0 -> 107 in under a minute and then stopped, so it is a burst from one event, not the server degrading. A count cannot say whether that is a player joining, a bot reconnecting, or the whole simulation falling behind, and the vanilla lines that carry the answer were not published anywhere -- the HF log stream served a frozen window and /voyager/status strips its log tail on purpose.
performance.movement_warning_samples now carries up to five of those lines, truncated to 200 characters each, so the entity is visible. They are deduplicated on the message rather than the raw line: every entry in a burst has its own timestamp, so comparing raw lines would fill the payload with five copies of one problem instead of showing five distinct ones. Verified directly: 40 warnings from one bot collapse to one sample, and adding a second bot's warning produces two.
This is diagnos…
Prove CPU-only instead of asserting it, and do not probe the binary before it is safe
The status published `gpu_enabled: False` and `n_gpu_layers: 0` as hardcoded literals. Nothing checked anything, so if the installed wheel had CUDA compiled in and a load site ever asked for offload, the status would still have said 'cpu-only'.
cpu_backend.py now derives the claim:
- the native backend libraries actually shipped with llama_cpp are listed, and any CUDA/cuBLAS/Vulkan/Metal/ROCm one would be named;
- every Llama(...) load site is asserted to pass n_gpu_layers=0 and offload_kqv=False, because omitting the argument is not the same as passing zero -- it lets the library decide;
- /status publishes cpu_only, gpu_offload_supported, gpu_backend_libraries and cuda_libraries_present, and gpu_enabled is now computed rather than typed;
- the boot log prints the same evidence once.
A mistake was made here and caught before deploying, which is why the binary query is opt-in. The first version called llama_cpp.llama_supports_gpu_offload() at module import, before llama_backe…
Deny a Critic success the live world contradicts, and stop reporting a ghost as live
1. Deny-only Critic veto
Measured: the Critic returned success: true with the reasoning 'having a netherite_pickaxe in their inventory means they have successfully mined gold, stone bricks, bricks and polished andesite', and separately returned success: true while its own evidence line read 'Live Inventory has 0/1 ...'. Both reached completed_tasks.json, which is why the completed count grows while the skill count does not.
mechanical_verdict() in voyager_verification is three-valued: True, False, or None. None means 'this deployment cannot judge this objective from the world', which is not the same as failed. VerifiedCreativeCritic now denies a model success only when mechanical_verdict returns a definite False -- an objective with a countable postcondition whose world state contradicts the claim. Every other verdict, including every objective this deployment cannot measure, still goes to the pinned upstream CriticAgent unchanged. The wrapper can deny a success; it can never cre…
Exercise the exit report instead of matching strings, and fix the name it needed
The test I wrote for the exit report asserted that certain strings appeared in the file. That is the same weakness that let the previous NameError through, so the test now runs the code: it raises a real exception carrying a fake API key, calls record_exit, reads the file back and checks the content, the traceback and the redaction.
To make that possible, record_exit moved from voyager_runner.py into voyager_runtime_contract.py. voyager_runner imports the pinned upstream package at module level, which a unit test should not need to satisfy. The runner keeps a one-line wrapper.
Moving it immediately exposed the same class of bug again: the new code in the contract used time.time() without importing time, and pyflakes -- added in the previous commit for exactly this -- reported 'undefined name time' on the first run. Fixed, and the unused 'import re' the move left behind in the runner was removed with it.
Also covered now: each bot writes its own report file, and a write failure retur…
Fix the NameError that made the leave/rejoin loop worse, and record why a runner dies
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…
Quarantine skills named after the prompt's own placeholder
Measured after the brain switch: Naldo_Bot's skill count went 8 -> 9 and the ninth skill was named `yourMainFunctionName`. That is not a learned behaviour, it is the placeholder in the upstream example at voyager/prompts/action_response_format.txt:12:
async function yourMainFunctionName(bot) {
The model copied the example literally, so the SkillManager stored the placeholder as if the agent had learned something. Retrieving it later injects the template straight back into the Action prompt.
quarantine_placeholder_skills() archives any skill whose name or code is a literal prompt placeholder, next to the existing bypass-template and known-invalid quarantines, and runs before the learning loop starts. The files stay on disk in checkpoint/quarantine/, as with the other two.
This is the failure mode the original instruction called out as 'armazenamento de templates como se fossem habilidades aprendidas'; the existing quarantine only matched three literal code signatures, so a placehold…
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…
Give the world the features and structures the curriculum needs, and measure player latency
World generation
FLAT_GENERATOR_SETTINGS passed features=False and structure_overrides=[]. Per minecraft.wiki/w/Superflat/Settings (Java 1.19+) `features` controls 'biome-specific placed features' and `structure_overrides` defaults to ALL structure sets, so an empty list disables every structure. A plains superflat therefore had no trees, grass, flowers, villages or chests, which is why the official curriculum kept proposing wood and structure tasks the bot could never satisfy.
features is now true and structure_overrides is omitted, so the documented default applies; generate-structures is on. `lakes` stays false because it only controls lava lakes and the surface must stay walkable. The layer stack is untouched, so WORLD_SURFACE_Y is still 64 and every placement, navigation and prompt assumption holds.
Generator settings are read only at world creation, so WORLD_DIR moves to world-20260929-features-y64-v1 and the previous world is kept as PREVIOUS_WORLD_DIR. The existing migrat…
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…
Enforce the official Voyager documentation as a checked contract
Make the documented upstream behaviour verifiable instead of asserted.
voyager_runner.py
skill_manager_retrieval_top_k now follows the upstream FAQ, which says it is 'essential' to set it <= 2 for a non-GPT-4 model to reduce prompt length. This deployment runs granite-4.0-h-tiny with an 8192-token window and the action prompt was measured at 6909 tokens. Overridable with VOYAGER_SKILL_TOP_K.
voyager_verification.py
task_spec() no longer swallows the purpose clause into the item name. It was feeding the official Critic a false world statement, e.g. 'Live Inventory has 0/1 diamond_pickaxe_to_upgrade_your_mining_capabilities...'.
tests/test_voyager_constructor_defaults.py (rewritten)
Was three substring checks on a hardcoded Windows path. Now parses the upstream Voyager.__init__ signature and the local Voyager(...) call with ast and compares every passed parameter against the upstream default, with an explicit reviewed departure list. Portable via VOYAGER_UPSTREAM_REF.
tests/tes…
Attest the live Critic wrapper instead of the object it replaces
voyager_runner.py attested the upstream CriticAgent and then replaced it with VerifiedCreativeCritic, so the report named a decision method that was no longer the one being called. The wrapper is now declared in DECLARED_WRAPPERS, installed before the attestation, and the attestation resolves its upstream delegate and attests that object. An undeclared wrapper, or one with no reachable delegate, fails the boot. Adds 4 regression tests; suite 51 passed, 0 failed.
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…
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.
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.