Add scan flow MVP and local Axiom skill workspace
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.
This commit is contained in:
7
.claude/skills/axiom-audit-spritekit/.openskills.json
Normal file
7
.claude/skills/axiom-audit-spritekit/.openskills.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"source": "CharlesWiltgen/Axiom",
|
||||
"sourceType": "git",
|
||||
"repoUrl": "https://github.com/CharlesWiltgen/Axiom",
|
||||
"subpath": "axiom-codex/skills/axiom-audit-spritekit",
|
||||
"installedAt": "2026-04-12T08:05:49.849Z"
|
||||
}
|
||||
150
.claude/skills/axiom-audit-spritekit/SKILL.md
Normal file
150
.claude/skills/axiom-audit-spritekit/SKILL.md
Normal file
@@ -0,0 +1,150 @@
|
||||
---
|
||||
name: axiom-audit-spritekit
|
||||
description: Use when the user wants to audit SpriteKit game code for common issues.
|
||||
license: MIT
|
||||
disable-model-invocation: 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 values
|
||||
- `contactTestBitMask` — verify exists for bodies needing contact detection
|
||||
- `collisionBitMask` — verify not left as default 0xFFFFFFFF
|
||||
- `0xFFFFFFFF` or `4294967295` — 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)
|
||||
- `.atlas` or `SKTextureAtlas` — 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(` vs `removeFromParent()` — significant imbalance indicates leak
|
||||
- `addChild` inside `update(` 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 {` or `SKAction.run({` — check for `[weak self]`
|
||||
- `.repeatForever(` — check for `withKey:` parameter
|
||||
- `SKAction.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.view` or `touch.location(in: view` — should be `touch.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**:
|
||||
- `touchesBegan` in SKNode subclasses — verify `isUserInteractionEnabled = true` is set
|
||||
- `touchesMoved`, `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 named `spawn`, `fire`, `create`, or inside `update(`
|
||||
- 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 project
|
||||
- `showsNodeCount` — should exist
|
||||
- `showsDrawCount` — 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:
|
||||
1. **Summary**: Issue counts by severity
|
||||
2. **Issues by severity**: CRITICAL first, then HIGH, MEDIUM, LOW
|
||||
3. **Each issue**: File:line, pattern detected, impact, fix with code example
|
||||
4. **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 closures
|
||||
- `isUserInteractionEnabled = true` already set
|
||||
- Debug overlays behind `#if DEBUG` flag
|
||||
- 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
|
||||
3
.claude/skills/axiom-audit-spritekit/agents/openai.yaml
Normal file
3
.claude/skills/axiom-audit-spritekit/agents/openai.yaml
Normal file
@@ -0,0 +1,3 @@
|
||||
interface:
|
||||
display_name: "Audit SpriteKit"
|
||||
short_description: "The user wants to audit SpriteKit game code for common issues."
|
||||
Reference in New Issue
Block a user