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:
Matthias
2026-04-19 21:11:32 +02:00
parent 577214d474
commit a60a76b797
679 changed files with 138964 additions and 73 deletions

View 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"
}

View 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

View File

@@ -0,0 +1,3 @@
interface:
display_name: "Audit SpriteKit"
short_description: "The user wants to audit SpriteKit game code for common issues."