Skip to content

v0.3.71 — a blocked project action unblocks, and the tool stops editing your project settings

Choose a tag to compare

@FoxsterDev FoxsterDev released this 04 Sep 18:45
· 7 commits to master since this release

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_invoke and unity_project_action_currency now skip the entries Unity itself ignores (a name starting with ., ending with ~, or named cvs), so a script under a folder such as Samples~ can no longer pin the gate. After a forced unity_project_refresh settles, a file whose timestamp that refresh already covered is treated as current, reported as currency_basis=settled_forced_asset_refresh_covers_newest_assets_editor_input. A genuinely uncompiled edit still blocks, and a failing script compilation now says fix_script_compilation_errors_before_invoking instead 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: true in 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 reports background_execution_mode as managed or project_owned. Default is project_owned: the bridge does not touch the setting.
  • An unevidenced result no longer claims editor truth. result_trust_class defaults 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 with package_self_tests_assembly_contributed_no_tests when one contributes nothing.
  • Unity Hub is detected on Linux. The matcher accepted only a process whose final path segment was exactly unityhub, so the unityhub-bin and 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=1 admits 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, and foreign_request_activity_detected is scoped to a different non-CLI client session. Wrapper and smoke traffic is counted separately in cli_requests_since_client_start.
  • Smaller correctness fixes: compiler diagnostic codes are read from the diagnostic rather than the file path (a file under Physics2020 reported CS2020); 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 child stderr tail 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.ugui or com.unity.textmeshpro still 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: 1035 tests, 14 expected platform skips.
  • Public site UI and accessibility: 42/42 across 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/154 across all three shipped EditMode assemblies on both Unity 2022.3.67f2 and 6000.0.58f2, with the consumer's ProjectSettings.asset unchanged by the run.
  • The full bridge lane on Unity 2022.3.67f2 executed every assembly in the derived plan and reported each separately: EditMode core 110, TextMeshPro 6, uGUI 39; PlayMode uGUI 13 passed with 1 expected skip, PlayMode core 5/5.

Known limitations

  • Hosted Unity Package CI remains 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_enabled value 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_throttled still serves as both a warning code and a trust-class value, and the request-status and liveness result_trust_class namespaces 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's ensure-ready timeout, which is why the 6000.0.58f2 evidence here comes from the batch lane.

Errata for earlier releases

  • The v0.3.69 statement that background execution "does not change PlayerSettings" was wrong. Consumers that ran v0.3.69 or v0.3.70 should check ProjectSettings/ProjectSettings.asset for an unintended runInBackground change.
  • The package self-test runner's EditMode filter omitted the optional uGUI EditMode assembly from its introduction on 2026-07-30 until v0.3.68, and the TextMeshPro EditMode assembly from 2026-07-31 until this release. The v0.3.66 line "EditMode 95/95 in both uGUI and no-uGUI lanes" is the clearest instance: identical counts in both lanes prove the uGUI assembly contributed nothing.
  • The v0.3.63 statement 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.70 also repaired the default compact response of unity_compile_player_scripts without listing it. From v0.3.34 through v0.3.69 that 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