milestone met. 10 conformance scenarios (the recorded spec, ~840 events) recorded in Unity 6000.2.10f1 pass (lifecycle, object lifetime, coroutines, Mathf, vectors, rotations/matrices, world-space transforms, value types, Random), and tassix_editor builds, undoes and redoes a scene from JSON-line commands.
- World: GameObjects, components, hierarchy, activation (deactivation reported children-first, as Unity does), destroy; transforms in dense struct-of-arrays storage with dirty flags, lazy per-object evaluation, and a level-by-level parallel bulk update each frame.
- Scripting: fake null, GameObject/Component/Behaviour/MonoBehaviour/Transform (local and world space), lifecycle player loop,
[DefaultExecutionOrder], coroutines,Time,Debug. Callbacks come from tables emitted byTassix.Generators([UnsafeAccessor]for private methods; no reflection, NativeAOT-ready), with a reflection fallback for generic types. - Math and values:
Mathf(incl. PerlinNoise),Vector2/3/4,Vector2Int/3Int,Quaternion,Matrix4x4,Color/Color32,Rect,Bounds,LayerMask(built-in layers), andRandomwith bit-identical seeded sequences. - Jobs:
tassix_jobsframe task graph (levelled once, allocation-free runs apart from rayon's amortized injector blocks). - Performance (release, 32 threads, after the shared-view change below): fake-null check 0.3 ns,
GetComponent1.2 ns,localPosition/position/rotationget 1.7–2.3 ns (direct reads, no native call),localPositionset 8 ns,positionset 16 ns, Vector3 math ~2 ns; 10k scripted objects + 5k children at 0.43 ms/frame with 0 managed bytes/frame. Transform bulk update: 10k dirty in 65 us, 100k in 0.80 ms (memory-bound). - Editor core: typed commands with JSON Schemas, stable
ObjectIds, atomic batches, undo/redo with exact subtree restore, change events,tassix_editorCLI. - Findings: Unity's editor (Mono) uses double-precision intermediates for float math and formats
float.ToString()with ~7 digits; scripts run with the invariant culture; WaitForEndOfFrame can't be recorded in batch mode (see conformance/README.md). - Shared view (follow-up, 2026-10-24): Rust publishes pointers to handle generations, the handle-to-slot table and the dense transform arrays; managed code reads them directly, refreshed after every native call (sound: managed code never runs while native code touches the world). Earlier per-call numbers were inflated by benchmarking before tiered JIT promotion; benchmarks now warm each body for 250 ms.
- Carried forward: Native components other than Transform get dense storage as they arrive (Phase 2+). Editor component fields are editor-side data until managed components are bound to the editor (Phase 4 inspector).