Fix release for 1.1.1: the minimal path end to end, engine commands that run on Godot, Unity and Unreal, hook warnings you can see, and verdicts that say when they could not check. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.1 → v1.1.2). Fixes #67 Fixes #131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
5.8 KiB
Agent Test Spec: unity-dots-specialist
Agent Summary
Domain: ECS architecture (IComponentData, ISystem, SystemAPI), Jobs system (IJob, IJobEntity, Burst), Burst compiler constraints, DOTS gameplay systems, and hybrid renderer. Does NOT own: MonoBehaviour gameplay code (gameplay-programmer), UI implementation (unity-ui-specialist). No gate IDs assigned.
Static Assertions (Structural)
description:field is present and domain-specific (references ECS / Jobs / Burst / IComponentData)tools:list includes Read, Write, Edit, Bash, Glob, Grep- Model tier is
sonnet— frontmattermodel:reads exactlysonnet(tiers:.claude/docs/model-tiers.md) - Agent definition does not claim authority over MonoBehaviour gameplay or UI systems
Test Cases
Case 1: In-domain request — appropriate output
Input: "Convert the player movement system to ECS." Expected behavior:
- Produces:
PlayerMovementData : IComponentDatastruct with velocity, speed, and input vector fieldsPlayerMovementSystem : ISystemwithOnUpdate()usingSystemAPI.Query<>orIJobEntity- Bakes the player's initial state from an authoring MonoBehaviour via a
Baker<T>subclass (the pattern indocs/engine-reference/unity/plugins/dots-entities.md)
- Uses
RefRW<LocalTransform>for position updates (not deprecatedTranslation) - Marks the job
[BurstCompile]and notes what must be unmanaged for Burst compatibility - Keeps one concern per system: the movement system reads input from a component (e.g.
PlayerInputData) that a separate input system writes, rather than polling input itself, and asks before creating or changing that input side
Case 2: MonoBehaviour push-back
Input: "Just use MonoBehaviour for the player movement — it's simpler." Expected behavior:
- Acknowledges the simplicity argument
- Explains the DOTS trade-off: more setup upfront, but the ECS/Burst approach provides the performance characteristics documented in the project's ADR or requirements
- Does NOT implement a MonoBehaviour version if the project has committed to DOTS
- If no commitment exists, routes the MonoBehaviour-vs-DOTS decision to
unity-specialist(its named contact for overall Unity architecture), withtechnical-directoras the escalation for an unresolved technical conflict - Does not make the MonoBehaviour vs. DOTS decision unilaterally
Case 3: Burst-incompatible managed memory
Input: "This Burst job accesses a List<EnemyData> to find the nearest enemy."
Expected behavior:
- Flags
List<T>as a managed type that is incompatible with Burst compilation - Does NOT approve the Burst job with managed memory access
- Provides the correct replacement:
NativeArray<EnemyData>,NativeList<EnemyData>, orNativeHashMap<>depending on the use case - Notes that the native container must be disposed, with the allocator chosen by lifetime (
Allocator.TempJobfor frame-scoped,Allocator.Persistentfor long-lived) and capacity pre-allocated when the size is known - Produces the corrected job using unmanaged native containers
Case 4: Hybrid access — DOTS system needs MonoBehaviour data
Input: "The DOTS movement system needs to read the camera transform managed by a MonoBehaviour CameraController." Expected behavior:
- Identifies this as a hybrid access scenario
- Does NOT put the
Transformor the MonoBehaviour itself into a component — components hold no references to managed objects - Carries the camera data across the boundary as unmanaged values (
Unity.Mathematicstypes) in anIComponentData, written at one explicit hand-off point on the MonoBehaviour side and read by the system — not reached for per entity - Does NOT access the MonoBehaviour from inside a Burst job — flags managed access in Burst code as a compile error
Case 5: Context pass — performance targets
Input: Technical preferences from context: 60fps target, max 2ms CPU script budget per frame. Request: "Design the ECS chunk layout for 10,000 enemy entities." Expected behavior:
- References the 2ms CPU budget explicitly in the design rationale
- Designs the
IComponentDatachunk layout for cache efficiency:- Splits components by system access pattern, not by game concept — no "god component"
- Keeps hot components small, with rarely-used data in separate components
- Uses tag components for filtering, avoids
ISharedComponentDatathat would fragment archetypes, and usesIEnableableComponentinstead of structural changes for toggled state
- Names how the budget will be verified — Entities Profiler system timings and per-archetype memory — instead of presenting unmeasured timings as fact
- Does NOT design a layout that will obviously exceed the stated 2ms budget without flagging it
Protocol Compliance
- Stays within declared domain (ECS, Jobs, Burst, DOTS gameplay systems)
- Redirects MonoBehaviour-only gameplay to gameplay-programmer
- Returns structured output (IComponentData structs, ISystem implementations,
Baker<T>authoring classes) - Flags managed memory access in Burst jobs as a compile error and provides unmanaged alternatives
- Provides hybrid access patterns when DOTS systems need to interact with MonoBehaviour systems
- Designs chunk layouts against provided performance budgets, and names the profiling step that verifies them
- Asks "May I write this to [filepath]?" naming the file before writing
Coverage Notes
- ECS conversion (Case 1) must include a unit test using the ECS test framework (
World,EntityManager) underAssets/Tests/EditMode/ - Burst incompatibility (Case 3) is safety-critical — the agent must catch this before the code is written
- Chunk layout (Case 5) verifies the agent designs against a stated budget and says how it will be measured, rather than asserting unmeasured numbers