Refuse runtime_launch as engine_unavailable when Godot never starts - #1086
Merged
Merged
Conversation
An editor opens the scenes it restores, or the project's main scene, once its first scan is applied, and makes one of them current. A scene_open answered before then was replaced a moment later, and every later scene call acted on the main scene. scene.open and scene.create now wait at the front of the queue until the editor's file index is populated, which is the same moment on 4.5.1, 4.6.2 and 4.7.2. Commands behind them wait too, so nothing overtakes them. Adds a native test for the hold, a live test CI runs on each line, and a vibe probe that reproduces the switch.
scene_create over a scene open in another tab rebuilt the tab and then opened it in the same request. On 4.5 and 4.6 the editor ignores a scene change for the rest of a frame in which it rebuilt one, so a tab right of the current one never came to the front and the call answered opened: false. The bridge now makes the tab current first and says it is stale, and the server rebuilds it on a later request through resource.refreshCached, the reload every other writer uses. The previous scene is read before anything moves it, so previous_scene_file_path is right on those lines too.
csharp_check_build runs dotnet --version before the build, and that probe stopped at a fixed 30 seconds whatever timeout_seconds said. A probe that ran out answered 503 toolchain_unavailable, not retryable, and told the caller to install an SDK that was there. It turned main's 4.7.2 job red, and this branch's parent's 4.5.1 job. The probe now runs under timeout_seconds, and running out of it answers 504 timeout, retryable, with timeout_seconds in the data.
With a GODOT_BIN that cannot be started, runtime_launch answered success: false and exit_code 0, the shape of a game that ran and failed, and said to put godot on PATH whatever GODOT_BIN named. The other tools that start their own Godot answer 503 engine_unavailable since #1045. The test runner now records a spawn Windows refused, and the handler refuses that, or a POSIX child that exits 127, the same way.
The 4.6.2 job on #1084 saw scene_open end in peer_closed after 5.7 s, with the editor alive, and the test had sent the editor output nowhere. It now keeps it with the extension at INFO, and a failure prints it with the sessions the server lists.
On a runner with no Godot, runtime_launch now answers 503 engine_unavailable, and the engine identity test expected a success body with the engine fields. Nothing runs there, so the refusal is the answer; the test now checks it names the engine it tried.
This was referenced Sep 30, 2026
This was referenced Sep 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1076
Stacked on #1085, #1084 and #1083. Their commits show here until they merge.
#1076 asked for
TestRunner::runSessionto launch throughrunProcess. The part a caller can see is its invariant: a launch failure should map the way it does for the other tools that start Godot. It did not. With aGODOT_BINthat cannot be started,runtime_launchansweredisError: false,success: falseandexit_code: 0. That is the shape of a game that ran and failed, and the summary said to put godot on PATH whateverGODOT_BINnamed.The smaller change fixes that without moving the spawn. The test runner records a spawn Windows refused, with the error number.
runtime_launchrefuses that, or a POSIX child that exits 127, as503 engine_unavailablewithengine_executable, the same answershader_check_compile,project_exportandgridmap_export_mesh_librarygive since #1045. A detached POSIX launch cannot see an exec failure, since the game execs after the call has its pid, and it still answers that no session was published.runSessionkeeps its own spawn. It already has the job object, the handle list and the NUL input the shared runner has, and it has a detached mode the shared runner does not. Moving it would be tidier and change nothing a caller sees.Test:
RuntimeLaunch.AnEngineThatWillNotStartIsEngineUnavailablepointsGODOT_BINat a text file and checks both modes answer 503engine_unavailablenaming the file andGODOT_BIN. It fails with the refusal removed.Checked locally: native suite (957), Python suite, docs validator, test inventory, and the live harness on 4.7.2. CHANGELOG updated under Unreleased, Fixed.