ci(audience): expand PlayMode CI matrix to Unity 6000.4.0f1 (SDK-256)#716
Merged
ImmutableJeffrey merged 5 commits intomainfrom Apr 29, 2026
Merged
ci(audience): expand PlayMode CI matrix to Unity 6000.4.0f1 (SDK-256)#716ImmutableJeffrey merged 5 commits intomainfrom
ImmutableJeffrey merged 5 commits intomainfrom
Conversation
- Adds 4 cells (Win+Mac × IL2CPP+Mono2x) on Unity 6000.4.0f1 / 8cf496087c8f to the audience PlayMode
matrix.
- Adds a per-OS observability step that surfaces Unity compile errors ('error CS####:' /
'Compilation failed:') as PR annotations; sanitises '::' so log lines containing workflow commands
cannot terminate the annotation early.
- macOS PlayMode-test step tees Unity stdout to artifacts/unity.log so the annotation step has a
file to scan.
Stacked PR 2 will add 4 Unity 2022.3.62f2 cells to reach the 12-cell goal.
…6 (SDK-256) - Adds Immutable.Audience.Samples.SampleApp.Editor.asmdef pinning ScriptingBackendOverride.cs into a discoverable Editor assembly; without an asmdef the implicit Assembly-CSharp-Editor may not be picked up by Unity 6's sandboxed test-runner build context. - Bumps com.unity.test-framework 1.1.33 -> 1.4.5 so [UnityTest] coroutines surface timeouts correctly under UTF 2.x. - Drops com.unity.toolchain.macos-arm64-linux-x86_64 2.0.5; the toolchain naming convention changed past 2022 and Unity auto-selects the macOS toolchain anyway. - Deletes packages-lock.json so each Unity version regenerates a lock matching its own UPM resolution. - Guards FindObjectOfType<AudienceSample> with #if UNITY_2023_1_OR_NEWER so APIUpdater can't silently drop the includeInactive parameter when rewriting to FindFirstObjectByType. - Converts deadline-style WaitForSecondsRealtime in two test methods to a polling pattern (Time.realtimeSinceStartup against a budget); adds the WaitForCondition helper used elsewhere in the test suite.
3282bf6 to
1742dd8
Compare
…ur CancellationToken (SDK-256)
- Three bare catch { } blocks (NotifyErrorCallback, ParseRejectedCount, NotifyError) previously
absorbed every exception type, including IL2CPP MissingMethodException / TypeLoadException from
stripping. Replace each with catch (Exception ex) { Log.Warn(...) } so the failure surfaces in
test logs without crashing the SDK.
- ParseRejectedCount accepts and honours a CancellationToken propagated from SendBatchAsync, so a
stalled HTTP body read can be cancelled instead of holding the cell open until the 60-min timeout.
…ConsentStore (SDK-256) - #nullable enable on Json.cs and Log.cs surfaces the real nullability concerns: HashSet<object>? for the Json visited-set first call from Serialize, and Action<string>? for Log.Writer (null until AudienceUnityHooks.Install runs). - Replaces reflective Enum.IsDefined in ConsentStore.Load with an explicit range check (raw >= ConsentLevel.None && raw <= ConsentLevel.Full); IL2CPP-safe under aggressive stripping where enum metadata may be dropped even with link.xml preserve="all".
1742dd8 to
672337f
Compare
…indows shutdown (SDK-256)
The Windows IL2CPP / Unity 6 cell hit GitHub's 60-min wall-clock timeout despite all 39 PlayMode
tests passing. Tests completed in 36s; the hang was during Editor shutdown.
Root cause: com.unity.ide.rider@3.0.40 (resolved fresh by Unity 6 from the manifest's pinned 3.0.31
after packages-lock.json was deleted) has a Windows-specific bug in its protocol cleanup. The plugin
runs `RiderPlugin AppDomain.CurrentDomain.DomainUnload lifetimeDefinition.Terminate` during Editor
shutdown, then leaves 3 worker threads alive that `mono_thread_manage` cannot abort
("abort_threads: Failed aborting id: ..."). The same plugin version on macOS Unity 6 IL2CPP shut
down cleanly in 4m28s — only Windows hangs.
The Rider, Visual Studio, and VSCode IDE-integration packages exist solely to generate .csproj/.sln
files for IDE project navigation. Headless `-batchmode -runTests` does not need them; the SDK and
sample code reference no symbol from any of the three plugins. com.unity.feature.development is a
meta-package that pulls them in transitively; with com.unity.test-framework already listed
explicitly, the feature is redundant.
Local developers who want IDE integration can install whichever plugin matches their toolchain
without it being pinned in the sample's manifest.
nattb8
approved these changes
Apr 29, 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.
Summary
error CS####:,Compilation failed:) to::error::annotations; sanitises::sequences to prevent workflow-command injection.artifacts/unity.logand uploads it alongsidetest-results.xmlso cell-compile failures retain a full post-mortem.Assets/Editor/ScriptingBackendOverride.csin a newImmutable.Audience.Samples.SampleApp.Editorasmdef soAUDIENCE_SCRIPTING_BACKENDis honoured under Unity 6's sandboxed test-runner build context.com.unity.test-framework1.1.33 → 1.4.5; dropscom.unity.toolchain.macos-arm64-linux-x86_64; deletespackages-lock.jsonso each Unity version resolves the manifest fresh.com.unity.feature.development,com.unity.ide.rider,com.unity.ide.visualstudio,com.unity.ide.vscodefrom the sample manifest. Rider 3.0.40's Windows-side protocol cleanup leaves worker threads alive thatmono_thread_managecannot abort, hanging Editor shutdown for 60 min on Win/IL2CPP/Unity 6.FindObjectOfType<AudienceSample>with#if UNITY_2023_1_OR_NEWERand usesFindFirstObjectByType<T>(FindObjectsInactive.Include)on the new branch to preserveincludeInactive: truesemantics that APIUpdater would otherwise drop.WaitForSecondsRealtimedeadline waits inSampleAppLiveFireTestswith aWaitForConditionpolling helper to avoid UTF 2.x test-runner clock divergence.catch { }blocks (NotifyErrorCallback,ParseRejectedCount,NotifyError) withcatch (Exception ex) { Log.Warn(...) }so IL2CPP linker stripping errors surface in test logs.CancellationTokenobservation toParseRejectedCountviaThrowIfCancellationRequested()(the(CancellationToken)overload ofHttpContent.ReadAsStringAsyncis .NET 5+ only and absent from .NET Standard 2.1).#nullable enabletoJson.csandLog.cs; threadsHashSet<object>?throughWriteObject/WriteArray/EnterContainer.Enum.IsDefinedinConsentStore.Loadwith a bounded range check onConsentLevelto remove an IL2CPP enum-metadata stripping risk.Linear: SDK-256