[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ERS93SD8EBKED59HCYNX1P":3,"skill-same:01M6ERS93SD8EBKED59HCYNX1P":90},{"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":23,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6ERS93SD8EBKED59HCYNX1P","r3f-performance-optimization",null,"Use when optimizing React Three Fiber scenes, experiencing frame drops, high draw calls, or implementing 3D performance features - ensures systematic performance analysis and applies proven optimization patterns for smooth 60fps rendering","nocksock\u002Fsuperpowers","nocksock","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22164?v=4","01M6ERQWRTZARGFM7AX8HB89GZ","Nils Riedemann","01M6ERQWXFH5876Z6HEDH9TWYS",1,"MIT","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fr3f-performance-optimization\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"performance","Optimization","performance optimization","r3f performance optimization","react","analysis","3D","use","patterns","draw","three","scenes","systematic","performance analysis","rendering","react three fiber","2026-11-10 10:12:30",false,"---\nname: r3f-performance-optimization\ndescription: Use when optimizing React Three Fiber scenes, experiencing frame drops, high draw calls, or implementing 3D performance features - ensures systematic performance analysis and applies proven optimization patterns for smooth 60fps rendering\n---\n\n# R3F Performance Optimization Skill\n\n## When This Skill Applies\n\nUse this skill when:\n- Frame rates drop below 60fps in R3F scenes\n- Draw call count exceeds 500-1000\n- Implementing new 3D features that may impact performance\n- Scene contains many similar objects (>50 meshes)\n- Static scenes render continuously\n- Performance varies significantly across devices\n- Memory usage grows during scene interaction\n\n## Performance Optimization Checklist\n\nWhen optimizing R3F performance, complete each step systematically:\n\n### ☐ 1. Measure Current Performance\n\n**Required before any optimization:**\n\n```jsx\nimport { Stats } from '@react-three\u002Fdrei'\n\u002F\u002F or\nimport { Perf } from 'r3f-perf'\n\n\u003CCanvas>\n  \u003CStats \u002F>  {\u002F* Basic FPS\u002Fmemory *\u002F}\n  \u003CPerf position=\"top-left\" \u002F>  {\u002F* Advanced: calls, triangles, textures *\u002F}\n  \u003CScene \u002F>\n\u003C\u002FCanvas>\n```\n\n**Record baseline metrics:**\n- Current FPS (target: 60fps)\n- Draw call count (target: \u003C500, max: 1000)\n- Triangle\u002Fvertex count\n- Memory usage patterns\n\n### ☐ 2. Enable On-Demand Rendering\n\n**For static or mostly-static scenes:**\n\n```jsx\n\u003CCanvas frameloop=\"demand\">\n  {\u002F* Only renders when props change or invalidate() called *\u002F}\n\u003C\u002FCanvas>\n```\n\n**With manual control:**\n\n```jsx\nconst { invalidate } = useThree()\n\n\u002F\u002F Before animation starts\ninvalidate()\nrequestAnimationFrame(() => {\n  \u002F\u002F Synchronous animation\n})\n```\n\n**Impact**: Can reduce CPU\u002FGPU usage by 90%+ for static scenes.\n\n### ☐ 3. Apply Instancing for Repeated Objects\n\n**When drawing >50 similar objects:**\n\nReplace individual meshes:\n```jsx\n\u002F\u002F BEFORE: 1000 draw calls\n{objects.map(obj => \u003Cmesh key={obj.id} geometry={...} material={...} \u002F>)}\n```\n\nWith InstancedMesh:\n```jsx\n\u002F\u002F AFTER: 1 draw call\n\u003CinstancedMesh args={[geometry, material, 1000]}>\n  {\u002F* Manage transforms programmatically *\u002F}\n\u003C\u002FinstancedMesh>\n```\n\n**Impact**: 100-1000x draw call reduction.\n\n### ☐ 4. Implement Level of Detail (LOD)\n\n**For objects at varying distances:**\n\n```jsx\nimport { Detailed } from '@react-three\u002Fdrei'\n\n\u003CDetailed distances={[0, 10, 20]}>\n  \u003CHighPolyMesh \u002F>   {\u002F* 0-10 units from camera *\u002F}\n  \u003CMediumPolyMesh \u002F> {\u002F* 10-20 units *\u002F}\n  \u003CLowPolyMesh \u002F>    {\u002F* 20+ units *\u002F}\n\u003C\u002FDetailed>\n```\n\n**Impact**: Reduces vertex processing for distant objects without visible quality loss.\n\n### ☐ 5. Reuse Geometries and Materials\n\n**Create once, reference many times:**\n\n```jsx\n\u002F\u002F WRONG: Creates new geometry\u002Fmaterial per mesh\nfunction Cubes() {\n  return cubes.map(cube => (\n    \u003Cmesh>\n      \u003CboxGeometry \u002F>\n      \u003CmeshStandardMaterial \u002F>\n    \u003C\u002Fmesh>\n  ))\n}\n\n\u002F\u002F CORRECT: Shared resources\nconst sharedGeometry = new THREE.BoxGeometry()\nconst sharedMaterial = new THREE.MeshStandardMaterial()\n\nfunction Cubes() {\n  return cubes.map(cube => (\n    \u003Cmesh geometry={sharedGeometry} material={sharedMaterial} \u002F>\n  ))\n}\n```\n\n**Critical**: Each unique geometry\u002Fmaterial requires GPU compilation.\n\n### ☐ 6. Use Delta-Based Animations\n\n**Ensure refresh-rate independence:**\n\n```jsx\nuseFrame((state, delta) => {\n  \u002F\u002F WRONG: Fixed speed, varies by refresh rate\n  mesh.current.rotation.x += 0.01\n\n  \u002F\u002F CORRECT: Same speed everywhere\n  mesh.current.rotation.x += delta * rotationSpeed\n})\n```\n\n**Best Practice**: Mutate directly in useFrame, don't trigger React re-renders.\n\n### ☐ 7. Implement Movement Regression\n\n**For dynamic quality scaling:**\n\n```jsx\nconst { performance } = useThree()\n\nuseFrame(() => {\n  \u002F\u002F Scale quality based on interaction\n  const pixelRatio = performance.current * 2 \u002F\u002F 0-1 range\n  gl.setPixelRatio(pixelRatio)\n})\n\n\u002F\u002F Trigger during interaction\nconst onInteraction = () => {\n  performance.regress()\n}\n```\n\n**Impact**: Maintains smoothness during movement, restores quality when static.\n\n### ☐ 8. Add Adaptive Quality Monitoring\n\n**For device-specific optimization:**\n\n```jsx\nimport { PerformanceMonitor } from '@react-three\u002Fdrei'\n\n\u003CPerformanceMonitor\n  onIncline={() => setQuality(q => Math.min(q + 1, 3))}\n  onDecline={() => setQuality(q => Math.max(q - 1, 1))}\n>\n  \u003CScene quality={quality} \u002F>\n\u003C\u002FPerformanceMonitor>\n```\n\n**Pattern**: Adjust shadows, textures, effects, or instance counts based on FPS.\n\n### ☐ 9. Optimize Asset Loading\n\n**Progressive loading strategy:**\n\n```jsx\n\u002F\u002F Preload in background\nuseGLTF.preload('\u002Fheavy-model.glb')\n\n\u002F\u002F Nested Suspense for quality transitions\n\u003CSuspense fallback={\u003CPlaceholder \u002F>}>\n  \u003CSuspense fallback={\u003CLowQualityModel \u002F>}>\n    \u003CHighQualityModel \u002F>\n  \u003C\u002FSuspense>\n\u003C\u002FSuspense>\n```\n\n**Key**: useLoader automatically caches identical URLs.\n\n### ☐ 10. Use React 18 Concurrent Features\n\n**For heavy synchronous operations:**\n\n```jsx\nimport { startTransition } from 'react'\n\nstartTransition(() => {\n  \u002F\u002F Heavy state updates distributed across frames\n  setMassiveDataset(computeExpensiveValue())\n})\n```\n\n**Benchmark**: Maintains ~60fps vs ~5fps without transition.\n\n## Common Performance Anti-Patterns\n\nWhen reviewing code, actively look for and fix:\n\n❌ **Creating resources in render**\n```jsx\n\u002F\u002F WRONG\n\u003Cmesh>\n  \u003CboxGeometry args={[1, 1, 1]} \u002F> {\u002F* Creates new geometry every render *\u002F}\n\u003C\u002FboxGeometry>\n```\n\n❌ **Excessive draw calls**\n- More than 1000 individual meshes\n- Not using instancing for repeated objects\n\n❌ **Continuous rendering for static scenes**\n- No frameloop=\"demand\" when scene is mostly static\n\n❌ **Fixed animation values**\n```jsx\nuseFrame(() => {\n  mesh.rotation.x += 0.01 \u002F\u002F WRONG: refresh-rate dependent\n})\n```\n\n❌ **Missing LOD for varied distances**\n- Same detail level for near and far objects\n\n❌ **Blocking heavy operations**\n- Synchronous operations without startTransition\n\n## Verification Steps\n\nAfter applying optimizations, verify:\n\n1. **FPS**: Stable 60fps on target devices\n2. **Draw calls**: \u003C500 (optimal), \u003C1000 (max)\n3. **Memory**: No leaks during interaction\n4. **Smoothness**: No visible frame drops during animation\n5. **Consistency**: Performance across different refresh rates\n\n## When Optimizations Are Complete\n\nOnly mark optimization complete when:\n- ✅ Baseline metrics recorded\n- ✅ All applicable checklist items addressed\n- ✅ Verification shows stable 60fps\n- ✅ No performance anti-patterns remain\n- ✅ Monitoring tools (Stats\u002FPerf) integrated\n\n## Additional Resources\n\nFor advanced patterns, consult:\n- Advanced Reference: `docs\u002Fr3f-jotai-advanced-reference.md`\n- Scaling Performance: https:\u002F\u002Fr3f.docs.pmnd.rs\u002Fadvanced\u002Fscaling-performance\n- Performance Pitfalls: https:\u002F\u002Fdocs.pmnd.rs\u002Freact-three-fiber\u002Fadvanced\u002Fpitfalls\n","# R3F Performance Optimization Skill\n\n## When This Skill Applies\n\nUse this skill when:\n- Frame rates drop below 60fps in R3F scenes\n- Draw call count exceeds 500-1000\n- Implementing new 3D features that may impact performance\n- Scene contains many similar objects (>50 meshes)\n- Static scenes render continuously\n- Performance varies significantly across devices\n- Memory usage grows during scene interaction\n\n## Performance Optimization Checklist\n\nWhen optimizing R3F performance, complete each step systematically:\n\n### ☐ 1. Measure Current Performance\n\n**Required before any optimization:**\n\n```jsx\nimport { Stats } from '@react-three\u002Fdrei'\n\u002F\u002F or\nimport { Perf } from 'r3f-perf'\n\n\u003CCanvas>\n  \u003CStats \u002F>  {\u002F* Basic FPS\u002Fmemory *\u002F}\n  \u003CPerf position=\"top-left\" \u002F>  {\u002F* Advanced: calls, triangles, textures *\u002F}\n  \u003CScene \u002F>\n\u003C\u002FCanvas>\n```\n\n**Record baseline metrics:**\n- Current FPS (target: 60fps)\n- Draw call count (target: \u003C500, max: 1000)\n- Triangle\u002Fvertex count\n- Memory usage patterns\n\n### ☐ 2. Enable On-Demand Rendering\n\n**For static or mostly-static scenes:**\n\n```jsx\n\u003CCanvas frameloop=\"demand\">\n  {\u002F* Only renders when props change or invalidate() called *\u002F}\n\u003C\u002FCanvas>\n```\n\n**With manual control:**\n\n```jsx\nconst { invalidate } = useThree()\n\n\u002F\u002F Before animation starts\ninvalidate()\nrequestAnimationFrame(() => {\n  \u002F\u002F Synchronous animation\n})\n```\n\n**Impact**: Can reduce CPU\u002FGPU usage by 90%+ for static scenes.\n\n### ☐ 3. Apply Instancing for Repeated Objects\n\n**When drawing >50 similar objects:**\n\nReplace individual meshes:\n```jsx\n\u002F\u002F BEFORE: 1000 draw calls\n{objects.map(obj => \u003Cmesh key={obj.id} geometry={...} material={...} \u002F>)}\n```\n\nWith InstancedMesh:\n```jsx\n\u002F\u002F AFTER: 1 draw call\n\u003CinstancedMesh args={[geometry, material, 1000]}>\n  {\u002F* Manage transforms programmatically *\u002F}\n\u003C\u002FinstancedMesh>\n```\n\n**Impact**: 100-1000x draw call reduction.\n\n### ☐ 4. Implement Level of Detail (LOD)\n\n**For objects at varying distances:**\n\n```jsx\nimport { Detailed } from '@react-three\u002Fdrei'\n\n\u003CDetailed distances={[0, 10, 20]}>\n  \u003CHighPolyMesh \u002F>   {\u002F* 0-10 units from camera *\u002F}\n  \u003CMediumPolyMesh \u002F> {\u002F* 10-20 units *\u002F}\n  \u003CLowPolyMesh \u002F>    {\u002F* 20+ units *\u002F}\n\u003C\u002FDetailed>\n```\n\n**Impact**: Reduces vertex processing for distant objects without visible quality loss.\n\n### ☐ 5. Reuse Geometries and Materials\n\n**Create once, reference many times:**\n\n```jsx\n\u002F\u002F WRONG: Creates new geometry\u002Fmaterial per mesh\nfunction Cubes() {\n  return cubes.map(cube => (\n    \u003Cmesh>\n      \u003CboxGeometry \u002F>\n      \u003CmeshStandardMaterial \u002F>\n    \u003C\u002Fmesh>\n  ))\n}\n\n\u002F\u002F CORRECT: Shared resources\nconst sharedGeometry = new THREE.BoxGeometry()\nconst sharedMaterial = new THREE.MeshStandardMaterial()\n\nfunction Cubes() {\n  return cubes.map(cube => (\n    \u003Cmesh geometry={sharedGeometry} material={sharedMaterial} \u002F>\n  ))\n}\n```\n\n**Critical**: Each unique geometry\u002Fmaterial requires GPU compilation.\n\n### ☐ 6. Use Delta-Based Animations\n\n**Ensure refresh-rate independence:**\n\n```jsx\nuseFrame((state, delta) => {\n  \u002F\u002F WRONG: Fixed speed, varies by refresh rate\n  mesh.current.rotation.x += 0.01\n\n  \u002F\u002F CORRECT: Same speed everywhere\n  mesh.current.rotation.x += delta * rotationSpeed\n})\n```\n\n**Best Practice**: Mutate directly in useFrame, don't trigger React re-renders.\n\n### ☐ 7. Implement Movement Regression\n\n**For dynamic quality scaling:**\n\n```jsx\nconst { performance } = useThree()\n\nuseFrame(() => {\n  \u002F\u002F Scale quality based on interaction\n  const pixelRatio = performance.current * 2 \u002F\u002F 0-1 range\n  gl.setPixelRatio(pixelRatio)\n})\n\n\u002F\u002F Trigger during interaction\nconst onInteraction = () => {\n  performance.regress()\n}\n```\n\n**Impact**: Maintains smoothness during movement, restores quality when static.\n\n### ☐ 8. Add Adaptive Quality Monitoring\n\n**For device-specific optimization:**\n\n```jsx\nimport { PerformanceMonitor } from '@react-three\u002Fdrei'\n\n\u003CPerformanceMonitor\n  onIncline={() => setQuality(q => Math.min(q + 1, 3))}\n  onDecline={() => setQuality(q => Math.max(q - 1, 1))}\n>\n  \u003CScene quality={quality} \u002F>\n\u003C\u002FPerformanceMonitor>\n```\n\n**Pattern**: Adjust shadows, textures, effects, or instance counts based on FPS.\n\n### ☐ 9. Optimize Asset Loading\n\n**Progressive loading strategy:**\n\n```jsx\n\u002F\u002F Preload in background\nuseGLTF.preload('\u002Fheavy-model.glb')\n\n\u002F\u002F Nested Suspense for quality transitions\n\u003CSuspense fallback={\u003CPlaceholder \u002F>}>\n  \u003CSuspense fallback={\u003CLowQualityModel \u002F>}>\n    \u003CHighQualityModel \u002F>\n  \u003C\u002FSuspense>\n\u003C\u002FSuspense>\n```\n\n**Key**: useLoader automatically caches identical URLs.\n\n### ☐ 10. Use React 18 Concurrent Features\n\n**For heavy synchronous operations:**\n\n```jsx\nimport { startTransition } from 'react'\n\nstartTransition(() => {\n  \u002F\u002F Heavy state updates distributed across frames\n  setMassiveDataset(computeExpensiveValue())\n})\n```\n\n**Benchmark**: Maintains ~60fps vs ~5fps without transition.\n\n## Common Performance Anti-Patterns\n\nWhen reviewing code, actively look for and fix:\n\n❌ **Creating resources in render**\n```jsx\n\u002F\u002F WRONG\n\u003Cmesh>\n  \u003CboxGeometry args={[1, 1, 1]} \u002F> {\u002F* Creates new geometry every render *\u002F}\n\u003C\u002FboxGeometry>\n```\n\n❌ **Excessive draw calls**\n- More than 1000 individual meshes\n- Not using instancing for repeated objects\n\n❌ **Continuous rendering for static scenes**\n- No frameloop=\"demand\" when scene is mostly static\n\n❌ **Fixed animation values**\n```jsx\nuseFrame(() => {\n  mesh.rotation.x += 0.01 \u002F\u002F WRONG: refresh-rate dependent\n})\n```\n\n❌ **Missing LOD for varied distances**\n- Same detail level for near and far objects\n\n❌ **Blocking heavy operations**\n- Synchronous operations without startTransition\n\n## Verification Steps\n\nAfter applying optimizations, verify:\n\n1. **FPS**: Stable 60fps on target devices\n2. **Draw calls**: \u003C500 (optimal), \u003C1000 (max)\n3. **Memory**: No leaks during interaction\n4. **Smoothness**: No visible frame drops during animation\n5. **Consistency**: Performance across different refresh rates\n\n## When Optimizations Are Complete\n\nOnly mark optimization complete when:\n- ✅ Baseline metrics recorded\n- ✅ All applicable checklist items addressed\n- ✅ Verification shows stable 60fps\n- ✅ No performance anti-patterns remain\n- ✅ Monitoring tools (Stats\u002FPerf) integrated\n\n## Additional Resources\n\nFor advanced patterns, consult:\n- Advanced Reference: `docs\u002Fr3f-jotai-advanced-reference.md`\n- Scaling Performance: https:\u002F\u002Fr3f.docs.pmnd.rs\u002Fadvanced\u002Fscaling-performance\n- Performance Pitfalls: https:\u002F\u002Fdocs.pmnd.rs\u002Freact-three-fiber\u002Fadvanced\u002Fpitfalls\n",{"name":5,"description":7},"main","52d2d5a29297631b5e3ff61fbc8ca3c6505a26e2","skills\u002Fr3f-performance-optimization",0,"https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers","https:\u002F\u002Fgithub.com\u002Fnocksock","http:\u002F\u002Fbleepbloop.studio\u002F","Hi, I'm Nils. I build interfaces for the web.","2026-03-19 04:55:50",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add nocksock\u002Fsuperpowers --skill r3f-performance-optimization",{"tool":60,"command":61},"bunx","bunx skills add nocksock\u002Fsuperpowers --skill r3f-performance-optimization",{"tool":63,"command":64},"pnpm","pnpm dlx skills add nocksock\u002Fsuperpowers --skill r3f-performance-optimization","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fr3f-performance-optimization\u002FSKILL.md",true,[68,74,78,82,86],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"agents\u002Fopenai.yaml","REFERENCE","参考文档",308,"https:\u002F\u002Fgithub.com\u002Fmatt-riley\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftempl-templates\u002Fagents\u002Fopenai.yaml",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"evals\u002Fevals.json",4679,"https:\u002F\u002Fgithub.com\u002Fmatt-riley\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftempl-templates\u002Fevals\u002Fevals.json",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":80,"sourceHtmlUrl":81},"evals\u002Ftrigger-queries.json",1480,"https:\u002F\u002Fgithub.com\u002Fmatt-riley\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftempl-templates\u002Fevals\u002Ftrigger-queries.json",{"path":83,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Fedge-cases.md",892,"https:\u002F\u002Fgithub.com\u002Fmatt-riley\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftempl-templates\u002Freferences\u002Fedge-cases.md",{"path":87,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Fexamples.md",952,"https:\u002F\u002Fgithub.com\u002Fmatt-riley\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftempl-templates\u002Freferences\u002Fexamples.md",[91,114,130,147,160,171],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":108,"publishedAt":40},"01M6ERV5R58PKM81EH15XEYPMF","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-skills\u002FSKILL.md",[97,100,103],{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[109,110,31,111,112,113],"writing skills","writing","deployment","work","editing",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":122,"publishedAt":40},"01M6ERV2JX5DJV2EHSC6FXHEHN","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-plans\u002FSKILL.md",[120,121],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},[123,124,110,125,126,31,127,128,129],"plans","writing plans","spec","code","task","requirements","multi",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":141,"publishedAt":40},"01M6ERTZS70NCVS375DTD8HGKE","writing good code","use this skill whenever you write code. it provides a process for creating good, composable apis.","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-good-code\u002FSKILL.md",[136,137,140],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":138,"categoryName":139,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000030","开发工程师",{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},[132,142,126,110,143,31,144,145,146],"good","it","process","write","composable",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":40},"01M6ERTVVRPKZVWK6M8EXPB5QE","write-review-elixir","Review Elixir code. ALWAYS use this skill before or after you added code written in elixir to ensure high code quality. Also use use this when asked to review existing elixir code.","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-or-review-elixir\u002FSKILL.md",[],[154,145,155,156,157,31,158,126,159],"write review elixir","elixir","review","elixir code","quality","code quality",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":40},"01M6ERTRAM8PSJ9JTAW5J4ABFD","whats-next","Answers what to do next, what to work on next, where we're at","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fwhats-next\u002FSKILL.md",[],[167,168,169,112,170],"next","whats next","work on","do",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":40},"01M6ERTNG9NT8SQH5FHN91JRTS","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002Fnocksock\u002Fsuperpowers\u002Fblob\u002Fmain\u002Fskills\u002Fverification-before-completion\u002FSKILL.md",[],[178,179,180,181,182,31,112,183,184,185],"verification before completion","verification","commands","claim","evidence","complete","output","about"]