Skip to content

v0.3.81 — Fewer false failures after Safe Mode, profile compiles and long imports; complete failure lists, anchored log search and asset field reads

Choose a tag to compare

@FoxsterDev FoxsterDev released this 28 Sep 20:26
· 13 commits to main since this release

v0.3.81 — Fewer false failures after Safe Mode, profile compiles and long imports; complete failure lists, anchored log search and asset field reads

Why this matters

A one-hour session on v0.3.80 completed every Unity request, yet the wrapper reported three failures Unity had already resolved: a readiness verdict that blamed a Safe Mode dialog after the editor had left Safe Mode on its own, a scenario compile step that was dispatched into a still-recompiling editor and refused with editor_busy, and a "frozen editor" recovery for a slow asset import that would have finished by itself. The same session needed four extra rounds for evidence the tools did not expose: only three of nine test failures were listed, an anchored Editor.log search covered the oldest 500,000 characters of a 2 MB play session, the in-memory console search had no "since Play Mode started" anchor, and a serialized asset field could only be read through Play Mode or the asset YAML. Each of these cost extra tool calls or a raw 55 MB log read.

What changed

  • ensure-ready no longer treats Unity's Exiting safe mode log line as the Safe Mode dialog. The readiness wait keeps polling while Editor.log still moves, raises startup_safe_mode_dialog_observed only after the log has been quiet for 20 s with the dialog markers present (or at the deadline, with dialog_block_basis), and a healthy bridge whose editor still reports compile errors returns verdict=ready_with_compile_errors with startup_log_observation and the request-project-refresh recovery command.
  • Compact EditMode/PlayMode test payloads, request-final-status and the compact terminal envelope carry failures[] (up to 25 name/message rows), failure_count, failures_truncated and test_result_path. first_failures stays for compatibility.
  • The scenario compile_player_scripts step waits for the editor to leave compile, update, domain-reload, package and import activity before it dispatches, retries one editor_busy refusal, reports dispatch_gate_wait_seconds, dispatch_attempt_count and dispatch_gate_busy_observed, and fails as compile_dispatch_gate_timeout when idle never arrives. A profile hook marked apply_then_gate now needs only status and compile_player_scripts after it; the blind wait step is optional.
  • Anchored unity_console_grep / request-console-grep search the whole anchored Editor.log scope up to the 10,000,000-character hard cap when maxSearchChars is omitted (search_window_auto_extended, requested_search_chars); an explicit budget still bounds the window. source=console and scenario console_grep steps accept since=playmode_start, backed by a console-buffer anchor captured on Play Mode entry, and report since_anchor_resolved, since_anchor_reason, since_scope_complete and search_verdict. Other console anchors are refused as unsupported_console_anchor.
  • editor_idle_timeout details classify a live editor process whose heartbeat is stale for at most 600 s during import, update, compile, package or domain-reload activity as editor_busy_heartbeat_stale with retry_recommended=true and wait_for_editor_idle_then_retry; longer stalls, dead processes and idle busy reasons stay editor_state_frozen. The stderr failure line and the compact envelopes carry retry_recommended. A GUI-fallback lane that already quit the editor it opened rewrites its recovery advice to retry_same_command with editor_quit_by_wrapper=true.
  • Batch and GUI-fallback summaries carry one lane-independent terminal_record (lane, compile_status, error_count, rebuilt_assembly_count, cached_assembly_count, license_blocker_code, lane_fallback_reason and more), also emitted as the last progress NDJSON line (event=batch_terminal_record) and in the compact CLI output; the multi-project runner reads it plus error_code and retry_recommended into each project status and the summary line.
  • A reconciled PlayMode test result labels the post-run domain reload expected_domain_reload with lifecycle_churn_classification=expected_playmode_exit_domain_reload instead of stale_risk; EditMode churn and unreconciled results keep stale_risk.
  • New tool unity_asset_snapshot (unity.asset.snapshot): a read-only, depth-limited snapshot of the serialized fields of a ScriptableObject or any other main asset as path/type/value rows, with array sizes, bounded array elements and object references rendered as type:name@path. The asset is never modified.

What this gives developers

  • Fewer false failures: an editor that recovered on its own, a compile that only needed to wait for the editor to go idle, and a slow import are no longer reported as manual-recovery incidents, and the profile scenarios no longer need a blind wait step.
  • Fewer evidence rounds: every test failure, the whole play session in Editor.log, the current console session and a serialized asset field are readable from the tool surface instead of the raw log or the asset file.
  • Simpler sweeps: one terminal_record shape covers the batch and GUI lanes, and a busy-editor timeout says whether rerunning the same command is the right next step.

Validation

  • Host Python suite on the release tree: 1156 tests OK with 14 expected platform skips (scripts/testing/run_host_python_tests.sh, including the version-consistency, docs-freshness and public-safety gates). The new tests/test_retro_readiness_and_evidence_surfaces.py reproduces each case: Safe Mode classifier and readiness wait, complete failure list bound, expected domain reload, anchored grep auto-extension, stale-heartbeat retry hint, GUI-lane quit annotation, terminal record and the multi-project reader. The tools/list parity fixture was regenerated for the added tool.
  • Public site checks: 42/42 Playwright tests passed for v0.3.81 across desktop, mobile and narrow profiles.
  • Package proof on a consumer project running Unity 6000.0.58f2 in devmode (local, not hosted CI): package EditMode self-tests 128/128, 6/6 and 39/39, including seven new tests (validator sequence, dispatch-gate timeout, console anchor, asset snapshot read and refusals). A profile hook that changed scripting defines followed by only a 2 s wait let the compile step gate for 16.0 s (dispatch_gate_busy_observed=true, one attempt) and compile 87 rebuilt / 189 cached assemblies with zero errors; the scenario passed in 41 s where the earlier run had failed with editor_busy. A play smoke console_grep since=playmode_start resolved its anchor with a complete scope (64 matches; an absent marker answered not_matched). unity_asset_snapshot read an enum override field from the project's build configuration asset without Play Mode.
  • Not run for this release: the package PlayMode self-test lane on that consumer project (blocked by an editor dialog gate in its release profile) and hosted Unity Package CI.

Known limitations

  • Hosted Unity Package CI remains waived because the runners have no Unity license secrets; there is no CI-recorded EditMode or PlayMode proof for the release SHA. The package proof above is a local devmode run.
  • The 600 s retry bound for a stale heartbeat comes from two observations (180 s stalls that recovered on rerun, one 1522 s stall that was frozen); it is a classification boundary, not a measured editor limit.
  • The console-buffer anchor survives domain reloads through SessionState, but console items logged between Play Mode entry and the reload are not retained by the recreated buffer; the payload reports this as console_buffer_recreated_after_anchor.
  • Windows and Linux host behaviour is covered by the CI matrix and static checks only; the live runs above were on macOS.