v0.3.71 — a blocked project action unblocks, and the tool stops editing your project settings
v0.3.71 — a blocked project action unblocks, and the tool stops editing your project settings
Why this matters
Three things in the last few releases could waste your time or change your repository behind your back. A typed project action could refuse to run forever: the freshness gate compared file timestamps against Unity's last script reload, but it counted scripts in folders Unity never imports, and a file touched without a content change is imported without a recompile. Both states reported editor_domain_stale and told you to run a refresh that could not change either number. Separately, the bridge set Application.runInBackground = true on every heartbeat; in the editor that property is backed by the project setting PlayerSettings.runInBackground, so it was writing a value into your committed ProjectSettings.asset. And point-of-use liveness evidence defaulted to editor_truth_confirmed, so a scenario step that never ran still claimed confirmed editor truth.
What changed
- The freshness gate matches Unity and converges.
unity_project_action_invokeandunity_project_action_currencynow skip the entries Unity itself ignores (a name starting with., ending with~, or namedcvs), so a script under a folder such asSamples~can no longer pin the gate. After a forcedunity_project_refreshsettles, a file whose timestamp that refresh already covered is treated as current, reported ascurrency_basis=settled_forced_asset_refresh_covers_newest_assets_editor_input. A genuinely uncompiled edit still blocks, and a failing script compilation now saysfix_script_compilation_errors_before_invokinginstead of pointing at a refresh. - The editor-domain timestamp is stamped once per domain, before the bridge-enabled check, so a batch-mode editor and a project without the bridge enabled both report it. Enabling the bridge inside one domain can no longer advance that timestamp and hide a stale domain.
- Background execution is opt-in. Set
background_execution_enabled: truein the project's bridge config to let the bridge keep the editor running unfocused. It then captures your project's previous value and restores it when the bridge is disabled or the editor quits, applies it once per domain instead of on every heartbeat, and reportsbackground_execution_modeasmanagedorproject_owned. Default isproject_owned: the bridge does not touch the setting. - An unevidenced result no longer claims editor truth.
result_trust_classdefaults to empty. Every payload that actually took a liveness sample keeps the value it reported before. - The package self-test runner derives what it runs from the package. It plans every shipped test assembly whose tests carry the selected category and whose optional dependencies are installed, prints the plan as
editmode_plan=/playmode_plan=, runs each assembly as its own request, and fails withpackage_self_tests_assembly_contributed_no_testswhen one contributes nothing. - Unity Hub is detected on Linux. The matcher accepted only a process whose final path segment was exactly
unityhub, so theunityhub-binand AppImage forms every real Linux install runs were invisible. - A host whose GUI editor licenses itself without a running Hub can proceed.
XUUNITY_LIGHT_UNITY_MCP_GUI_ADMISSION_OVERRIDE=1admits the GUI lane. The refusal is unchanged by default and now names the override, and a used override is recorded in the lane payload with the blocker it waived. - Your own CLI is no longer reported as another client. Host journal events carry a
client_kind, a host publishes its session id to its child processes, andforeign_request_activity_detectedis scoped to a different non-CLI client session. Wrapper and smoke traffic is counted separately incli_requests_since_client_start. - Smaller correctness fixes: compiler diagnostic codes are read from the diagnostic rather than the file path (a file under
Physics2020reportedCS2020); the compact compile response reads its verdict from the layer that owns it; an unproven playing loop is told to wait for the next sample instead of to focus the editor; the wrapper keeps a bounded childstderrtail beside a typed error; and the currency probe no longer raises the editor window.
What this gives developers
- A project action that is genuinely invokable stops being refused, and a refusal names an action that can change the outcome.
- A validation tool no longer edits the project it is validating.
- An empty trust class is never read as a confirmation, so a scenario result cannot look proven because a step never ran.
- The uGUI EditMode, uGUI PlayMode and TextMeshPro EditMode suites are under execution proof. The TextMeshPro suite had never run in that lane. A project without
com.unity.uguiorcom.unity.textmeshprostill passes, because those assemblies drop out of the plan instead of failing it. - Every trust, outcome, warning and gap value the tool publishes is now one table in
docs/reference/GLOSSARY.md.
Validation
- Host Python suite:
1035tests,14expected platform skips. - Public site UI and accessibility:
42/42across desktop, mobile and narrow Chromium viewports. - Release version consistency, documentation freshness and public-release safety pass.
- A clean uGUI consumer scaffolded from this source passes package EditMode
154/154across all three shipped EditMode assemblies on both Unity2022.3.67f2and6000.0.58f2, with the consumer'sProjectSettings.assetunchanged by the run. - The full bridge lane on Unity
2022.3.67f2executed every assembly in the derived plan and reported each separately: EditMode core110, TextMeshPro6, uGUI39; PlayMode uGUI13passed with1expected skip, PlayMode core5/5.
Known limitations
- Hosted
Unity Package CIremains explicitly waived: its runners have no Unity license credentials, so the shipped package carries no CI-recorded EditMode/PlayMode proof for this SHA. The local licensed Unity lanes above are the package evidence. - Live Unity validation was performed on macOS. Windows and Linux host behavior is covered by portable host contracts and fixtures, not by a live run; the new Linux Unity Hub process forms are asserted through the real process-listing parser rather than observed on a Linux host.
- The helper-owned licensing-child termination path still has no live exercise. It is now covered per platform shape by tests instead of by a live kill.
- Restoring an opted-in
background_execution_enabledvalue depends on a graceful bridge disable or editor quit. A force-killed editor cannot restore it. - The GUI admission override waives the preflight, not the license. A host that genuinely cannot license an editor still fails at launch.
playmode_throttledstill serves as both a warning code and a trust-class value, and the request-status and livenessresult_trust_classnamespaces remain distinct sets under one field name. Both renames are breaking and are deliberately not done in a patch release.- The full bridge self-test lane needs a warm project on Unity
6000: a cold first import can exceed the lane'sensure-readytimeout, which is why the6000.0.58f2evidence here comes from the batch lane.
Errata for earlier releases
- The
v0.3.69statement that background execution "does not changePlayerSettings" was wrong. Consumers that ranv0.3.69orv0.3.70should checkProjectSettings/ProjectSettings.assetfor an unintendedrunInBackgroundchange. - The package self-test runner's EditMode filter omitted the optional uGUI EditMode assembly from its introduction on
2026-07-30untilv0.3.68, and the TextMeshPro EditMode assembly from2026-07-31until this release. Thev0.3.66line "EditMode95/95in both uGUI and no-uGUI lanes" is the clearest instance: identical counts in both lanes prove the uGUI assembly contributed nothing. - The
v0.3.63statement that an editor was restored "without terminating the shared Hub licensing client" was not exercised: that run had no helper-owned licensing child, so the guard was never reached. v0.3.70also repaired the default compact response ofunity_compile_player_scriptswithout listing it. Fromv0.3.34throughv0.3.69that response carried no field from the compile itself.
Install
https://github.com/FoxsterDev/xuunity-mcp.git?path=/packages/com.xuunity.light-mcp#v0.3.71