v6.8.0 — audit fixes, fail-closed key guards, two reverts
Acts on the 6.7.0 audits of the core, Unity and Hub packages.
⚠️ Breaking / migration
- A provider key inside a
Resources/settings asset now FAILS the build on every platform, instead of logging "Building anyway". Anything underResources/is packed into the player and the key is recoverable from the shipped build. ClearapiKey/secondaryApiKeyon committedResourcesassets and supply the key at runtime. WebGL key leaks inClientOwnedApi/ClientLimited/ServerManagedApifail the build too. ICoreAiComponentCommandExecutor.LastListedComponentsis removed, replaced byTryExecute(cmd, out List<string> listedComponents)— tool calls run in parallel, so a listing on shared executor state could be overwritten before its consumer read it.- Default assets are no longer auto-created on editor load. Use
CoreAI/Setup/Create Default AssetsorCoreAI/Settings.
Fixed
- Queue-pump deadlock in
QueuedAiOrchestrator: work started synchronously under_lock, and its first statement disposed a cancellation registration that blocks on a callback waiting for that same lock. OperationCanceledExceptionwas retried as a provider fault in three places; caller cancellation now propagates immediately.SetToolssilently did nothing on chains fronted byClientLimitedLlmClientDecoratororLoggingLlmClientDecorator. A reflection sweep test now requires every decorator to declare every virtual interface member.- Half-open probe slot leak in the circuit breaker; unbounded static lock tables keyed by model-controlled ids;
Packages/manifest.jsoncorruption; non-atomic endpoint-registry saves; WebGLSwitchToThreadPoolhangs; an editor capture leak and a main-thread marshaler hang. - Hub: sub-tab lifecycle on revisit, remove-confirm state lost on list rebuild, and settings Apply silently downgrading
ClientLimited/ServerManagedApi. - The PlayMode suite could not run past test 32. A guard used
Application.CanStreamedLevelBeLoaded, which reportsfalsein the Editor even for a registered and enabled scene; the resultingAssert.Ignoreon the firstMoveNext()of a[UnityTest]wedged the runner and blocked the remaining 139 tests.
Reverted — both traded a guarantee for a small measured win
- Clock sampling in the Lua execution guard, shipped in 6.7.0 and documented there as "free and risk-free". It was not: the count hook does not fire during a host call, so a handler of a few hundred instructions that are mostly bindings can blow a per-frame budget while never reaching the sampling threshold — defeating the timeout in the case it matters most. Reverting costs ~6%;
dev-docs/LUA_PERF_AUDIT_v6.6_2026-07.mdrecords how to recover it safely. RbxScriptSignal.Fire1/Fire2, reverted before shipping: the reused argument buffer is incompatible with the MVP2 scheduler's deferred dispatch, where the argument array outlives theFirecall, and it removed one array out of N+1.
Verification
EditMode: 2427 tests, 0 failed. PlayMode: 171 run; the 2 remaining failures reproduce identically on a clean HEAD (a missing local GGUF model, and a demo-scene assertion) and are tracked separately. Windows player builds clean at 615.89 MB.