Skip to content

v6.8.0 — audit fixes, fail-closed key guards, two reverts

Choose a tag to compare

@NeoXider NeoXider released this 24 Jul 21:12
· 105 commits to main since this release

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 under Resources/ is packed into the player and the key is recoverable from the shipped build. Clear apiKey/secondaryApiKey on committed Resources assets and supply the key at runtime. WebGL key leaks in ClientOwnedApi/ClientLimited/ServerManagedApi fail the build too.
  • ICoreAiComponentCommandExecutor.LastListedComponents is removed, replaced by TryExecute(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 Assets or CoreAI/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.
  • OperationCanceledException was retried as a provider fault in three places; caller cancellation now propagates immediately.
  • SetTools silently did nothing on chains fronted by ClientLimitedLlmClientDecorator or LoggingLlmClientDecorator. 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.json corruption; non-atomic endpoint-registry saves; WebGL SwitchToThreadPool hangs; 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 reports false in the Editor even for a registered and enabled scene; the resulting Assert.Ignore on the first MoveNext() 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.md records 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 the Fire call, 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.