Repository navigation
v0.3.81 — Fewer false failures after Safe Mode, profile compiles and long imports; complete failure lists, anchored log search and asset field reads
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-readyno longer treats Unity'sExiting safe modelog line as the Safe Mode dialog. The readiness wait keeps polling while Editor.log still moves, raisesstartup_safe_mode_dialog_observedonly after the log has been quiet for 20 s with the dialog markers present (or at the deadline, withdialog_block_basis), and a healthy bridge whose editor still reports compile errors returnsverdict=ready_with_compile_errorswithstartup_log_observationand therequest-project-refreshrecovery command.- Compact EditMode/PlayMode test payloads,
request-final-statusand the compact terminal envelope carryfailures[](up to 25 name/message rows),failure_count,failures_truncatedandtest_result_path.first_failuresstays for compatibility. - The scenario
compile_player_scriptsstep waits for the editor to leave compile, update, domain-reload, package and import activity before it dispatches, retries oneeditor_busyrefusal, reportsdispatch_gate_wait_seconds,dispatch_attempt_countanddispatch_gate_busy_observed, and fails ascompile_dispatch_gate_timeoutwhen idle never arrives. A profile hook markedapply_then_gatenow needs onlystatusandcompile_player_scriptsafter it; the blindwaitstep is optional. - Anchored
unity_console_grep/request-console-grepsearch the whole anchored Editor.log scope up to the 10,000,000-character hard cap whenmaxSearchCharsis omitted (search_window_auto_extended,requested_search_chars); an explicit budget still bounds the window.source=consoleand scenarioconsole_grepsteps acceptsince=playmode_start, backed by a console-buffer anchor captured on Play Mode entry, and reportsince_anchor_resolved,since_anchor_reason,since_scope_completeandsearch_verdict. Other console anchors are refused asunsupported_console_anchor. editor_idle_timeoutdetails classify a live editor process whose heartbeat is stale for at most 600 s during import, update, compile, package or domain-reload activity aseditor_busy_heartbeat_stalewithretry_recommended=trueandwait_for_editor_idle_then_retry; longer stalls, dead processes and idle busy reasons stayeditor_state_frozen. The stderr failure line and the compact envelopes carryretry_recommended. A GUI-fallback lane that already quit the editor it opened rewrites its recovery advice toretry_same_commandwitheditor_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_reasonand 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 pluserror_codeandretry_recommendedinto each project status and the summary line. - A reconciled PlayMode test result labels the post-run domain reload
expected_domain_reloadwithlifecycle_churn_classification=expected_playmode_exit_domain_reloadinstead ofstale_risk; EditMode churn and unreconciled results keepstale_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 astype: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_recordshape 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:
1156tests OK with14expected platform skips (scripts/testing/run_host_python_tests.sh, including the version-consistency, docs-freshness and public-safety gates). The newtests/test_retro_readiness_and_evidence_surfaces.pyreproduces 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/42Playwright tests passed forv0.3.81across desktop, mobile and narrow profiles. - Package proof on a consumer project running Unity
6000.0.58f2in devmode (local, not hosted CI): package EditMode self-tests128/128,6/6and39/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 for16.0s (dispatch_gate_busy_observed=true, one attempt) and compile87rebuilt /189cached assemblies with zero errors; the scenario passed in41s where the earlier run had failed witheditor_busy. A play smokeconsole_grep since=playmode_startresolved its anchor with a complete scope (64matches; an absent marker answerednot_matched).unity_asset_snapshotread 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 asconsole_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.