[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KH4FGRQ9AP2ND5H5HX4D83":3,"skill-same:01M6KH4FGRQ9AP2ND5H5HX4D83":66},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6KH4FGRQ9AP2ND5H5HX4D83","dots-event-driven-ecs",null,"Model one-frame events and external requests in ECS without dual ownership, polling, or persistent state leaks. Covers request-tag pattern with ECB, enableable command components (no structural change), event buffers (IBufferElementData), explicit consumer ownership, one-frame latency rules, and the banned C# event \u002F UnityEvent \u002F static bus anti-patterns. Use when input\u002FUI\u002Fnetwork must trigger ECS work, when a one-frame signal fans out to N consumers (damage, hit, collision), or when state changes must be processed exactly once.","dyCuong03\u002Funity-agent-team","dyCuong03","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F137050365?v=4","01M6KFXC85HQHXZJC2VC1KY6EZ","CuongND","01M6KFXCCHP6CD5MTA8NECJC36",8,"MIT","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-event-driven-ecs\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"dots event driven ecs","event driven","event","ecs","driven","pattern","request","static","events","input","structural","components","patterns","anti-patterns","command","work","model","network","ui","change","2026-11-10 10:12:30",false,"---\nname: dots-event-driven-ecs\ndescription: Model one-frame events and external requests in ECS without dual ownership, polling, or persistent state leaks. Covers request-tag pattern with ECB, enableable command components (no structural change), event buffers (IBufferElementData), explicit consumer ownership, one-frame latency rules, and the banned C# event \u002F UnityEvent \u002F static bus anti-patterns. Use when input\u002FUI\u002Fnetwork must trigger ECS work, when a one-frame signal fans out to N consumers (damage, hit, collision), or when state changes must be processed exactly once.\n---\n\n# Event-Driven ECS — Senior Patterns\n\nThere is no event bus in Entities 1.x. There never will be. Senior teams encode events as **data** with explicit lifetime and explicit consumer ownership — request entities, enableable command components, and event buffers. Anything else (`Action`, `UnityEvent`, static collections) is a managed-world anti-pattern that breaks Burst, breaks determinism, and breaks replays.\n\n## Intent\n\nMake one-shot signals first-class data. Every event has a producer system, a known lifetime, exactly one named consumer (or an explicit broadcast contract), and a guaranteed clearing point.\n\n## Three event shapes (pick by lifetime + cardinality)\n\n| Shape | Lifetime | Cardinality | Cost |\n|---|---|---|---|\n| **Request entity** (transient `Entity` carrying a request component, destroyed by consumer) | 1 frame | producer → 1 consumer | Structural change (use ECB) |\n| **Enableable command component** (per-entity enabled bit) | 1 frame typically; can persist | 1 entity → 1 consumer that watches the enabled-set | **Zero structural change** (preferred for hot paths) |\n| **Event buffer** (`DynamicBuffer\u003CT>` on a known entity, cleared by a late-phase system) | 1 frame, broadcast | 1 producer → N readers | Allocation per frame; broadcast model |\n\n## Senior pattern — request entity (one-shot, simple)\n\n```csharp\npublic struct DamageRequest : IComponentData\n{\n    public Entity Target;\n    public float  Amount;\n}\n\n\u002F\u002F Producer (e.g. collision system): record request, ECB plays back.\npublic partial struct CollisionDamageSystem : ISystem\n{\n    public void OnCreate(ref SystemState state)\n        => state.RequireForUpdate\u003CEndSimulationEntityCommandBufferSystem.Singleton>();\n\n    public void OnUpdate(ref SystemState state)\n    {\n        var ecb = SystemAPI.GetSingleton\u003CEndSimulationEntityCommandBufferSystem.Singleton>()\n                           .CreateCommandBuffer(state.WorldUnmanaged);\n\n        \u002F\u002F On collision detection...\n        var req = ecb.CreateEntity();\n        ecb.AddComponent(req, new DamageRequest { Target = hitEntity, Amount = 10f });\n    }\n}\n\n\u002F\u002F Consumer: applies damage, destroys the request. EXACTLY ONE consumer.\npublic partial struct DamageApplySystem : ISystem\n{\n    public void OnCreate(ref SystemState state)\n    {\n        state.RequireForUpdate\u003CDamageRequest>();\n        state.RequireForUpdate\u003CBeginSimulationEntityCommandBufferSystem.Singleton>();\n    }\n\n    public void OnUpdate(ref SystemState state)\n    {\n        var ecb = SystemAPI.GetSingleton\u003CBeginSimulationEntityCommandBufferSystem.Singleton>()\n                           .CreateCommandBuffer(state.WorldUnmanaged);\n\n        foreach (var (req, entity) in\n                 SystemAPI.Query\u003CRefRO\u003CDamageRequest>>().WithEntityAccess())\n        {\n            if (SystemAPI.HasComponent\u003CHealthComponent>(req.ValueRO.Target))\n            {\n                var hpRef = SystemAPI.GetComponentRW\u003CHealthComponent>(req.ValueRO.Target);\n                hpRef.ValueRW.Current -= req.ValueRO.Amount;\n            }\n            ecb.DestroyEntity(entity); \u002F\u002F request consumed\n        }\n    }\n}\n```\n\n## Senior pattern — enableable command (hot-path, no structural change)\n\n```csharp\n\u002F\u002F Per-entity command flag — zero archetype churn.\npublic struct WantsRespawn : IComponentData, IEnableableComponent { }\n\n\u002F\u002F Producer: enables the bit when criteria met.\npublic partial struct RespawnTriggerSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        foreach (var (hp, respawnEnabled, _) in\n                 SystemAPI.Query\u003CRefRO\u003CHealthComponent>, EnabledRefRW\u003CWantsRespawn>>()\n                          .WithEntityAccess())\n        {\n            if (hp.ValueRO.Current \u003C= 0) respawnEnabled.ValueRW = true;\n        }\n    }\n}\n\n\u002F\u002F Consumer: processes only entities whose WantsRespawn is enabled (default query semantics).\npublic partial struct RespawnApplySystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        foreach (var (transform, respawnEnabled) in\n                 SystemAPI.Query\u003CRefRW\u003CLocalTransform>, EnabledRefRW\u003CWantsRespawn>>())\n        {\n            transform.ValueRW.Position = SpawnPoint;\n            respawnEnabled.ValueRW = false; \u002F\u002F clear the command\n        }\n    }\n}\n```\n\nThis is the preferred shape for any \"per-entity one-frame command\" — no ECB, no structural change. See `dots-enableable-components`.\n\n## Senior pattern — broadcast via event buffer\n\n```csharp\npublic struct CombatEvent : IBufferElementData\n{\n    public Entity Attacker;\n    public Entity Victim;\n    public float  Damage;\n}\n\n\u002F\u002F Producer writes to a buffer on a known singleton entity.\n\u002F\u002F Multiple readers consume; a dedicated cleanup system clears.\n\npublic partial struct CombatEventClearSystem : ISystem\n{\n    [UpdateInGroup(typeof(SimulationSystemGroup), OrderLast = true)]\n    public void OnUpdate(ref SystemState state)\n    {\n        var buf = SystemAPI.GetSingletonBuffer\u003CCombatEvent>();\n        buf.Clear();\n    }\n}\n```\n\n## Anti-patterns\n\n- ❌ `Action\u003CDamageEvent>` \u002F `UnityEvent` \u002F static `List\u003CEvent>` for ECS gameplay. Breaks Burst. Breaks determinism. Cannot exist inside `ISystem`. Refuse.\n- ❌ Boolean field on a persistent component used as a one-shot flag (`bool IsHit`). Will leak across frames because clearing it isn't enforced by the type system. Use `IEnableableComponent` instead.\n- ❌ Two systems consuming the same request component with no defined consumer ownership. They race to destroy the request; one may apply damage twice; one may apply zero times. If two systems must react to the same event, they consume different shapes or read from a shared buffer with `OrderLast` cleanup.\n- ❌ Creating request entities from a parallel job without ECB sort key (`[ChunkIndexInQuery]`). Non-deterministic event order — replay bug.\n- ❌ Leaving event entities undestroyed \"for debugging.\" They accumulate across frames; the next frame's consumer applies stale damage.\n- ❌ A buffer-based broadcast where the cleanup system is gated by `RequireForUpdate\u003CSomething>` that excludes the buffer's host entity. Cleanup never runs → unbounded buffer growth.\n\n## Failure modes\n\n| Symptom | Cause |\n|---|---|\n| Damage applied twice | Two consumer systems read the same `DamageRequest`; both processed before either destroyed |\n| Event silently dropped | Consumer in a group\u002Fphase that executes *before* producer this frame — see `dots-update-groups` |\n| Request entities accumulate forever | Consumer gated wrong, or producer side wasn't paired with a consumer |\n| Hit registers next frame for some entities, this frame for others | Mixed ECB phases — producer used `BeginSimulationECB`, sometimes `EndSimulationECB` |\n| Replays diverge | Parallel job recorded requests without `[ChunkIndexInQuery]` sort key |\n| Burst error on event field | Event component holds managed type (string, class); switch to `FixedString` \u002F blittable |\n\n## Runtime verification (Tester Verification Contract)\n\n- **Static:** for every `IComponentData` whose name ends in `Request` \u002F `Event` \u002F `Command`, grep for exactly one consumer system that destroys it (or for an `IEnableableComponent` request, one consumer that sets it false). Zero or >1 → reject.\n- **Runtime:** after one full frame of producing M events, the query count of un-consumed events must be exactly 0 (request entity pattern) or all bits must be cleared (enableable pattern). Run a soak test for 100 frames at peak event rate; assert no growth in event entity count.\n\n## Performance notes\n\n- Request-entity pattern costs M structural changes per M events (create + destroy). Batched via ECB it's tolerable up to a few thousand events\u002Fframe. Beyond that, switch to enableable.\n- Enableable pattern is essentially free per event (one bit flip). The cost is \"do you have a component on the entity?\" — if not, you pay one structural add at attachment time and never again.\n- Event buffers cost the buffer's chunk size + per-event element write. Clear cost is O(events). Buffer-singleton broadcast is the cheapest \"1→N\" pattern when N readers really need the same events.\n\n## Compile \u002F editor safety\n\n- `IBufferElementData` types must be blittable. No managed fields. Use `FixedString64Bytes` for inline strings.\n- Event components targeting Burst hot paths should be `[BurstCompile]`-friendly: no `UnityObjectRef\u003CT>` deref inside the producer\u002Fconsumer's job code (capture and pre-deref on main thread).\n\n## Entities version notes (1.4.x)\n\n- `IEnableableComponent` + `EnabledRefRW\u003CT>` — current; preferred shape for hot-path per-entity events.\n- `ECB.CreateEntity()` + `AddComponent` for request pattern — current.\n- C# `event` keyword \u002F `UnityEvent` \u002F `Action\u003CT>` — banned inside `ISystem`; not Burst-safe.\n- `EntityCommandBuffer.ParallelWriter.CreateEntity(sortKey)` requires `[ChunkIndexInQuery] int chunkIndex` parameter — see `dots-ecb-orchestration`.\n\n## See also\n- `dots-enableable-components` — the zero-archetype-churn implementation detail for command components\n- `dots-ecb-orchestration` — phase selection for parallel event creation\n- `dots-entity-lifecycle` — request entities need disciplined destroy; cleanup-component pattern if state must outlive the entity\n- `dots-update-groups` — producer-before-consumer ordering\n","# Event-Driven ECS — Senior Patterns\n\nThere is no event bus in Entities 1.x. There never will be. Senior teams encode events as **data** with explicit lifetime and explicit consumer ownership — request entities, enableable command components, and event buffers. Anything else (`Action`, `UnityEvent`, static collections) is a managed-world anti-pattern that breaks Burst, breaks determinism, and breaks replays.\n\n## Intent\n\nMake one-shot signals first-class data. Every event has a producer system, a known lifetime, exactly one named consumer (or an explicit broadcast contract), and a guaranteed clearing point.\n\n## Three event shapes (pick by lifetime + cardinality)\n\n| Shape | Lifetime | Cardinality | Cost |\n|---|---|---|---|\n| **Request entity** (transient `Entity` carrying a request component, destroyed by consumer) | 1 frame | producer → 1 consumer | Structural change (use ECB) |\n| **Enableable command component** (per-entity enabled bit) | 1 frame typically; can persist | 1 entity → 1 consumer that watches the enabled-set | **Zero structural change** (preferred for hot paths) |\n| **Event buffer** (`DynamicBuffer\u003CT>` on a known entity, cleared by a late-phase system) | 1 frame, broadcast | 1 producer → N readers | Allocation per frame; broadcast model |\n\n## Senior pattern — request entity (one-shot, simple)\n\n```csharp\npublic struct DamageRequest : IComponentData\n{\n    public Entity Target;\n    public float  Amount;\n}\n\n\u002F\u002F Producer (e.g. collision system): record request, ECB plays back.\npublic partial struct CollisionDamageSystem : ISystem\n{\n    public void OnCreate(ref SystemState state)\n        => state.RequireForUpdate\u003CEndSimulationEntityCommandBufferSystem.Singleton>();\n\n    public void OnUpdate(ref SystemState state)\n    {\n        var ecb = SystemAPI.GetSingleton\u003CEndSimulationEntityCommandBufferSystem.Singleton>()\n                           .CreateCommandBuffer(state.WorldUnmanaged);\n\n        \u002F\u002F On collision detection...\n        var req = ecb.CreateEntity();\n        ecb.AddComponent(req, new DamageRequest { Target = hitEntity, Amount = 10f });\n    }\n}\n\n\u002F\u002F Consumer: applies damage, destroys the request. EXACTLY ONE consumer.\npublic partial struct DamageApplySystem : ISystem\n{\n    public void OnCreate(ref SystemState state)\n    {\n        state.RequireForUpdate\u003CDamageRequest>();\n        state.RequireForUpdate\u003CBeginSimulationEntityCommandBufferSystem.Singleton>();\n    }\n\n    public void OnUpdate(ref SystemState state)\n    {\n        var ecb = SystemAPI.GetSingleton\u003CBeginSimulationEntityCommandBufferSystem.Singleton>()\n                           .CreateCommandBuffer(state.WorldUnmanaged);\n\n        foreach (var (req, entity) in\n                 SystemAPI.Query\u003CRefRO\u003CDamageRequest>>().WithEntityAccess())\n        {\n            if (SystemAPI.HasComponent\u003CHealthComponent>(req.ValueRO.Target))\n            {\n                var hpRef = SystemAPI.GetComponentRW\u003CHealthComponent>(req.ValueRO.Target);\n                hpRef.ValueRW.Current -= req.ValueRO.Amount;\n            }\n            ecb.DestroyEntity(entity); \u002F\u002F request consumed\n        }\n    }\n}\n```\n\n## Senior pattern — enableable command (hot-path, no structural change)\n\n```csharp\n\u002F\u002F Per-entity command flag — zero archetype churn.\npublic struct WantsRespawn : IComponentData, IEnableableComponent { }\n\n\u002F\u002F Producer: enables the bit when criteria met.\npublic partial struct RespawnTriggerSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        foreach (var (hp, respawnEnabled, _) in\n                 SystemAPI.Query\u003CRefRO\u003CHealthComponent>, EnabledRefRW\u003CWantsRespawn>>()\n                          .WithEntityAccess())\n        {\n            if (hp.ValueRO.Current \u003C= 0) respawnEnabled.ValueRW = true;\n        }\n    }\n}\n\n\u002F\u002F Consumer: processes only entities whose WantsRespawn is enabled (default query semantics).\npublic partial struct RespawnApplySystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        foreach (var (transform, respawnEnabled) in\n                 SystemAPI.Query\u003CRefRW\u003CLocalTransform>, EnabledRefRW\u003CWantsRespawn>>())\n        {\n            transform.ValueRW.Position = SpawnPoint;\n            respawnEnabled.ValueRW = false; \u002F\u002F clear the command\n        }\n    }\n}\n```\n\nThis is the preferred shape for any \"per-entity one-frame command\" — no ECB, no structural change. See `dots-enableable-components`.\n\n## Senior pattern — broadcast via event buffer\n\n```csharp\npublic struct CombatEvent : IBufferElementData\n{\n    public Entity Attacker;\n    public Entity Victim;\n    public float  Damage;\n}\n\n\u002F\u002F Producer writes to a buffer on a known singleton entity.\n\u002F\u002F Multiple readers consume; a dedicated cleanup system clears.\n\npublic partial struct CombatEventClearSystem : ISystem\n{\n    [UpdateInGroup(typeof(SimulationSystemGroup), OrderLast = true)]\n    public void OnUpdate(ref SystemState state)\n    {\n        var buf = SystemAPI.GetSingletonBuffer\u003CCombatEvent>();\n        buf.Clear();\n    }\n}\n```\n\n## Anti-patterns\n\n- ❌ `Action\u003CDamageEvent>` \u002F `UnityEvent` \u002F static `List\u003CEvent>` for ECS gameplay. Breaks Burst. Breaks determinism. Cannot exist inside `ISystem`. Refuse.\n- ❌ Boolean field on a persistent component used as a one-shot flag (`bool IsHit`). Will leak across frames because clearing it isn't enforced by the type system. Use `IEnableableComponent` instead.\n- ❌ Two systems consuming the same request component with no defined consumer ownership. They race to destroy the request; one may apply damage twice; one may apply zero times. If two systems must react to the same event, they consume different shapes or read from a shared buffer with `OrderLast` cleanup.\n- ❌ Creating request entities from a parallel job without ECB sort key (`[ChunkIndexInQuery]`). Non-deterministic event order — replay bug.\n- ❌ Leaving event entities undestroyed \"for debugging.\" They accumulate across frames; the next frame's consumer applies stale damage.\n- ❌ A buffer-based broadcast where the cleanup system is gated by `RequireForUpdate\u003CSomething>` that excludes the buffer's host entity. Cleanup never runs → unbounded buffer growth.\n\n## Failure modes\n\n| Symptom | Cause |\n|---|---|\n| Damage applied twice | Two consumer systems read the same `DamageRequest`; both processed before either destroyed |\n| Event silently dropped | Consumer in a group\u002Fphase that executes *before* producer this frame — see `dots-update-groups` |\n| Request entities accumulate forever | Consumer gated wrong, or producer side wasn't paired with a consumer |\n| Hit registers next frame for some entities, this frame for others | Mixed ECB phases — producer used `BeginSimulationECB`, sometimes `EndSimulationECB` |\n| Replays diverge | Parallel job recorded requests without `[ChunkIndexInQuery]` sort key |\n| Burst error on event field | Event component holds managed type (string, class); switch to `FixedString` \u002F blittable |\n\n## Runtime verification (Tester Verification Contract)\n\n- **Static:** for every `IComponentData` whose name ends in `Request` \u002F `Event` \u002F `Command`, grep for exactly one consumer system that destroys it (or for an `IEnableableComponent` request, one consumer that sets it false). Zero or >1 → reject.\n- **Runtime:** after one full frame of producing M events, the query count of un-consumed events must be exactly 0 (request entity pattern) or all bits must be cleared (enableable pattern). Run a soak test for 100 frames at peak event rate; assert no growth in event entity count.\n\n## Performance notes\n\n- Request-entity pattern costs M structural changes per M events (create + destroy). Batched via ECB it's tolerable up to a few thousand events\u002Fframe. Beyond that, switch to enableable.\n- Enableable pattern is essentially free per event (one bit flip). The cost is \"do you have a component on the entity?\" — if not, you pay one structural add at attachment time and never again.\n- Event buffers cost the buffer's chunk size + per-event element write. Clear cost is O(events). Buffer-singleton broadcast is the cheapest \"1→N\" pattern when N readers really need the same events.\n\n## Compile \u002F editor safety\n\n- `IBufferElementData` types must be blittable. No managed fields. Use `FixedString64Bytes` for inline strings.\n- Event components targeting Burst hot paths should be `[BurstCompile]`-friendly: no `UnityObjectRef\u003CT>` deref inside the producer\u002Fconsumer's job code (capture and pre-deref on main thread).\n\n## Entities version notes (1.4.x)\n\n- `IEnableableComponent` + `EnabledRefRW\u003CT>` — current; preferred shape for hot-path per-entity events.\n- `ECB.CreateEntity()` + `AddComponent` for request pattern — current.\n- C# `event` keyword \u002F `UnityEvent` \u002F `Action\u003CT>` — banned inside `ISystem`; not Burst-safe.\n- `EntityCommandBuffer.ParallelWriter.CreateEntity(sortKey)` requires `[ChunkIndexInQuery] int chunkIndex` parameter — see `dots-ecb-orchestration`.\n\n## See also\n- `dots-enableable-components` — the zero-archetype-churn implementation detail for command components\n- `dots-ecb-orchestration` — phase selection for parallel event creation\n- `dots-entity-lifecycle` — request entities need disciplined destroy; cleanup-component pattern if state must outlive the entity\n- `dots-update-groups` — producer-before-consumer ordering\n",{"name":5,"description":7},"main","fe4746b9f07e6c7c2b6d3932002183af9b9f6fa2","workspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-event-driven-ecs",0,"https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team","https:\u002F\u002Fgithub.com\u002FdyCuong03","Game developer","2026-07-25 22:22:25",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add dyCuong03\u002Funity-agent-team --skill dots-event-driven-ecs",{"tool":58,"command":59},"bunx","bunx skills add dyCuong03\u002Funity-agent-team --skill dots-event-driven-ecs",{"tool":61,"command":62},"pnpm","pnpm dlx skills add dyCuong03\u002Funity-agent-team --skill dots-event-driven-ecs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-event-driven-ecs\u002FSKILL.md",true,[],[67,90,110,135,155,188],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":39},"01M6KH55FFS00ET877QSMRYGX4","dots-update-groups","How to choose the right ECS system group and ordering so per-frame and per-fixed-step work is deterministic and never races its own readers. Covers InitializationSystemGroup \u002F SimulationSystemGroup \u002F PresentationSystemGroup \u002F FixedStepSimulationSystemGroup \u002F VariableRateSimulationSystemGroup, UpdateBefore \u002F UpdateAfter peer ordering, OrderFirst \u002F OrderLast group-boundary placement, RateManager, and the cross-group ordering trap. Use when adding an ISystem, fixing \"value visible one frame late\" bugs, or coupling simulation to a fixed timestep.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-update-groups\u002FSKILL.md",[],[74,75,76,77,78,79,80,34,81,82,83,84,85,86,22,87,88,89],"update","dots update groups","boundary","simulation","how","system","choose","use","never","peer","deterministic","how to","coupling","bugs","frame","value",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":39},"01M6KH50PWYEFQDCGYBZ0326F1","dots-transform-patterns","The Entities 1.x transform model — LocalTransform (writable input) vs LocalToWorld (system-owned matrix), Parent\u002FChild hierarchy, reparenting cost, uniform vs non-uniform scale (PostTransformMatrix), and when to opt out with custom transform systems. Use when designing parent\u002Fchild hierarchies, runtime reparenting (mount\u002Fdismount\u002Fsocket), or choosing transform components at the Baker boundary.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-transform-patterns\u002FSKILL.md",[],[31,97,98,30,76,79,99,35,81,100,101,102,28,103,104,105,106,107,108,109],"transform","dots transform patterns","mount","cost","runtime","systems","with","matrix","socket","at","child","custom","hierarchy",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":121,"publishedAt":39},"01M6KH4VW4MA14DQW4KQYPFT0S","dots-singleton-patterns","Model cross-system shared configuration and game state as a single-entity component with a strict single-writer contract. Covers RequireForUpdate gating, SystemAPI.GetSingleton \u002F GetSingletonRW \u002F HasSingleton \u002F TryGetSingleton, bake-time vs runtime-created vs ECB-system singletons, the \"exactly one entity\" runtime invariant, and the single-writer rule. Use when designing frame-stable global config, shared mutable state, or any component intended to exist on exactly one entity.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-singleton-patterns\u002FSKILL.md",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":119,"taxonomyTypeDesc":120},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[31,122,123,124,125,126,127,79,35,81,128,129,130,101,131,132,103,88,133,134],"singleton","dots singleton patterns","component","config","state","game","writer","time","shared","contract","as","ecb","gating",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":39},"01M6KH4PR076AYNDZHD63HHWX6","dots-hybrid-bridge","The one-way bridge between DOTS-owned runtime state and Unity-owned presentation. Covers UnityObjectRef for managed asset refs in components, the DOTS-writes \u002F Unity-reads ownership rule, when to use managed IComponentData vs UnityObjectRef vs CompanionComponent, baker-bridge vs runtime-bridge, and SubScene boundary rules. Use when an entity must reference Unity assets (Mesh, Material, AudioClip, ScriptableObject), a MonoBehaviour view must read entity state, or input\u002FUI must trigger ECS work.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-hybrid-bridge\u002FSKILL.md",[],[142,143,144,145,30,126,76,146,147,34,148,149,81,101,150,151,28,152,153,154],"bridge","hybrid","dots hybrid bridge","mesh","assets","Rules","read","view","trigger","unity","material","for","managed",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":172,"publishedAt":39},"01M6KH4BWRGCEBJ8PKCKCSGT33","valid_skill","A complete, well-formed test fixture skill for SkillHub validation testing. Covers basic task routing and code review for Unity projects.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fvalid_skill\u002FSKILL.md",[161,166,169],{"categoryNo":162,"categoryName":163,"taxonomyType":164,"taxonomyTypeDesc":165},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":167,"categoryName":168,"taxonomyType":164,"taxonomyTypeDesc":165},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":170,"categoryName":171,"taxonomyType":164,"taxonomyTypeDesc":165},"01JBSEEDCAT000000000000023","Skill与智能体开发",[173,174,175,176,177,178,179,180,181,182,183,184,185,186,151,187,153],"valid skill","valid","code review","testing","review","test","routing","code","validation","projects","fixture skill","task","fixture","basic","complete",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":194,"publishedAt":39},"01M6KH48R1VP1FPD07Y8RHD1QM","unsafe_commands","Skill fixture containing unsafe shell commands for security testing. Should be flagged by the validator.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Funsafe_commands\u002FSKILL.md",[],[195,196,197,176,198,199,185,200,201,153,202],"commands","unsafe","unsafe commands","security","shell","Security Testing","validator","skill fixture"]