[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KGFWQ062NKBWRBWRKY6HS4":3,"skill-same:01M6KGFWQ062NKBWRBWRKY6HS4":65},{"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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":64},"01M6KGFWQ062NKBWRBWRKY6HS4","wave8-ecb-system-group-mismatch",null,"Identify and fix bugs caused by using an ECB from the wrong system group, resulting in structural change commands executing at the wrong frame boundary.","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\u002F.claude\u002Fskills\u002Funity-dots\u002Fwave8-ecb-system-group-mismatch\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"system","ecb","wave8 ecb system group mismatch","change","debug","boundary","fix","commands","structural","fix bugs","true","at","bugs","frame","Wrong","antipattern","2026-11-10 10:12:30",false,"﻿---\nname: wave8-ecb-system-group-mismatch\ndescription: Identify and fix bugs caused by using an ECB from the wrong system group, resulting in structural change commands executing at the wrong frame boundary.\ntags: [ecb, antipattern, debug]\nmetadata:\n  internal-only: true\n  tier: 3\n---\n\n# ECB System Group Mismatch — Wrong Playback Timing\n\n## Intent\nIdentify and fix bugs caused by using an ECB from the wrong system group, resulting in structural change commands executing at the wrong frame boundary.\n\n## Use When\n- Diagnosing one-frame-late structural changes, components appearing\u002Fdisappearing unexpectedly, or ECB playback order bugs\n- Code review of any system that records ECB commands to an ECBSystem singleton\n\n## Avoid When\n- Using a manually created ECB with explicit Playback — group mismatch only affects ECBSystem-owned buffers, not manual ECBs\n\n## Senior Pattern\n```csharp\n\u002F\u002F WRONG — EndSimulationECBSystem from within FixedStepSimulationSystemGroup:\n\u002F\u002F Commands play back after SimulationSystemGroup ends (variable rate), not after FixedStep ends\n[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]\npublic partial struct FixedPhysicsReactionSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        \u002F\u002F Wrong ECB system — playback happens at wrong frame boundary:\n        var ecbSystem = SystemAPI.GetSingleton\u003CEndSimulationEntityCommandBufferSystem.Singleton>();\n        var ecb = ecbSystem.CreateCommandBuffer(state.WorldUnmanaged);\n    }\n}\n\n\u002F\u002F CORRECT — use the ECB system matching the enclosing group:\n[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]\npublic partial struct FixedPhysicsReactionSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        var ecbSystem = SystemAPI.GetSingleton\u003CEndFixedStepSimulationEntityCommandBufferSystem.Singleton>();\n        var ecb = ecbSystem.CreateCommandBuffer(state.WorldUnmanaged);\n        \u002F\u002F Commands play back at end of FixedStepSimulationSystemGroup — correct timing\n    }\n}\n```\n\n## ECB System Selection Guide\n\n| Enclosing System Group | Correct ECB System |\n|---|---|\n| InitializationSystemGroup | BeginInitializationEntityCommandBufferSystem or EndInitializationEntityCommandBufferSystem |\n| SimulationSystemGroup | BeginSimulationEntityCommandBufferSystem or EndSimulationEntityCommandBufferSystem |\n| FixedStepSimulationSystemGroup | EndFixedStepSimulationEntityCommandBufferSystem |\n| PresentationSystemGroup | EndPresentationEntityCommandBufferSystem |\n\n## Anti-Patterns\n- Always using EndSimulationEntityCommandBufferSystem regardless of enclosing group — one-frame-late bugs in FixedStep systems; structural changes visible at wrong simulation tick.\n- Mixing Begin and End ECB systems within the same system — playback order ambiguity; both valid individually but inter-system ordering breaks down.\n- Using an ECB from a different World — throws InvalidOperationException at playback.\n- Forgetting that FixedStepSimulationSystemGroup runs multiple times per rendered frame — using EndSimulation ECB means commands from tick N play back after SimulationSystemGroup, not between tick N and tick N+1.\n\n## Runtime Risks\n- Wrong ECB group causes structural changes to apply at the wrong system group boundary — one or more ticks late.\n- In FixedStep scenarios, this can produce a one-rendered-frame delay that is difficult to reproduce deterministically (depends on whether the fixed group ran once or twice that frame).\n- Silent correctness bug: no exception, just wrong frame-of-effect for spawning, destroying, and component changes.\n\n## Performance Notes\n- No performance difference between ECB systems — correctness is the only concern here.\n- Wrong ECB system choice does not cause measurable performance impact; it causes logical correctness failures.\n\n## Architecture Guidance\n- Hard rule: match ECB system to enclosing system group.\n- When the choice is non-obvious (e.g., Begin vs End within the same group), document which ECB system is used and why at the system declaration.\n- For systems inside FixedStepSimulationSystemGroup, EndFixedStepSimulationEntityCommandBufferSystem is almost always correct.\n\n## Related Skills\n[[ecb-system-timing]], [[wave5-fixed-step-simulation-system-group]], [[wave8-wrong-system-group-fixed-timestep]], [[entity-command-buffer]]\n","# ECB System Group Mismatch — Wrong Playback Timing\n\n## Intent\nIdentify and fix bugs caused by using an ECB from the wrong system group, resulting in structural change commands executing at the wrong frame boundary.\n\n## Use When\n- Diagnosing one-frame-late structural changes, components appearing\u002Fdisappearing unexpectedly, or ECB playback order bugs\n- Code review of any system that records ECB commands to an ECBSystem singleton\n\n## Avoid When\n- Using a manually created ECB with explicit Playback — group mismatch only affects ECBSystem-owned buffers, not manual ECBs\n\n## Senior Pattern\n```csharp\n\u002F\u002F WRONG — EndSimulationECBSystem from within FixedStepSimulationSystemGroup:\n\u002F\u002F Commands play back after SimulationSystemGroup ends (variable rate), not after FixedStep ends\n[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]\npublic partial struct FixedPhysicsReactionSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        \u002F\u002F Wrong ECB system — playback happens at wrong frame boundary:\n        var ecbSystem = SystemAPI.GetSingleton\u003CEndSimulationEntityCommandBufferSystem.Singleton>();\n        var ecb = ecbSystem.CreateCommandBuffer(state.WorldUnmanaged);\n    }\n}\n\n\u002F\u002F CORRECT — use the ECB system matching the enclosing group:\n[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]\npublic partial struct FixedPhysicsReactionSystem : ISystem\n{\n    public void OnUpdate(ref SystemState state)\n    {\n        var ecbSystem = SystemAPI.GetSingleton\u003CEndFixedStepSimulationEntityCommandBufferSystem.Singleton>();\n        var ecb = ecbSystem.CreateCommandBuffer(state.WorldUnmanaged);\n        \u002F\u002F Commands play back at end of FixedStepSimulationSystemGroup — correct timing\n    }\n}\n```\n\n## ECB System Selection Guide\n\n| Enclosing System Group | Correct ECB System |\n|---|---|\n| InitializationSystemGroup | BeginInitializationEntityCommandBufferSystem or EndInitializationEntityCommandBufferSystem |\n| SimulationSystemGroup | BeginSimulationEntityCommandBufferSystem or EndSimulationEntityCommandBufferSystem |\n| FixedStepSimulationSystemGroup | EndFixedStepSimulationEntityCommandBufferSystem |\n| PresentationSystemGroup | EndPresentationEntityCommandBufferSystem |\n\n## Anti-Patterns\n- Always using EndSimulationEntityCommandBufferSystem regardless of enclosing group — one-frame-late bugs in FixedStep systems; structural changes visible at wrong simulation tick.\n- Mixing Begin and End ECB systems within the same system — playback order ambiguity; both valid individually but inter-system ordering breaks down.\n- Using an ECB from a different World — throws InvalidOperationException at playback.\n- Forgetting that FixedStepSimulationSystemGroup runs multiple times per rendered frame — using EndSimulation ECB means commands from tick N play back after SimulationSystemGroup, not between tick N and tick N+1.\n\n## Runtime Risks\n- Wrong ECB group causes structural changes to apply at the wrong system group boundary — one or more ticks late.\n- In FixedStep scenarios, this can produce a one-rendered-frame delay that is difficult to reproduce deterministically (depends on whether the fixed group ran once or twice that frame).\n- Silent correctness bug: no exception, just wrong frame-of-effect for spawning, destroying, and component changes.\n\n## Performance Notes\n- No performance difference between ECB systems — correctness is the only concern here.\n- Wrong ECB system choice does not cause measurable performance impact; it causes logical correctness failures.\n\n## Architecture Guidance\n- Hard rule: match ECB system to enclosing system group.\n- When the choice is non-obvious (e.g., Begin vs End within the same group), document which ECB system is used and why at the system declaration.\n- For systems inside FixedStepSimulationSystemGroup, EndFixedStepSimulationEntityCommandBufferSystem is almost always correct.\n\n## Related Skills\n[[ecb-system-timing]], [[wave5-fixed-step-simulation-system-group]], [[wave8-wrong-system-group-fixed-timestep]], [[entity-command-buffer]]\n",{"name":5,"tags":40,"metadata":41,"description":7},[20,34,23],{"tier":42,"internal-only":43},3,true,"main","fe4746b9f07e6c7c2b6d3932002183af9b9f6fa2",".claude\u002Fskills\u002Funity-dots\u002Fwave8-ecb-system-group-mismatch",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":43},[54,57,60],{"tool":55,"command":56},"npx","npx skills add dyCuong03\u002Funity-agent-team --skill wave8-ecb-system-group-mismatch",{"tool":58,"command":59},"bunx","bunx skills add dyCuong03\u002Funity-agent-team --skill wave8-ecb-system-group-mismatch",{"tool":61,"command":62},"pnpm","pnpm dlx skills add dyCuong03\u002Funity-agent-team --skill wave8-ecb-system-group-mismatch","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Funity-dots\u002Fwave8-ecb-system-group-mismatch\u002FSKILL.md",[],[66,87,110,134,154,173],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":35},"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",[],[73,74,24,75,76,19,77,78,79,80,81,82,83,84,85,31,32,86],"update","dots update groups","simulation","how","choose","work","use","never","peer","deterministic","how to","coupling","ecs","value",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":35},"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",[],[94,95,96,97,24,19,98,99,79,100,101,102,103,104,105,106,30,107,108,109],"patterns","transform","dots transform patterns","components","mount","model","cost","runtime","systems","input","with","matrix","socket","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":35},"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","适用职业",[94,122,123,124,125,126,127,19,99,79,128,129,130,101,131,132,104,32,20,133],"singleton","dots singleton patterns","component","config","state","game","writer","time","shared","contract","as","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":35},"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",[],[141,142,143,144,97,126,24,145,146,78,147,148,79,101,149,150,103,151,152,153],"bridge","hybrid","dots hybrid bridge","mesh","assets","Rules","read","view","trigger","unity","material","for","managed",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":35},"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",[],[161,162,85,163,164,97,22,165,166,99,78,167,168,94,169,27,103,170,171,172],"event driven","driven","event","dots event driven ecs","ui","network","command","anti-patterns","pattern","events","static","request",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":190,"publishedAt":35},"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",[179,184,187],{"categoryNo":180,"categoryName":181,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":185,"categoryName":186,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":188,"categoryName":189,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000023","Skill与智能体开发",[191,192,193,194,195,196,197,198,199,200,201,202,203,204,150,205,152],"valid skill","valid","code review","testing","review","test","routing","code","validation","projects","fixture skill","task","fixture","basic","complete"]