# DOTS Desk > Audit the Unity DOTS (Entities, Jobs, Burst) code of one feature before it goes into a build - will it compile, will Burst accept it, will the safety checks throw, does it leak native memory - then fix it. The free check runs in the browser and uploads nothing: it lexes pasted C# (one or more files: components, ISystem or SystemBase systems, IJobEntity/IJob/IJobParallelFor/IJobFor/IJobChunk jobs, aspects, bakers), rebuilds its brace structure, classifies every type by what it implements, reads every field with its attributes, decides which methods Burst compiles, follows every job to its schedule call and JobHandle, every native allocation to its Dispose, every hand-made command buffer to its Playback and every structural change to where it happens, and runs 21 deterministic checks drawn from Entities 1.x practice. The paid audit rates Burst and the Entities API, jobs, structural changes and native memory, confirms or dismisses every flag and gives exact before/after edits per finding; the paid fix lane writes the whole fixed file(s) and a changes list tied to the flags. The page checks every quote and line against the paste, applies every edit and file back into the paste and re-runs its checks. App: https://dots-desk.skillsafe.ai/ API tutorial: https://dots-desk.skillsafe.ai/api.html ## Input - The code pasted into one box, each file introduced by a `// file: ` line; dropped .cs files or a dropped feature folder are joined that way automatically. A paste with no file line is read as one file named after its first type. - Nothing is compiled or run and no Unity is involved: every flag is a reading of the text, with the file and line it points at. Strings (verbatim and interpolated too), char literals, comments and preprocessor lines are lexed out first, so a string that mentions EntityManager.DestroyEntity is never a finding. - Other systems, the subscene, the package versions and the Player settings are outside the check (DK-22 says so); the Editor with Burst and safety checks on, the Burst Inspector and the Profiler stay the ground truth. ## Flags the free check raises - DK-01 (high): an IJobEntity or IAspect struct, an ISystem that uses SystemAPI or schedules an IJobEntity, or a SystemBase that uses SystemAPI or Entities.ForEach, not declared partial. - DK-02 (high): a managed field (string, array, List, Dictionary, a class, a UnityEngine object) in a struct IComponentData, IBufferElementData or job. - DK-03 (high): managed API in a Burst-compiled method - UnityEngine.Time, UnityEngine.Random, GameObject/Camera/Resources/Input, UnityEngine.Physics, GetComponent(), Object.Instantiate/Destroy, managed collections and arrays, ToString(), try/catch, strings and string concatenation in Debug.Log; also inside Entities.ForEach lambdas without WithoutBurst(). - DK-04 (medium): an ISystem OnUpdate or a job struct whose code is unmanaged but that carries no [BurstCompile]. - DK-05 (high): API removed in Entities 1.0 - Translation/Rotation/NonUniformScale, ComponentDataFromEntity, BufferFromEntity, GameObject conversion, [GenerateAuthoringComponent], RequireSingletonForUpdate. - DK-06 (high): SystemAPI in a job, an aspect, a MonoBehaviour or a helper type, or inside an Entities.ForEach lambda. - DK-07 (high): a Schedule/ScheduleParallel call whose returned JobHandle is discarded (an IJobEntity scheduled with no arguments chains state.Dependency itself and is exempt). - DK-08 (high): a native container disposed with Dispose() after a job using it is scheduled and before it is completed. - DK-09 (high): EntityManager in a job, a plain EntityCommandBuffer in a job scheduled in parallel, or a ComponentLookup/BufferLookup written in a parallel job without [NativeDisableParallelForRestriction]. - DK-10 (medium): a constant sort key passed to an EntityCommandBuffer.ParallelWriter. - DK-11 (high): a ComponentLookup, BufferLookup or type handle stored on a system and never Update()d outside OnCreate. - DK-12 (high in a parallel job, medium otherwise): a native container or lookup a job only reads, without [ReadOnly]. - DK-13 (medium): Complete() on a job's handle (or on state.Dependency) right after scheduling it. - DK-14 (high): an EntityManager structural change (Instantiate, CreateEntity, DestroyEntity, AddComponent, RemoveComponent, SetSharedComponent ...) inside a SystemAPI.Query foreach or an Entities.ForEach without WithStructuralChanges(). - DK-15 (high or medium): a new EntityCommandBuffer never played back, or played back and never disposed. - DK-16 (low): a tag component that the systems both add and remove at run time (archetype churn) instead of an IEnableableComponent. - DK-17 (medium): GetSingleton / GetSingletonRW / GetSingletonEntity of a type the system does not RequireForUpdate and does not guard. - DK-18 (medium): a TempJob or Persistent allocation (local or system field) never disposed. - DK-19 (high): an Allocator.Temp container passed to a scheduled job. - DK-20 (high): Unity.Mathematics.Random created with seed 0 or with no seed. - DK-21 (low): an IAspect (obsolete as of Entities 1.3), or a SystemBase using Entities.ForEach / Job.WithCode. - DK-22 (info): context - counts, and what is outside the check. ## Free extras - Every system with its Burst status, RequireForUpdate types, singletons read and the jobs it schedules with where each JobHandle goes; every job with its interface, Burst status and how it is scheduled; every native allocation with its allocator, whether it is disposed and which job fields it is passed to; every structural change and hand-made command buffer; every type with its role and fields. - Put any audit finding (or all of them, or the fixed files) back into the paste and re-run the check; undo puts the original back. - Exports: the check as Markdown, the flags as CSV, the edited or fixed code, the findings or changes as CSV, the whole result as JSON. ## Paid lanes (the `task` field) - `audit`: `{task, verdict: blocked|needs_work|ready, headline, feature, areas: [{area: burst|jobs|structural|memory, status: sound|fragile|broken, note}], findings: [{id, flags, file, line, severity, area, title, evidence, why, edits: [{before, after}]}], flag_answers: [{flag, status: confirmed|dismissed, reason}], plan, questions, summary}`. `before` is an exact slice of the file, applied in order. - `fix`: `{task, verdict: fixed|partial, headline, files: [{path, content}], changes: [{file, function, flags, change, why}], verify, open: [{item, flags, reason}], questions, summary}`. `content` is the whole file; every type and method keeps its name. - Run input: `{task, code, facts, note?, audit_handoff?, retry_note?}` - all strings; `facts` is the page's analysis as a JSON string. The audit hands its findings to the fix lane with every edit applied to `code`. - Model: gpt-terra, 10% publisher markup. A run needs a signed-in account; the reservation shown before a run is a hold, and only what the run uses is charged. ## Sources - unity-ecs-patterns by Seth Hobson, wshobson/agents (github.com/wshobson/agents, plugins/game-development/skills/unity-ecs-patterns), MIT - https://skillsafe.ai/skill/@wshobson/unity-ecs-patterns - The checks and the reconciliation are original to this app. Unity, Burst and DOTS are trademarks or products of Unity Technologies; this app is not affiliated with or endorsed by Unity Technologies.