[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KH4PR076AYNDZHD63HHWX6":3,"skill-same:01M6KH4PR076AYNDZHD63HHWX6":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},"01M6KH4PR076AYNDZHD63HHWX6","dots-hybrid-bridge",null,"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.","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-hybrid-bridge\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"dots hybrid bridge","hybrid","bridge","use","managed","for","material","input","unity","trigger","runtime","mesh","view","read","work","Rules","assets","boundary","state","components","2026-11-10 10:12:30",false,"---\nname: dots-hybrid-bridge\ndescription: 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.\n---\n\n# Hybrid Bridge — Senior Patterns\n\nThe bridge between Unity's GameObject world and DOTS' entity world is the highest-bug-density area in any production project. The rule is brutally simple: **DOTS owns the runtime truth; Unity reads it. Never the reverse for gameplay state.** Everything else is a footnote on how to honor that rule efficiently.\n\n## Intent\n\nCross the GO↔Entity boundary deliberately, one-way, with explicit ownership of which side writes and which side reads.\n\n## Three bridge pathways\n\n| Pathway | What it carries | When |\n|---|---|---|\n| **`UnityObjectRef\u003CT>`** in `IComponentData` | Reference to a Unity asset (Mesh, Material, AudioClip, Prefab, ScriptableObject) | Default for asset refs. Burst-friendly to **hold**; deref needs main thread. |\n| **Managed `class : IComponentData`** | Holds a GameObject \u002F MonoBehaviour reference for a hybrid entity | Last resort. Forces non-Burst. Costs GC. Use only when CompanionComponent isn't enough. |\n| **Companion GameObject** (Entities Graphics) | A real GameObject parented to an entity transform for editor visualization | Almost always a debugging\u002Fvisualization crutch, not architecture. |\n\nFor Unity→DOTS communication (input, UI button → game state), use the **event-driven** pathway from `dots-event-driven-ecs`, not direct entity component writes.\n\n## Senior pattern — `UnityObjectRef\u003CT>` (the default)\n\n```csharp\npublic struct WeaponVisual : IComponentData\n{\n    public UnityObjectRef\u003CMesh>     Mesh;\n    public UnityObjectRef\u003CMaterial> Material;\n    public UnityObjectRef\u003CAudioClip> FireSound;\n}\n\npublic class WeaponAuthoring : MonoBehaviour\n{\n    public Mesh     Mesh;\n    public Material Material;\n    public AudioClip FireSound;\n\n    class Baker : Baker\u003CWeaponAuthoring>\n    {\n        public override void Bake(WeaponAuthoring authoring)\n        {\n            \u002F\u002F DependsOn so the baker re-runs if the asset changes (see dots-baking-patterns).\n            DependsOn(authoring.Mesh);\n            DependsOn(authoring.Material);\n\n            var e = GetEntity(TransformUsageFlags.Dynamic);\n            AddComponent(e, new WeaponVisual {\n                Mesh      = new UnityObjectRef\u003CMesh>     { Value = authoring.Mesh },\n                Material  = new UnityObjectRef\u003CMaterial> { Value = authoring.Material },\n                FireSound = new UnityObjectRef\u003CAudioClip>{ Value = authoring.FireSound },\n            });\n        }\n    }\n}\n\n\u002F\u002F Read on main thread (deref forces main thread).\npublic partial struct WeaponFireSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        foreach (var (visual, _) in SystemAPI.Query\u003CRefRO\u003CWeaponVisual>, RefRO\u003CFireRequest>>())\n        {\n            \u002F\u002F .Value performs main-thread deref. Inside a job, you must pass the\n            \u002F\u002F UnityObjectRef value AND deref on main thread before the job runs.\n            AudioSource.PlayClipAtPoint(visual.ValueRO.FireSound.Value, Vector3.zero);\n        }\n    }\n}\n```\n\n## Senior pattern — Unity reads entity state (HUD, minimap)\n\n```csharp\n\u002F\u002F MonoBehaviour-side. Cache the entity manager once; query main-thread.\npublic class HealthBarBinding : MonoBehaviour\n{\n    public Image Fill;\n    Entity _entity;\n    EntityManager _em;\n\n    void Start() {\n        _em = World.DefaultGameObjectInjectionWorld.EntityManager;\n        \u002F\u002F Acquire _entity via baking lookup or registration system.\n    }\n\n    void LateUpdate()  \u002F\u002F AFTER PresentationSystemGroup\n    {\n        if (!_em.Exists(_entity)) return;\n        if (!_em.HasComponent\u003CHealthComponent>(_entity)) return;\n        var hp = _em.GetComponentData\u003CHealthComponent>(_entity);\n        Fill.fillAmount = hp.Current \u002F (float)hp.Max;\n    }\n\n    \u002F\u002F DO NOT call _em.SetComponentData\u003CHealthComponent>(...) from here.\n    \u002F\u002F That would be Unity writing gameplay state — a dual-ownership defect.\n}\n```\n\n## Senior pattern — Unity triggers ECS work (input)\n\nDon't write into gameplay components from MonoBehaviours. Append a **request**:\n\n```csharp\n\u002F\u002F MonoBehaviour input system reads the keyboard, creates a request entity.\nvoid Update()\n{\n    if (Input.GetKeyDown(KeyCode.Space))\n    {\n        var em = World.DefaultGameObjectInjectionWorld.EntityManager;\n        var req = em.CreateEntity();\n        em.AddComponentData(req, new JumpRequest { Player = _localPlayerEntity });\n    }\n}\n\n\u002F\u002F ECS-side consumer (see dots-event-driven-ecs for the full pattern).\n```\n\n## Anti-patterns\n\n- ❌ Caching a raw `Mesh` \u002F `Material` reference in a `class : IComponentData`. Breaks Burst on the component, breaks domain reload, breaks serialization. Use `UnityObjectRef\u003CT>`.\n- ❌ `MonoBehaviour` calling `EntityManager.SetComponentData\u003CHP>(...)` for gameplay state. **Dual ownership.** Escalate in review.\n- ❌ Per-frame `World.DefaultGameObjectInjectionWorld.EntityManager` lookup from `Update()` on dozens of MonoBehaviours. Each is a main-thread sync point. Cache `EntityManager` once.\n- ❌ Bidirectional binding: UI writes to ECS, ECS writes back to UI, both inside the same frame. Race; values diverge. The bridge is **one-way**.\n- ❌ `IConvertGameObjectToEntity` \u002F `ConvertToEntity` MonoBehaviours. **Removed in 1.x.** Bakers only.\n- ❌ Adding entity components outside the Baker for entities that live in a baked subscene. They get **wiped on subscene rebake**.\n\n## Failure modes\n\n| Symptom | Cause |\n|---|---|\n| Material\u002Fmesh ref null after domain reload | Stored as raw managed ref instead of `UnityObjectRef\u003CT>` |\n| UI bar lags one frame behind state | MonoBehaviour reads in `Update()` before DOTS writer in `PresentationSystemGroup` finishes — move to `LateUpdate` or read `LocalToWorld`-equivalent late-frame output |\n| HP value sometimes resets to spawn value | A MonoBehaviour also writes HP; two writers; the order resolved at runtime \"wins\" |\n| `InvalidOperationException: Entity does not exist` in `LateUpdate` | MonoBehaviour holds an entity ref across destruction; missing `EntityManager.Exists` check |\n| Editor \"subscene out of date\" warning, then your custom components disappear | Components added outside the Baker — rebake wipes them |\n| Burst-time crash inside a job using `UnityObjectRef.Value` | `.Value` deref isn't job-safe; capture the ref value into the job, deref on main thread |\n\n## Runtime verification (Tester Verification Contract)\n\n- **Static:** grep for `class : IComponentData` — every match needs review; preferred replacement is `UnityObjectRef\u003CT>` for asset refs. Grep for `IConvertGameObjectToEntity` \u002F `ConvertToEntity` — refuse.\n- **Runtime:** for each hybrid-bridge feature, identify the writer side and reader side. Assert the reader never writes by inspecting the diff of one full frame — writer-side fields must only change in the writer's frame phase.\n\n## Performance notes\n\n- `UnityObjectRef\u003CT>` is a value type wrapping an instance ID. Holding it is free. Deref is a managed-side lookup — main thread only.\n- Per-frame `EntityManager.GetComponentData` from a MonoBehaviour is a sync point. For >10 MonoBehaviours doing this, batch via a dedicated bridge system that writes a `NativeArray` MonoBehaviours can read.\n- Companion GameObjects double the cost (entity transform + GO transform). Acceptable in editor visualization, banned in shipping hot paths.\n\n## Compile \u002F editor safety\n\n- `UnityObjectRef\u003CT>` requires `T : Object` (UnityEngine.Object) — won't compile for pure C# types.\n- Managed `class : IComponentData` requires `using Unity.Entities;` and you must guard `#if !UNITY_DISABLE_MANAGED_COMPONENTS` for projects that disable managed components.\n- `SubScene` baking is destructive — agents must NOT instruct users to \"just AddComponent after baking\" inside a subscene boundary.\n\n## Entities version notes (1.4.x)\n\n- `UnityObjectRef\u003CT>` — current. Replaces 0.x raw managed asset refs.\n- `IConvertGameObjectToEntity` \u002F `ConvertToEntity` — **gone**. Bakers (`Baker\u003CTAuthoring>`) only.\n- `class : IComponentData` (managed components) — still supported; gate with `UNITY_DISABLE_MANAGED_COMPONENTS` for builds that disable them.\n- `EntityManager.AddComponentObject(entity, monoBehaviour)` — still the way to attach a MonoBehaviour to an entity for editor companion display.\n\n## See also\n- `dots-baking-patterns` — `TransformUsageFlags`, `DependsOn`, the baker-side of the bridge\n- `dots-event-driven-ecs` — Unity→DOTS via request entities, not direct writes\n- `dots-singleton-patterns` — a \"global ScriptableObject config\" becomes a baked singleton with `UnityObjectRef`-typed fields\n","# Hybrid Bridge — Senior Patterns\n\nThe bridge between Unity's GameObject world and DOTS' entity world is the highest-bug-density area in any production project. The rule is brutally simple: **DOTS owns the runtime truth; Unity reads it. Never the reverse for gameplay state.** Everything else is a footnote on how to honor that rule efficiently.\n\n## Intent\n\nCross the GO↔Entity boundary deliberately, one-way, with explicit ownership of which side writes and which side reads.\n\n## Three bridge pathways\n\n| Pathway | What it carries | When |\n|---|---|---|\n| **`UnityObjectRef\u003CT>`** in `IComponentData` | Reference to a Unity asset (Mesh, Material, AudioClip, Prefab, ScriptableObject) | Default for asset refs. Burst-friendly to **hold**; deref needs main thread. |\n| **Managed `class : IComponentData`** | Holds a GameObject \u002F MonoBehaviour reference for a hybrid entity | Last resort. Forces non-Burst. Costs GC. Use only when CompanionComponent isn't enough. |\n| **Companion GameObject** (Entities Graphics) | A real GameObject parented to an entity transform for editor visualization | Almost always a debugging\u002Fvisualization crutch, not architecture. |\n\nFor Unity→DOTS communication (input, UI button → game state), use the **event-driven** pathway from `dots-event-driven-ecs`, not direct entity component writes.\n\n## Senior pattern — `UnityObjectRef\u003CT>` (the default)\n\n```csharp\npublic struct WeaponVisual : IComponentData\n{\n    public UnityObjectRef\u003CMesh>     Mesh;\n    public UnityObjectRef\u003CMaterial> Material;\n    public UnityObjectRef\u003CAudioClip> FireSound;\n}\n\npublic class WeaponAuthoring : MonoBehaviour\n{\n    public Mesh     Mesh;\n    public Material Material;\n    public AudioClip FireSound;\n\n    class Baker : Baker\u003CWeaponAuthoring>\n    {\n        public override void Bake(WeaponAuthoring authoring)\n        {\n            \u002F\u002F DependsOn so the baker re-runs if the asset changes (see dots-baking-patterns).\n            DependsOn(authoring.Mesh);\n            DependsOn(authoring.Material);\n\n            var e = GetEntity(TransformUsageFlags.Dynamic);\n            AddComponent(e, new WeaponVisual {\n                Mesh      = new UnityObjectRef\u003CMesh>     { Value = authoring.Mesh },\n                Material  = new UnityObjectRef\u003CMaterial> { Value = authoring.Material },\n                FireSound = new UnityObjectRef\u003CAudioClip>{ Value = authoring.FireSound },\n            });\n        }\n    }\n}\n\n\u002F\u002F Read on main thread (deref forces main thread).\npublic partial struct WeaponFireSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        foreach (var (visual, _) in SystemAPI.Query\u003CRefRO\u003CWeaponVisual>, RefRO\u003CFireRequest>>())\n        {\n            \u002F\u002F .Value performs main-thread deref. Inside a job, you must pass the\n            \u002F\u002F UnityObjectRef value AND deref on main thread before the job runs.\n            AudioSource.PlayClipAtPoint(visual.ValueRO.FireSound.Value, Vector3.zero);\n        }\n    }\n}\n```\n\n## Senior pattern — Unity reads entity state (HUD, minimap)\n\n```csharp\n\u002F\u002F MonoBehaviour-side. Cache the entity manager once; query main-thread.\npublic class HealthBarBinding : MonoBehaviour\n{\n    public Image Fill;\n    Entity _entity;\n    EntityManager _em;\n\n    void Start() {\n        _em = World.DefaultGameObjectInjectionWorld.EntityManager;\n        \u002F\u002F Acquire _entity via baking lookup or registration system.\n    }\n\n    void LateUpdate()  \u002F\u002F AFTER PresentationSystemGroup\n    {\n        if (!_em.Exists(_entity)) return;\n        if (!_em.HasComponent\u003CHealthComponent>(_entity)) return;\n        var hp = _em.GetComponentData\u003CHealthComponent>(_entity);\n        Fill.fillAmount = hp.Current \u002F (float)hp.Max;\n    }\n\n    \u002F\u002F DO NOT call _em.SetComponentData\u003CHealthComponent>(...) from here.\n    \u002F\u002F That would be Unity writing gameplay state — a dual-ownership defect.\n}\n```\n\n## Senior pattern — Unity triggers ECS work (input)\n\nDon't write into gameplay components from MonoBehaviours. Append a **request**:\n\n```csharp\n\u002F\u002F MonoBehaviour input system reads the keyboard, creates a request entity.\nvoid Update()\n{\n    if (Input.GetKeyDown(KeyCode.Space))\n    {\n        var em = World.DefaultGameObjectInjectionWorld.EntityManager;\n        var req = em.CreateEntity();\n        em.AddComponentData(req, new JumpRequest { Player = _localPlayerEntity });\n    }\n}\n\n\u002F\u002F ECS-side consumer (see dots-event-driven-ecs for the full pattern).\n```\n\n## Anti-patterns\n\n- ❌ Caching a raw `Mesh` \u002F `Material` reference in a `class : IComponentData`. Breaks Burst on the component, breaks domain reload, breaks serialization. Use `UnityObjectRef\u003CT>`.\n- ❌ `MonoBehaviour` calling `EntityManager.SetComponentData\u003CHP>(...)` for gameplay state. **Dual ownership.** Escalate in review.\n- ❌ Per-frame `World.DefaultGameObjectInjectionWorld.EntityManager` lookup from `Update()` on dozens of MonoBehaviours. Each is a main-thread sync point. Cache `EntityManager` once.\n- ❌ Bidirectional binding: UI writes to ECS, ECS writes back to UI, both inside the same frame. Race; values diverge. The bridge is **one-way**.\n- ❌ `IConvertGameObjectToEntity` \u002F `ConvertToEntity` MonoBehaviours. **Removed in 1.x.** Bakers only.\n- ❌ Adding entity components outside the Baker for entities that live in a baked subscene. They get **wiped on subscene rebake**.\n\n## Failure modes\n\n| Symptom | Cause |\n|---|---|\n| Material\u002Fmesh ref null after domain reload | Stored as raw managed ref instead of `UnityObjectRef\u003CT>` |\n| UI bar lags one frame behind state | MonoBehaviour reads in `Update()` before DOTS writer in `PresentationSystemGroup` finishes — move to `LateUpdate` or read `LocalToWorld`-equivalent late-frame output |\n| HP value sometimes resets to spawn value | A MonoBehaviour also writes HP; two writers; the order resolved at runtime \"wins\" |\n| `InvalidOperationException: Entity does not exist` in `LateUpdate` | MonoBehaviour holds an entity ref across destruction; missing `EntityManager.Exists` check |\n| Editor \"subscene out of date\" warning, then your custom components disappear | Components added outside the Baker — rebake wipes them |\n| Burst-time crash inside a job using `UnityObjectRef.Value` | `.Value` deref isn't job-safe; capture the ref value into the job, deref on main thread |\n\n## Runtime verification (Tester Verification Contract)\n\n- **Static:** grep for `class : IComponentData` — every match needs review; preferred replacement is `UnityObjectRef\u003CT>` for asset refs. Grep for `IConvertGameObjectToEntity` \u002F `ConvertToEntity` — refuse.\n- **Runtime:** for each hybrid-bridge feature, identify the writer side and reader side. Assert the reader never writes by inspecting the diff of one full frame — writer-side fields must only change in the writer's frame phase.\n\n## Performance notes\n\n- `UnityObjectRef\u003CT>` is a value type wrapping an instance ID. Holding it is free. Deref is a managed-side lookup — main thread only.\n- Per-frame `EntityManager.GetComponentData` from a MonoBehaviour is a sync point. For >10 MonoBehaviours doing this, batch via a dedicated bridge system that writes a `NativeArray` MonoBehaviours can read.\n- Companion GameObjects double the cost (entity transform + GO transform). Acceptable in editor visualization, banned in shipping hot paths.\n\n## Compile \u002F editor safety\n\n- `UnityObjectRef\u003CT>` requires `T : Object` (UnityEngine.Object) — won't compile for pure C# types.\n- Managed `class : IComponentData` requires `using Unity.Entities;` and you must guard `#if !UNITY_DISABLE_MANAGED_COMPONENTS` for projects that disable managed components.\n- `SubScene` baking is destructive — agents must NOT instruct users to \"just AddComponent after baking\" inside a subscene boundary.\n\n## Entities version notes (1.4.x)\n\n- `UnityObjectRef\u003CT>` — current. Replaces 0.x raw managed asset refs.\n- `IConvertGameObjectToEntity` \u002F `ConvertToEntity` — **gone**. Bakers (`Baker\u003CTAuthoring>`) only.\n- `class : IComponentData` (managed components) — still supported; gate with `UNITY_DISABLE_MANAGED_COMPONENTS` for builds that disable them.\n- `EntityManager.AddComponentObject(entity, monoBehaviour)` — still the way to attach a MonoBehaviour to an entity for editor companion display.\n\n## See also\n- `dots-baking-patterns` — `TransformUsageFlags`, `DependsOn`, the baker-side of the bridge\n- `dots-event-driven-ecs` — Unity→DOTS via request entities, not direct writes\n- `dots-singleton-patterns` — a \"global ScriptableObject config\" becomes a baked singleton with `UnityObjectRef`-typed fields\n",{"name":5,"description":7},"main","fe4746b9f07e6c7c2b6d3932002183af9b9f6fa2","workspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-hybrid-bridge",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-hybrid-bridge",{"tool":58,"command":59},"bunx","bunx skills add dyCuong03\u002Funity-agent-team --skill dots-hybrid-bridge",{"tool":61,"command":62},"pnpm","pnpm dlx skills add dyCuong03\u002Funity-agent-team --skill dots-hybrid-bridge","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-hybrid-bridge\u002FSKILL.md",true,[],[67,89,110,134,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,36,76,77,78,79,33,22,80,81,82,83,84,85,86,87,88],"update","dots update groups","simulation","how","system","choose","never","peer","deterministic","how to","coupling","ecs","bugs","frame","value",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"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",[],[96,97,98,38,36,78,99,100,22,101,29,102,26,103,104,105,106,107,108,109],"patterns","transform","dots transform patterns","mount","model","cost","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","适用职业",[96,122,123,124,125,37,126,78,100,22,127,128,129,29,130,131,103,87,132,133],"singleton","dots singleton patterns","component","config","game","writer","time","shared","contract","as","ecb","gating",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":39},"01M6KH4FGRQ9AP2ND5H5HX4D83","dots-event-driven-ecs","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.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-event-driven-ecs\u002FSKILL.md",[],[141,142,85,143,144,38,145,146,147,100,33,148,149,96,150,151,26,152,153,154],"event driven","driven","event","dots event driven ecs","change","ui","network","command","anti-patterns","pattern","structural","events","static","request",{"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,27,187,24],"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,24,202],"commands","unsafe","unsafe commands","security","shell","Security Testing","validator","skill fixture"]