v4.0.3
Added
project_reconcile_plan / project_reconcile_apply / project_reconcile_status — one ordered, resumable flow over the existing toolchain tools.
Every individual operation was already safe; what was missing was the order. An agent had to work out for itself that rokit_status precedes rokit_install, that a Wally install is pointless before the lock validates, and that a sourcemap generated before the packages exist describes a tree that does not.
Reconcile owns that order and nothing else — it composes the same tools behind the same plan / confirm / planHash contract rather than becoming a second, less-reviewed way to run them.
It restores declared state and never invents new state. Installing the exact version rokit.toml pins, or the packages wally.lock already resolved, is a repair. Choosing a version, resolving a new lock, editing the Rojo tree or migrating Aftman is a decision, and each comes back as a blocked step naming the [automation] flag in bloxforge.toml that would permit it — all four off by default.
- Single-writer lease at
.bloxforge/locks/project-reconcile.lock; a second agent getsanother_reconcile_is_runningrather than a half-applied project, and a lease whose process is gone is treated as stale. - Journal at
.bloxforge/reconcile/<runId>.json; the samerunIdresumes an interrupted run instead of repeating finished steps. - State is re-read after every mutation rather than precomputed once —
rokit_installchanges which tools exist, and therefore what the remaining steps should be. - Every run finishes on the full strict project verify.
Fixed
- The Inspector plugin could not load.
ClientBrokeris packaged in both variants and requiresInputHandlers,EvalRuntimeHandlersandBreakpointHandlers, which the reduced Inspector build omits, so the first require failed and the plugin never started. Those three now redirect to Inspector stubs that refuse the endpoint, keeping runtime Luau execution out of the read-only package. InspectorBreakpointHandlersexported the wrong module shape — a default object, where its callers are compiled against the real module'sexport =and index the module table directly, soBreakpointHandlers.init(plugin)would have been nil even once the module resolved.build-plugin.mjsrefuses to package a variant that requires a module it does not ship, and fails when a source rewrite matches nothing. This is the check the assertions on the finished asset cannot make: an omitted module is missing for exactly the reason it is supposed to be missing.- The pinned Lune bootstrap caches under the user's home instead of the system temp directory. A cache hit skips the checksum and
/tmpis writable by every local account, so the previous path let anyone with an account on the machine have the release gate execute their binary.BLOXFORGE_TOOL_CACHEstill overrides it. shapeListResponseno longer promises apaginationblock it does not always attach — four of its five paths return the caller's object untouched.
Verified
Full CI green on the released commit, including the real-CLI toolchain matrix on Windows and macOS.
Full changelog: https://github.com/princeofscale/bloxforge/blob/v4.0.3/CHANGELOG.md