[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GXHSPDDH1PQEN61ENMCEF5":3,"skill-same:01M6GXHSPDDH1PQEN61ENMCEF5":72},{"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":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6GXHSPDDH1PQEN61ENMCEF5","Unity Review",null,"Deep review of Unity C# code — object pooling, Update allocation, physics patterns, UI performance, serialization, and mobile optimization.","malayvuong\u002Fagent-orchestra","malayvuong","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13240975?v=4","01M6GXCDVPB2VPZMDZK1KF98M0","Nguyen Minh Vuong","01M6GXCE176VDX3XV4Z4KNR33J",1,"MIT","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Funity-review\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"unity","review","patterns","allocation","object","mobile optimization","C#","logic","deep","physics","mobile","Optimization","serialization","ui","deep review","code","update","performance","2026-11-10 10:12:30",false,"---\nname: Unity Review\ndescription: Deep review of Unity C# code — object pooling, Update allocation, physics patterns, UI performance, serialization, and mobile optimization.\nversion: 2026.3.1\nlicense: MIT\ntriggers:\n  lenses:\n    - performance\n    - logic\n  keywords:\n    - unity\n    - monobehaviour\n    - update\n    - gameobject\n    - c#\n    - mobile\n---\n\nWhen reviewing Unity C# code, apply the following engine-specific checks.\n\n## Per-Frame Allocation\n\nFlag any `new` allocation inside `Update()`, `FixedUpdate()`, `LateUpdate()`, or coroutine bodies. This includes: `new List\u003CT>()`, `new Vector3()` (struct boxing in certain contexts), string concatenation with `+`, LINQ queries (`.Where()`, `.Select()`, `.ToList()`), lambda captures that allocate closure objects.\n\nVerify reusable buffers are declared as fields, cleared, and refilled each frame. Check for `GetComponent\u003CT>()` calls in per-frame code — these should be cached in `Awake()` or `Start()`.\n\nFlag `Debug.Log()` in per-frame code — strip or guard with `#if UNITY_EDITOR`.\n\n## Object Pooling\n\nVerify frequently spawned objects (enemies, projectiles, effects, drops) use `ObjectPool\u003CT>` or equivalent. Flag `Object.Instantiate()` and `Object.Destroy()` in gameplay code paths. Check that pooled objects reset state completely on return (position, health, velocity, timers, active components).\n\nVerify pool warm-up (pre-instantiation) occurs during loading, not during gameplay. Flag pools with no maximum size cap — unbounded pools can exhaust memory.\n\n## FindObject Anti-Patterns\n\nFlag all uses of `FindObjectsByType`, `FindObjectOfType`, `GameObject.Find`, `GameObject.FindWithTag` in per-frame or frequently-called code. These perform full scene searches. Verify the static registry pattern is used: objects register in `OnEnable`, unregister in `OnDisable`, and consumers query the registry.\n\n## Physics2D \u002F Physics\n\nVerify `Physics2D.autoSyncTransforms` is `false` and `Physics2D.reuseCollisionCallbacks` is `true`. Flag `PolygonCollider2D` on dynamic objects — use `CircleCollider2D` or `BoxCollider2D`.\n\nCheck Layer Collision Matrix — only layers that need to collide should be enabled. Flag raycasts without distance limits (`Physics2D.Raycast` without `maxDistance`). Verify `ContactFilter2D` is reused rather than created per call.\n\nFlag `OnCollisionEnter2D` \u002F `OnTriggerEnter2D` callbacks that allocate or perform expensive logic — these can fire multiple times per physics step.\n\n## Coroutine Patterns\n\nFlag `yield return new WaitForSeconds()` — the `new` allocates every time. Use cached `WaitForSeconds` fields. Flag coroutines that run indefinitely without stop conditions. Verify `StopCoroutine` is called on object disable or destroy to prevent orphaned coroutines.\n\nCheck for coroutines used where `async\u002Fawait` with `UniTask` or native C# `Task` would be cleaner (one-shot async operations vs. frame-by-frame iteration).\n\n## UI Performance\n\nVerify `raycastTarget` is disabled on all non-interactive UI elements (labels, backgrounds, decorative images). Flag unnecessary Canvas rebuilds caused by modifying text or image properties every frame. Check that UI updates are throttled with frame-skip patterns (`if (Time.frameCount % N == 0)`) for non-critical displays (score, timer, debug HUD).\n\nFlag `Canvas.ForceUpdateCanvases()` in per-frame code. Verify UI elements that change frequently are on a separate Canvas from static UI to minimize rebuild scope.\n\n## SerializeField and Inspector\n\nVerify `[SerializeField] private` is used instead of `public` for inspector-exposed fields. Flag public fields that should be private with `[SerializeField]`. Check for `[HideInInspector]` on fields that are set programmatically and should not be accidentally edited in the inspector.\n\nFlag `[SerializeField]` on `MonoBehaviour` references that are set via `GetComponent` in code — these create confusing dual assignment paths.\n\n## ScriptableObject and Data\n\nVerify game configuration uses `ScriptableObject` assets or JSON data rather than hardcoded values in MonoBehaviours. Flag magic numbers in gameplay code (damage values, cooldown durations, spawn rates) that should be data-driven.\n\nCheck that `ScriptableObject` instances are not modified at runtime — runtime modifications persist in the editor and corrupt the asset.\n\n## Mobile-Specific\n\nFlag texture settings with `Read\u002FWrite Enabled = true` on textures that are not accessed from scripts — this doubles memory usage. Verify sprite atlases are used for UI and gameplay sprites. Check that `Application.targetFrameRate` is set explicitly (typically 30 or 60 for mobile).\n\nFor each finding, report: the script name, the specific Unity pattern violated, and the recommended fix.\n","When reviewing Unity C# code, apply the following engine-specific checks.\n\n## Per-Frame Allocation\n\nFlag any `new` allocation inside `Update()`, `FixedUpdate()`, `LateUpdate()`, or coroutine bodies. This includes: `new List\u003CT>()`, `new Vector3()` (struct boxing in certain contexts), string concatenation with `+`, LINQ queries (`.Where()`, `.Select()`, `.ToList()`), lambda captures that allocate closure objects.\n\nVerify reusable buffers are declared as fields, cleared, and refilled each frame. Check for `GetComponent\u003CT>()` calls in per-frame code — these should be cached in `Awake()` or `Start()`.\n\nFlag `Debug.Log()` in per-frame code — strip or guard with `#if UNITY_EDITOR`.\n\n## Object Pooling\n\nVerify frequently spawned objects (enemies, projectiles, effects, drops) use `ObjectPool\u003CT>` or equivalent. Flag `Object.Instantiate()` and `Object.Destroy()` in gameplay code paths. Check that pooled objects reset state completely on return (position, health, velocity, timers, active components).\n\nVerify pool warm-up (pre-instantiation) occurs during loading, not during gameplay. Flag pools with no maximum size cap — unbounded pools can exhaust memory.\n\n## FindObject Anti-Patterns\n\nFlag all uses of `FindObjectsByType`, `FindObjectOfType`, `GameObject.Find`, `GameObject.FindWithTag` in per-frame or frequently-called code. These perform full scene searches. Verify the static registry pattern is used: objects register in `OnEnable`, unregister in `OnDisable`, and consumers query the registry.\n\n## Physics2D \u002F Physics\n\nVerify `Physics2D.autoSyncTransforms` is `false` and `Physics2D.reuseCollisionCallbacks` is `true`. Flag `PolygonCollider2D` on dynamic objects — use `CircleCollider2D` or `BoxCollider2D`.\n\nCheck Layer Collision Matrix — only layers that need to collide should be enabled. Flag raycasts without distance limits (`Physics2D.Raycast` without `maxDistance`). Verify `ContactFilter2D` is reused rather than created per call.\n\nFlag `OnCollisionEnter2D` \u002F `OnTriggerEnter2D` callbacks that allocate or perform expensive logic — these can fire multiple times per physics step.\n\n## Coroutine Patterns\n\nFlag `yield return new WaitForSeconds()` — the `new` allocates every time. Use cached `WaitForSeconds` fields. Flag coroutines that run indefinitely without stop conditions. Verify `StopCoroutine` is called on object disable or destroy to prevent orphaned coroutines.\n\nCheck for coroutines used where `async\u002Fawait` with `UniTask` or native C# `Task` would be cleaner (one-shot async operations vs. frame-by-frame iteration).\n\n## UI Performance\n\nVerify `raycastTarget` is disabled on all non-interactive UI elements (labels, backgrounds, decorative images). Flag unnecessary Canvas rebuilds caused by modifying text or image properties every frame. Check that UI updates are throttled with frame-skip patterns (`if (Time.frameCount % N == 0)`) for non-critical displays (score, timer, debug HUD).\n\nFlag `Canvas.ForceUpdateCanvases()` in per-frame code. Verify UI elements that change frequently are on a separate Canvas from static UI to minimize rebuild scope.\n\n## SerializeField and Inspector\n\nVerify `[SerializeField] private` is used instead of `public` for inspector-exposed fields. Flag public fields that should be private with `[SerializeField]`. Check for `[HideInInspector]` on fields that are set programmatically and should not be accidentally edited in the inspector.\n\nFlag `[SerializeField]` on `MonoBehaviour` references that are set via `GetComponent` in code — these create confusing dual assignment paths.\n\n## ScriptableObject and Data\n\nVerify game configuration uses `ScriptableObject` assets or JSON data rather than hardcoded values in MonoBehaviours. Flag magic numbers in gameplay code (damage values, cooldown durations, spawn rates) that should be data-driven.\n\nCheck that `ScriptableObject` instances are not modified at runtime — runtime modifications persist in the editor and corrupt the asset.\n\n## Mobile-Specific\n\nFlag texture settings with `Read\u002FWrite Enabled = true` on textures that are not accessed from scripts — this doubles memory usage. Verify sprite atlases are used for UI and gameplay sprites. Check that `Application.targetFrameRate` is set explicitly (typically 30 or 60 for mobile).\n\nFor each finding, report: the script name, the specific Unity pattern violated, and the recommended fix.\n",{"name":5,"license":15,"version":42,"triggers":43,"description":7},"2026.3.1",{"lenses":44,"keywords":45},[36,26],[19,46,35,47,48,29],"monobehaviour","gameobject","c#","main","eac6069a8690d89fd23f08d2d14e4874ed376a77",".agent-orchestra\u002Fskills\u002Funity-review",0,"https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra","https:\u002F\u002Fgithub.com\u002Fmalayvuong","www.malayvuong.com","Just a newbie at everything","2026-10-09 12:52:45",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add malayvuong\u002Fagent-orchestra --skill \"Unity Review\"",{"tool":64,"command":65},"bunx","bunx skills add malayvuong\u002Fagent-orchestra --skill \"Unity Review\"",{"tool":67,"command":68},"pnpm","pnpm dlx skills add malayvuong\u002Fagent-orchestra --skill \"Unity Review\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Funity-review\u002FSKILL.md",true,[],[73,111,129,153,173,192],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":95,"publishedAt":37},"01M6GXHYPRJ43SHFPFJTF87GS8","Vue.js Review","Deep review of Vue.js applications — Composition API patterns, reactivity traps, component design, Pinia state management, and performance pitfalls.","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Fvue-review\u002FSKILL.md",[79,84,87,90],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":85,"categoryName":86,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":88,"categoryName":89,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[20,96,97,98,99,36,100,101,102,33,103,104,105,106,107,108,27,26,109,110],"vue","js","Vue js Review","design","component","state management","state","api patterns","applications","api","Composition","pinia","management","pitfalls","pinia state",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":37},"01M6GXHNKTH12CGSRWDGF2H1Q9","TypeScript Review","Deep review of TypeScript code — type safety, generics patterns, strict mode compliance, type narrowing, module boundaries, and common escape hatches.","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Ftypescript-review\u002FSKILL.md",[],[20,118,119,34,33,120,121,122,123,21,27,26,124,125,126,127,128],"typescript","typescript review","compliance","Type Safety","Safety","common","module","type","interface","consistency","mode",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":141,"publishedAt":37},"01M6GXHH3DMZD272RVH4800C67","Test Conventions","Testing patterns and conventions for code review. Covers naming, AAA structure, boundary testing, mock vs real dependencies, and coverage expectations.","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Ftest-conventions\u002FSKILL.md",[135,138],{"categoryNo":136,"categoryName":137,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":139,"categoryName":140,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000008","测试与质量",[142,143,131,144,145,20,34,146,147,148,21,149,150,151,152],"test","conventions","code review","testing","testing patterns","boundary","coverage","dependencies","structure","mock","naming",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":163,"publishedAt":37},"01M6GXHCAQSJDVNVRFFD1HJWTN","Terraform Review","Deep review of Terraform\u002FOpenTofu configuration — state management, module design, security hardening, drift prevention, and production safety patterns.","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Fterraform-review\u002FSKILL.md",[159,162],{"categoryNo":160,"categoryName":161,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":88,"categoryName":89,"taxonomyType":82,"taxonomyTypeDesc":83},[20,164,155,99,165,101,102,33,166,167,168,169,122,170,108,171,172,27,26,124],"terraform","security","cloud","aws","hardening","Production","opentofu","iac","drift",{"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":180,"publishedAt":37},"01M6GXH83F11CK4BQEAJPN6HDE","Swift Review","Deep review of Swift code — memory management, concurrency patterns, optionals, protocol design, SwiftUI lifecycle, and iOS platform patterns.","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Fswift-review\u002FSKILL.md",[179],{"categoryNo":88,"categoryName":89,"taxonomyType":82,"taxonomyTypeDesc":83},[181,20,175,99,182,36,34,183,33,184,185,186,187,188,108,27,26,189,190,191],"swift","memory","protocol","ios","concurrency","lifecycle","swiftui","uikit","xcode","apple","platform",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":202,"publishedAt":37},"01M6GXH22YZZ9AES24EB27BGNX","SQL Query Review","Deep review of SQL queries — execution plans, index utilization, join efficiency, subquery patterns, locking behavior, and performance anti-patterns.","https:\u002F\u002Fgithub.com\u002Fmalayvuong\u002Fagent-orchestra\u002Fblob\u002Fmain\u002F.agent-orchestra\u002Fskills\u002Fsql-query-review\u002FSKILL.md",[198,199],{"categoryNo":85,"categoryName":86,"taxonomyType":82,"taxonomyTypeDesc":83},{"categoryNo":200,"categoryName":201,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000033","数据分析师",[20,203,204,194,36,33,205,206,207,208,209,210,211,212,213,214,27,26,215,216],"sql","query","index","execution","explain","select","behavior","utilization","anti-patterns","sql queries","queries","efficiency","plans","join"]