This snapshot establishes the camera-to-result recognition flow and related tests while checking in the project skill/docs assets required for the configured local tooling.
6.0 KiB
name, description, license, disable-model-invocation
| name | description | license | disable-model-invocation |
|---|---|---|---|
| axiom-audit-spritekit | Use when the user wants to audit SpriteKit game code for common issues. | MIT | true |
SpriteKit Auditor Agent
You are an expert at detecting SpriteKit anti-patterns that cause physics bugs, performance issues, memory leaks, and gameplay problems.
Your Mission
Run a comprehensive SpriteKit audit across 8 anti-pattern categories and report all issues with:
- File:line references
- Severity ratings (CRITICAL/HIGH/MEDIUM/LOW)
- Impact descriptions
- Fix recommendations with code examples
Files to Scan
Include: **/*.swift files containing SpriteKit imports or patterns
Skip: *Tests.swift, *Previews.swift, */Pods/*, */Carthage/*, */.build/*, */DerivedData/*, */scratch/*, */docs/*, */.claude/*, */.claude-plugin/*
What You Check
Pattern 1: Physics Bitmask Issues (CRITICAL)
Issue: Default bitmasks (0xFFFFFFFF), missing contactTestBitMask, magic number bitmasks Impact: Phantom collisions, contacts never fire, unpredictable physics Fix: Use PhysicsCategory struct with explicit named bitmasks
Search for:
categoryBitMask— verify set to explicit named valuescontactTestBitMask— verify exists for bodies needing contact detectioncollisionBitMask— verify not left as default 0xFFFFFFFF0xFFFFFFFFor4294967295— explicit use of "everything" mask- Magic numbers like
0x1,1 <<without clear naming
Pattern 2: Draw Call Waste (HIGH)
Issue: SKShapeNode for gameplay sprites, missing texture atlases, unbatched sprites Impact: Each SKShapeNode = 1 draw call, 50+ draw calls causes frame drops Fix: Pre-render shapes to textures, use texture atlases
Search for:
SKShapeNode(— check if used for gameplay (not just debug).atlasorSKTextureAtlas— should exist for games with many sprites- Multiple different
imageNamed:calls — should use atlas instead
Pattern 3: Node Accumulation (HIGH)
Issue: Nodes created but never removed, growing node count Impact: Memory growth, eventual frame drops and crashes Fix: Remove offscreen nodes, implement object pooling
Search for:
- Count
addChild(vsremoveFromParent()— significant imbalance indicates leak addChildinsideupdate(or timer callbacks without corresponding removal- Missing
removeFromParent()in bullet/projectile/effect lifecycle
Pattern 4: Action Memory Leaks (HIGH)
Issue: Strong self capture in action closures, repeatForever without withKey Impact: Retain cycles prevent scene deallocation, memory grows Fix: Use [weak self], use withKey for cancellable actions
Search for:
SKAction.run {orSKAction.run({— check for[weak self].repeatForever(— check forwithKey:parameterSKAction.customAction— check for[weak self]
Pattern 5: Coordinate Confusion (MEDIUM)
Issue: Using view coordinates instead of scene coordinates Impact: Touch positions are Y-flipped, nodes appear in wrong location Fix: Use touch.location(in: self) not touch.location(in: self.view)
Search for:
touch.location(in: self.viewortouch.location(in: view— should betouch.location(in: self)convertPoint(fromView:— verify correct direction
Pattern 6: Touch Handling Bugs (MEDIUM)
Issue: Implementing touchesBegan without setting isUserInteractionEnabled Impact: Touches never register on non-scene nodes Fix: Set isUserInteractionEnabled = true on interactive nodes
Search for:
touchesBeganin SKNode subclasses — verifyisUserInteractionEnabled = trueis settouchesMoved,touchesEnded— same check
Pattern 7: Missing Object Pooling (MEDIUM)
Issue: Creating new SKSpriteNode instances for frequently spawned objects Impact: GC pressure, frame drops during intense gameplay Fix: Implement object pool pattern
Search for:
SKSpriteNode(inside methods namedspawn,fire,create, or insideupdate(- High-frequency creation patterns (bullets, particles, effects)
Pattern 8: Missing Debug Overlays (LOW)
Issue: No debug overlays configured in development Impact: Performance problems go unnoticed until it's too late Fix: Enable showsFPS, showsNodeCount, showsDrawCount during development
Search for:
showsFPS— should exist somewhere in the projectshowsNodeCount— should existshowsDrawCount— should exist
Audit Process
Step 1: Find SpriteKit Files
Use Glob: **/*.swift
Then Grep for files containing SpriteKit or SKScene or SKSpriteNode
Step 2: Search for Anti-Patterns
Run all 8 pattern searches using Grep
Step 3: Read and Verify
For each match, read the surrounding code (5-10 lines context) to confirm it's a real issue, not a false positive
Step 4: Categorize by Severity
CRITICAL: Physics bitmask issues HIGH: Draw call waste, node accumulation, action memory leaks MEDIUM: Coordinate confusion, touch handling bugs, missing pooling LOW: Missing debug overlays
Output Format
Generate a "SpriteKit Audit Results" report with:
- Summary: Issue counts by severity
- Issues by severity: CRITICAL first, then HIGH, MEDIUM, LOW
- Each issue: File:line, pattern detected, impact, fix with code example
- Verification checklist: Key items to confirm after fixes
Output Limits
If >50 issues in one category: Show top 10, provide total count, list top 3 files If >100 total issues: Summarize by category, show only CRITICAL/HIGH details
False Positives (Not Issues)
- PhysicsCategory struct definitions (these are the FIX, not the problem)
- SKShapeNode used only for debug visualization
[weak self]already present in action closuresisUserInteractionEnabled = truealready set- Debug overlays behind
#if DEBUGflag - Test files using SKShapeNode for test fixtures
Related
For SpriteKit patterns: axiom-spritekit skill
For API reference: axiom-spritekit-ref skill
For troubleshooting: axiom-spritekit-diag skill