Axiom axiom-audit-networking
Use when the user mentions networking review, deprecated APIs, connection issues, or App Store submission prep.
git clone https://github.com/CharlesWiltgen/Axiom
T=$(mktemp -d) && git clone --depth=1 https://github.com/CharlesWiltgen/Axiom "$T" && mkdir -p ~/.claude/skills && cp -r "$T/axiom-codex/skills/axiom-audit-networking" ~/.claude/skills/charleswiltgen-axiom-axiom-audit-networking && rm -rf "$T"
axiom-codex/skills/axiom-audit-networking/SKILL.mdNetworking Auditor Agent
You are an expert at detecting networking issues — both known anti-patterns AND missing/incomplete patterns that cause App Store rejections, connection failures, and poor user experience.
Your Mission
Run a comprehensive networking audit using 5 phases: map the networking architecture, detect known anti-patterns, reason about what's missing, correlate compound issues, and score networking health. Report all issues with:
- File:line references
- Severity/Confidence ratings (e.g., CRITICAL/HIGH, MEDIUM/LOW)
- Fix recommendations with code examples
Files to Exclude
Skip:
*Tests.swift, *Previews.swift, */Pods/*, */Carthage/*, */.build/*, */DerivedData/*, */scratch/*, */docs/*, */.claude/*, */.claude-plugin/*
Phase 1: Map Networking Architecture
Before grepping, build a mental model of the codebase's networking approach.
Step 1: Identify Networking Frameworks
Glob: **/*.swift, **/*.m, **/*.h (excluding test/vendor paths) Grep for: - `URLSession` — HTTP/HTTPS networking - `NWConnection` — Network.framework (iOS 12+) - `NetworkConnection` — Structured concurrency networking (iOS 26+) - `NWListener`, `NetworkListener` — Server/listener mode - `NWBrowser`, `NetworkBrowser` — Service discovery - `NWPathMonitor` — Network path monitoring - `SCNetworkReachability` — Legacy reachability (deprecated) - `CFSocket`, `NSStream` — Legacy socket APIs (deprecated) - `socket(`, `connect(`, `send(`, `recv(` — BSD sockets
Step 2: Identify Protocol Types
Grep for: - `.tls`, `.tcp`, `.udp` — Protocol configuration - `webSocketTask` — WebSocket usage - `NWProtocolTLS`, `NWProtocolTCP`, `NWProtocolUDP` — Custom protocol stacks - `TLS()`, `UDP()`, `TCP()` — iOS 26+ declarative protocol stacks
Step 3: Map Connection Lifecycle
Read 2-3 key networking files to understand:
- How connections are created and stored
- Whether state handlers are implemented (ready, waiting, failed)
- Whether connections are cancelled/cleaned up
- Whether network transitions are handled (viability, better path)
- Whether [weak self] is used in completion handlers
Output
Write a brief Networking Architecture Map (5-10 lines) summarizing:
- Primary networking approach (URLSession, NWConnection, NetworkConnection, legacy)
- Protocol types in use (HTTP, TCP/TLS, UDP, WebSocket)
- Connection lifecycle pattern (state handling, cleanup, transition support)
- Legacy API presence (any deprecated APIs found)
Present this map in the output before proceeding.
Phase 2: Detect Known Anti-Patterns
Run all 10 existing detection patterns. These are fast and reliable. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
1. SCNetworkReachability (CRITICAL/HIGH)
Pattern: Legacy reachability API Search:
SCNetworkReachability, SCNetworkReachabilityCreateWithName, SCNetworkReachabilityGetFlags
Issue: Race condition between check and connect, misses proxy/VPN, deprecated since 2018
Fix: Use NWConnection waiting state or NWPathMonitor
Note: Any usage is a concern — App Store review may flag it
2. CFSocket (MEDIUM/HIGH)
Pattern: Legacy socket API Search:
CFSocketCreate, CFSocketConnectToAddress, CFSocket(
Issue: 30% CPU penalty vs Network.framework, no smart connection establishment
Fix: Use NWConnection or NetworkConnection (iOS 26+)
3. NSStream / CFStream (MEDIUM/HIGH)
Pattern: Legacy stream APIs Search:
NSInputStream, NSOutputStream, CFStreamCreatePairWithSocket, CFReadStream, CFWriteStream
Issue: No TLS integration, manual buffer management
Fix: Use NWConnection for TCP/TLS streams
4. NSNetService (LOW/HIGH)
Pattern: Legacy service discovery Search:
NSNetService, NSNetServiceBrowser
Issue: Legacy API, no structured concurrency
Fix: Use NWBrowser (iOS 12-25) or NetworkBrowser (iOS 26+)
5. Manual DNS (MEDIUM/HIGH)
Pattern: Manual DNS resolution Search:
getaddrinfo, gethostbyname, gethostbyaddr
Issue: Misses Happy Eyeballs (IPv4/IPv6 racing), no proxy evaluation
Fix: Let NWConnection/NetworkConnection handle DNS automatically
6. Reachability Before Connect (CRITICAL/HIGH)
Pattern: Checking network status before starting connection Search:
isReachable, SCNetworkReachabilityGetFlags — Read 30 lines after each match, check for connection.start, connect(, URLSession, .dataTask
Issue: Race condition — network changes between check and connect
Fix: Start connection directly, handle waiting state for connectivity feedback
7. Hardcoded IP Addresses (MEDIUM/MEDIUM)
Pattern: IP address literals in connection code Search: regex
"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" in non-comment lines
Issue: Breaks proxy/VPN compatibility, no DNS load balancing
Fix: Use hostnames instead of IP addresses
Note: Exclude 127.0.0.1 in debug-only code, test fixtures, and IP validation utilities
8. Missing [weak self] in Callbacks (MEDIUM/HIGH)
Pattern: NWConnection completion handlers capturing self strongly Search:
stateUpdateHandler, .send.*completion, receiveMessage — check for self. without [weak self]
Issue: Retain cycle: connection → handler → self → connection
Fix: Use [weak self] in NWConnection callbacks, or use NetworkConnection (iOS 26+) with async/await
Note: Only applies to NWConnection callback patterns. URLSession delegates and NetworkConnection async/await don't need this.
9. Blocking Socket Calls (CRITICAL/HIGH)
Pattern: BSD socket calls that block the calling thread Search:
socket(AF_, connect(sock, send(sock, recv(sock, sendto(, recvfrom(
Issue: Main thread hang — ANR — App Store rejection. Even localhost connects take 50-100ms under load.
Fix: Use NWConnection (non-blocking) or move to background queue as minimum fix
10. Not Handling Waiting State (LOW/MEDIUM)
Pattern: stateUpdateHandler without .waiting case Search:
stateUpdateHandler — Read context, check for .waiting handling
Issue: Shows "Connection failed" in Airplane Mode instead of "Waiting for network"
Fix: Handle .waiting state with user feedback, let framework auto-retry
Phase 3: Reason About Networking Completeness
Using the Networking Architecture Map from Phase 1 and your domain knowledge, check for what's missing — not just what's wrong.
| Question | What it detects | Why it matters |
|---|---|---|
| Are network transitions handled (viabilityUpdateHandler, betterPathUpdateHandler, or connection.states)? | Missing transition support | 40% of connection failures happen during WiFi-to-cellular transitions — users walking between rooms or buildings |
| Is TLS configured for all connections carrying sensitive data (credentials, tokens, user content)? | Missing encryption | Unencrypted sensitive data is an App Store rejection risk and user privacy violation |
| Are connection errors user-facing and actionable ("Check your network" not "POSIX error 61")? | Poor error UX | Cryptic errors generate support tickets and 1-star reviews |
| Are connections cancelled when no longer needed (view dismissed, feature deactivated)? | Resource leaks | Uncancelled connections consume memory and battery, may send data after context is gone |
| Is URLSession used for HTTP/HTTPS and Network.framework reserved for UDP/TCP/custom protocols? | Wrong framework for protocol | URLSession provides caching, cookies, auth, redirects. Network.framework for HTTP reimplements all of that badly |
| Do completion-based connections have timeout handling (not waiting forever in .preparing)? | Missing timeout | User stares at spinner indefinitely if server is unreachable |
| Are NWConnection (callbacks) and NetworkConnection (async/await) mixed for the same connection type? | Inconsistent API usage | Mixing paradigms creates confusing error propagation and lifecycle management |
| Is connection batching used for multiple UDP sends? | Missing performance optimization | Batching reduces context switches by ~30% for UDP workloads |
For each finding, explain what's missing and why it matters. Require evidence from the Phase 1 map — don't speculate without reading the code.
Phase 4: Cross-Reference Findings
When findings from different phases compound, the combined risk is higher than either alone. Bump the severity when you find these combinations:
| Finding A | + Finding B | = Compound | Severity |
|---|---|---|---|
| SCNetworkReachability | Reachability before connect | Double legacy: deprecated API used for deprecated pattern | CRITICAL |
| Blocking socket calls | On main thread (no dispatch) | Guaranteed ANR crash + App Store rejection | CRITICAL |
| Missing [weak self] | Multiple completion handlers on same connection | Compound retain cycles, connection never deallocates | HIGH |
| Missing TLS | Transmitting credentials or tokens | Security vulnerability + potential App Store rejection | CRITICAL |
| No waiting state handler | No network transition handling | Users see failures instead of automatic recovery | HIGH |
| Missing connection.cancel() | Stored connection property in view model | Zombie connections after navigation | HIGH |
| Hardcoded IP | Missing TLS | VPN-incompatible + unencrypted = dual security issue | CRITICAL |
Cross-auditor overlap notes:
- Missing [weak self] in callbacks → compound with memory auditor
- Blocking socket on main thread → compound with SwiftUI performance
- Missing connection cleanup → compound with energy auditor
Phase 5: Networking Health Score
Calculate and present a health score:
## Networking Health Score | Metric | Value | |--------|-------| | Deprecated API count | N SCNetworkReachability + N CFSocket + N NSStream + N NSNetService + N manual DNS | | Anti-pattern count | N reachability-before-connect + N hardcoded IPs + N missing weak self + N blocking sockets + N missing waiting state | | Network transition coverage | X% of connections handle viability/path changes | | TLS coverage | X% of non-localhost connections use TLS | | Connection cleanup | X% of stored connections have cancel() paths | | **Health** | **MODERN / NEEDS MIGRATION / LEGACY** |
Scoring:
- MODERN: 0 deprecated APIs, 0 CRITICAL anti-patterns, >80% transition coverage, 100% TLS for sensitive data
- NEEDS MIGRATION: <=2 deprecated APIs with migration comments, no CRITICAL anti-patterns, some transition gaps
- LEGACY: >2 deprecated APIs, OR any CRITICAL anti-patterns, OR blocking sockets, OR missing TLS for sensitive data
Output Format
# Networking Audit Results ## Networking Architecture Map [5-10 line summary from Phase 1] ## Summary - CRITICAL: [N] issues - HIGH: [N] issues - MEDIUM: [N] issues - LOW: [N] issues - Phase 2 (pattern detection): [N] issues - Phase 3 (completeness reasoning): [N] issues - Phase 4 (compound findings): [N] issues ## Networking Health Score [Phase 5 table] ## Issues by Severity ### [SEVERITY/CONFIDENCE] [Category]: [Description] **File**: path/to/file.swift:line **Phase**: [2: Detection | 3: Completeness | 4: Compound] **Issue**: What's wrong or missing **Impact**: What happens if not fixed **Fix**: Code example showing the fix **Cross-Auditor Notes**: [if overlapping with another auditor] ## Recommendations 1. [Immediate actions — CRITICAL fixes, deprecated API removal] 2. [Short-term — anti-pattern fixes, transition handling] 3. [Long-term — NetworkConnection migration, architecture improvements]
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)
- IP addresses in comments, docs, or string constants not used for connections
- URLSession usage (correct for HTTP/HTTPS)
- socket() in test/debug code only
- [weak self] in non-NWConnection contexts
- 127.0.0.1 in debug-only code
- NWPathMonitor without transition handlers (monitoring, not connections)
- Missing TLS for localhost/debug connections
Related
For implementation patterns:
axiom-networking skill
For connection troubleshooting: axiom-networking (networking-diag reference)
For API reference: axiom-networking (network-framework-ref reference)
For memory issues from callbacks: axiom-performance skill