ワンクリックで
axiom-audit-storage
Use when the user mentions file storage issues, data loss, backup bloat, or asks to audit storage usage.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Use when the user mentions file storage issues, data loss, backup bloat, or asks to audit storage usage.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance, App Store accessibility review.
Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation Models, @Generable, LanguageModelSession, Tool protocol, eval suites, model-as-judge scoring, SpeechTranscriber, CoreML.
Use when the user wants to triage a CORPUS of production crashes/hangs from an aggregator (Sentry, App Store Connect) — grouped, counted issues — rather than a single crash file.
Use when the user wants to audit test quality, find flaky test patterns, speed up test execution, or prepare for Swift Testing migration.
Use when ANY iOS build fails, test crashes, Xcode misbehaves, or environment issue occurs before debugging code. Covers build failures, compilation errors, dependency conflicts, simulator problems, environment-first diagnostics.
Use when writing ANY async code, actors, threads, or seeing ANY concurrency error. Covers Swift 6 concurrency, @MainActor, Sendable, data races, async/await patterns.
| name | axiom-audit-storage |
| description | Use when the user mentions file storage issues, data loss, backup bloat, or asks to audit storage usage. |
| license | MIT |
| disable-model-invocation | true |
You are an expert at detecting file storage mistakes — both known anti-patterns AND missing/incomplete patterns that cause data loss, backup bloat, sensitive-data exposure, and cross-process invisibility.
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
Skip: *Tests.swift, *Previews.swift, */Pods/*, */Carthage/*, */.build/*, */DerivedData/*, */scratch/*, */docs/*, */.claude/*, */.claude-plugin/*
Glob: **/*.swift, **/Info.plist, **/*.entitlements (excluding test/vendor paths)
Grep for:
- `\.documentDirectory`, `Documents/` — user-visible storage
- `\.cachesDirectory`, `Caches/` — purgeable cache
- `\.applicationSupportDirectory`, `Application Support` — hidden persistent app data
- `NSTemporaryDirectory`, `tmp/` — truly temporary
- `containerURL(forSecurityApplicationGroupIdentifier:` — App Group shared container
- `forUbiquityContainerIdentifier` — iCloud Drive container
- `Library/` — generic library subpaths
Grep for:
- `UserDefaults` — small KV settings
- `Keychain`, `kSecClass` — secure secrets
- `\.write\(to:`, `Data.*write\(`, `FileManager.*createFile` — direct file writes
- `URLResourceValues` — resource attribute customization
- `isExcludedFromBackup` — backup exclusion
- `FileProtectionType`, `\.completeFileProtection`, `\.completeUntilFirstUserAuthentication`, `\.complete` — protection level
Grep for:
- `token`, `password`, `secret`, `apiKey`, `credential`, `auth` (case-insensitive) — sensitive identifiers
- `JWT`, `OAuth`, `refreshToken`, `accessToken` — auth tokens
- file writes of these → should be in Keychain, not files
Read 2-3 representative files (FileManager extension / DownloadManager / CacheManager / SettingsService) to understand:
Write a brief Storage Map (5-10 lines) summarizing:
Present this map in the output before proceeding.
Run all 5 detection patterns. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
Issue: tmp/ is purged aggressively by iOS — at low-storage events, app updates, sometimes between sessions. Anything that needs to survive past a few minutes is at data-loss risk.
Search:
NSTemporaryDirectorytmp/ in URL strings or path components\.itemReplacementDirectory (if used to persist, not as scratch)
Verify: Read matching files; check what's being written and whether the lifecycle is true scratch (delete within seconds/minutes) or persistence-intent.
Fix:Caches/ with isExcludedFromBackup = true.Documents/.Application Support/.Issue: Files >1MB in backed-up locations consume the user's iCloud quota unnecessarily. Re-downloadable or regenerable content should be excluded. Search:
\.documentDirectory.*write, \.applicationSupportDirectory.*writeURLResourceValues.*isExcludedFromBackup
Verify: Read matching files; determine whether the data is regenerable (cache, downloads, derived) or original (user-created).
Fix: Set var values = URLResourceValues(); values.isExcludedFromBackup = true; try url.setResourceValues(values) for regenerable content, OR move it to Caches/ instead.Issue: Default file protection is .completeUntilFirstUserAuthentication. Sensitive data needs .complete; clearly-public data can be .none for performance.
Search:
\.write\(to: and Data\(contentsOf: — write/read sitesFileProtectionType, \.completeFileProtection, \.complete, \.completeUntilFirstUserAuthentication, \.none — explicit protection
Verify: Read matching files; identify whether the data being written is sensitive (tokens, PII, financial) and whether explicit protection is set on the write call or the file's resource values.
Fix: For sensitive data: try data.write(to: url, options: [.atomic, .completeFileProtection]). Better: move secrets to Keychain entirely.Issue: User-visible content hidden in Application Support/, regenerable content in Documents/ (backup bloat), app state in tmp/ (data loss), large data in UserDefaults (perf). Search:
\.applicationSupportDirectory.*\.pdf|\.applicationSupportDirectory.*image|\.applicationSupportDirectory.*photo — user content in hidden directory\.documentDirectory.*cache|\.documentDirectory.*\.tmp|\.documentDirectory.*download — cache/temp content in backed-up directory
Verify: Read matching files; classify the content type and confirm the location matches.
Fix: Apply the location decision tree (see Phase 3 questions for the rule).Issue: UserDefaults loads the entire plist on access. Storing >1MB causes launch-time slowdown and memory pressure. Search:
UserDefaults.*set\(.*Data — Data writes to UserDefaultsUserDefaults.*set\(.*\[ — collection writes (could be large)UserDefaults.*set\(.*encoded — Codable-encoded payloads
Verify: Read matching files; estimate payload size from surrounding code (collection growth, image data, etc.).
Fix: For >1MB: persist as a file in Application Support or use SwiftData / GRDB. UserDefaults should hold only small scalar settings.Using the Storage 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 auth tokens, refresh tokens, and credentials in Keychain (not files)? | Sensitive data on disk | A file write of a token even with .complete protection is weaker than Keychain; files leak via backups, screen recording, sample-from-disk attacks |
| Do extensions / widgets / Watch app share data via an App Group container? | Cross-process invisibility | Without App Group, the extension can't see the app's data — silent feature breakage |
Is there a bounded-size policy for Caches/ (eviction or size cap)? | Unbounded cache growth | iOS purges Caches/ at low-storage events but timing is unpredictable; users see stale-cache hits or sudden empty cache |
| Are temp files actually cleaned up (every NSTemporaryDirectory write has a corresponding removal)? | Temp accumulation between purges | Short-term tmp/ can still accumulate gigabytes between OS-level purge events |
| When a model/entity is deleted, are its associated files (images, attachments, external-storage blobs) also removed? | Orphan files | App container grows indefinitely; backup size compounds |
| If both iCloud Drive AND a local Documents/ path exist, is there a clear policy on which one to use? | Confusion between containers | Both directories may be named Documents/ but live in different containers; users see split state |
| Is there a "low storage" handler that gracefully degrades (stops downloads, evicts cache)? | Hard failure on full disk | Write failures with NSPOSIXErrorDomain 28 surface as crashes or silent data loss |
Do file-protection levels match data sensitivity (tokens=.complete, app data=.completeUntilFirstUserAuthentication, public cache=.none)? | Misaligned protection | Either over-protected (write fails on locked device for a non-secret) or under-protected (sensitive data readable from backups) |
| Is there a migration path when storage layout changes between versions (renamed dirs, moved files)? | Data orphaned by version upgrade | Users on the old version have files at old path; new version doesn't find them |
| For files in iCloud Drive, is there a fallback path when the user is signed out of iCloud? | Hard dependency on iCloud | Sign-out makes the data invisible; app may crash or lose features |
Require evidence from the Phase 1 map — don't speculate without reading the code.
Bump severity for these combinations:
| Finding A | + Finding B | = Compound | Severity |
|---|---|---|---|
| Files in tmp/ (Pattern 1) | Critical user data (created docs, in-progress edits) | Guaranteed data loss on next OS purge | CRITICAL |
| Missing isExcludedFromBackup (Pattern 2) | Auto-grow cache (downloads, generated thumbnails) | User's iCloud quota silently filled, possibly to the point of failed device backups | HIGH |
| Sensitive data in files (Pattern 3) | Missing FileProtection or .none | Token / credential readable from device backup or jailbroken inspection | HIGH |
| Tokens written to disk (any location) | No Keychain alternative | Even with .complete protection, the file is in backup; Keychain items are not | HIGH |
| Wrong location (Pattern 4) | Extension or widget needs to read it | Silent feature failure — extension shows nothing because it can't see the file | HIGH |
| Large UserDefaults (Pattern 5) | Frequent updates (per-keystroke, per-scroll) | Compounding launch slowdown — UserDefaults flushed on every change, full plist rewritten | MEDIUM |
| Caches/ unbounded growth | Low-storage device | Eviction happens at OS-determined time, app loses pending state mid-operation | MEDIUM |
| iCloud Drive Documents/ | Same name as local Documents/ in code | Code path confusion — write to local, read from iCloud, data appears missing | MEDIUM |
| Orphan blob files (no cleanup on delete) | Many delete operations over time | App container grows indefinitely, eventually causing low-storage symptoms | MEDIUM |
Cross-auditor overlap notes:
forUbiquityContainerIdentifier → compound with icloud-auditor (file coordination)@Attribute(.externalStorage) cleanup → compound with swiftdata-auditorsecurity-privacy-scanner.sqlite file location and protection → compound with database-schema-auditor and core-data-auditoraxiom-concurrency| Metric | Value |
|---|---|
| Locations in use | Documents / Caches / App Support / tmp / App Group / iCloud Drive |
| Backup-exclusion coverage | M of N regenerable-content writes set isExcludedFromBackup (Z%) |
| File-protection coverage | M of N writes set explicit FileProtectionType (Z%) |
| Sensitive data in Keychain | yes / partial / no (with file count of leaked secrets) |
| App Group usage | required by extensions / present / missing |
| tmp/ usage | scratch-only / mixed / persistence-intent |
| UserDefaults size discipline | small scalars only / mixed / contains >1MB payloads |
| Health | SAFE / FRAGILE / DANGEROUS |
Scoring:
# Storage Audit Results
## Storage 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
## Storage Health Score
[Phase 5 table]
## Issues by Severity
### [SEVERITY/CONFIDENCE] [Pattern Name]: [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 (data-loss risk, sensitive data on disk)]
2. [Short-term — HIGH fixes (backup discipline, App Group setup, location corrections)]
3. [Long-term — completeness gaps from Phase 3 (Keychain migration, eviction policies, low-storage handling)]
4. [Test plan — reboot persistence, low-storage scenarios, backup size, multi-device sync]
When the audit flags wrong-location issues, use this rule:
digraph storage_location {
"What's being stored?" [shape=diamond];
"Sensitive (token/credential)?" [shape=diamond];
"User-created and visible?" [shape=diamond];
"Regenerable (cache/download)?" [shape=diamond];
"Truly temporary (<1 hour)?" [shape=diamond];
"Keychain" [shape=box];
"Documents/" [shape=box];
"Caches/ + isExcludedFromBackup" [shape=box];
"Application Support/" [shape=box];
"NSTemporaryDirectory" [shape=box];
"What's being stored?" -> "Sensitive (token/credential)?";
"Sensitive (token/credential)?" -> "Keychain" [label="yes"];
"Sensitive (token/credential)?" -> "User-created and visible?" [label="no"];
"User-created and visible?" -> "Documents/" [label="yes"];
"User-created and visible?" -> "Regenerable (cache/download)?" [label="no"];
"Regenerable (cache/download)?" -> "Caches/ + isExcludedFromBackup" [label="yes"];
"Regenerable (cache/download)?" -> "Truly temporary (<1 hour)?" [label="no"];
"Truly temporary (<1 hour)?" -> "NSTemporaryDirectory" [label="yes"];
"Truly temporary (<1 hour)?" -> "Application Support/" [label="no"];
}
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.
Caches/ without explicit backup exclusion (Caches/ is excluded by default — the system handles it)tmp/ written and deleted within the same function call (true scratch)For storage decision framework: axiom-data (skills/storage.md)
For storage debugging (missing files, persistence failures): axiom-data (skills/storage-diag.md)
For file protection details: axiom-data (skills/file-protection-ref.md)
For storage purging policies: axiom-data (skills/storage-management-ref.md)
For iCloud Drive coordination: icloud-auditor agent
For sensitive-data and credentials in Keychain: security-privacy-scanner agent
For SwiftData external-storage cleanup: swiftdata-auditor agent