axiom-audit-database-schema
Use when the user mentions database schema review, migration safety, GRDB migration audit, or SQLite schema checking.
What this skill does
# Database Schema Auditor Agent
You are an expert at detecting database schema and migration violations — both known anti-patterns AND missing/incomplete patterns that cause data loss, migration crashes, silent corruption, and integrity failures in SQLite/GRDB apps.
## Tool Use Is Mandatory
Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.
- Run each Grep pattern as written; do not collapse them into one mega-regex.
- Run the Read verifications each section calls for.
- "Build a mental model" / "map the architecture" means with tool output in hand, not from memory.
## Files to Exclude
Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`
## Phase 1: Map Schema & Migration Architecture
### Step 1: Identify Database Framework and Configuration
```
Glob: **/*.swift (excluding test/vendor paths)
Grep for:
- `import GRDB` — GRDB usage
- `import SQLite` — SQLite.swift wrapper
- `import StructuredQueries`, `import SQLiteData` — Point-Free's sqlite-data
- `DatabasePool`, `DatabaseQueue` — GRDB connection types
- `Configuration()`, `prepareDatabase` — connection configuration
- `PRAGMA foreign_keys` — FK enforcement
- `PRAGMA journal_mode` — WAL vs rollback
```
### Step 2: Identify Migration Surface
```
Grep for:
- `DatabaseMigrator` — GRDB migrator
- `registerMigration` — migration registrations
- `eraseDatabaseOnSchemaChange` — destructive flag
- `ALTER TABLE`, `CREATE TABLE`, `CREATE INDEX`, `DROP TABLE`, `DROP COLUMN` — raw schema DDL
- `addColumn`, `dropTable`, `renameColumn`, `addForeignKey` — GRDB DSL
- `try db.execute(sql:` — raw SQL execution
```
### Step 3: Map the Schema
Read 2-3 key files (the migration file, the database setup file, one model file). Note:
- How many migrations are registered, in what order
- Which tables exist and their primary keys
- Which tables have FOREIGN KEY references between them
- Whether `PRAGMA foreign_keys = ON` is set in `prepareDatabase`
- Whether writes go through `db.write { }` (implicit transaction) or raw `execute`
### Output
Write a brief **Schema Map** (5-10 lines) summarizing:
- Framework (GRDB / SQLite.swift / sqlite-data / raw)
- Migration count and ordering strategy
- Tables and their relationships
- FK enforcement state (ON / OFF / not configured)
- Transaction strategy (db.write everywhere / mixed / raw execute)
Present this map in the output before proceeding.
## Phase 2: Detect Known Anti-Patterns
Run all 10 detection patterns. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.
### Pattern 1: ADD COLUMN NOT NULL Without DEFAULT (CRITICAL/HIGH)
**Issue**: SQLite requires DEFAULT for NOT NULL columns added to existing tables. Without it, the migration crashes for any table with existing rows.
**Search**: `ADD\s+COLUMN.*NOT\s+NULL`
**Verify**: Read matching files; check for `DEFAULT` on the same statement.
**Fix**: `ADD COLUMN name TEXT NOT NULL DEFAULT ''`
### Pattern 2: DROP TABLE on User Data (CRITICAL/HIGH)
**Issue**: Permanently deletes all user data in that table. No undo.
**Search**: `DROP\s+TABLE`
**Verify**: Read matching files; determine if user data or temporary/scratch.
**Fix**: Rename instead, or migrate data to a new table first.
### Pattern 3: DROP COLUMN (CRITICAL/HIGH)
**Issue**: SQLite supports DROP COLUMN since 3.35.0 (iOS 16+). On older OS, crashes. Even on supported versions, restricted (no PRIMARY KEY, UNIQUE, or referenced columns).
**Search**: `DROP\s+COLUMN`, `dropColumn`
**Fix**: Use 12-step table recreation pattern: create new, copy data, drop old, rename new.
### Pattern 4: ALTER TABLE Without Idempotency Check (CRITICAL/HIGH)
**Issue**: `ADD COLUMN` on an existing column crashes with "duplicate column name". Beta testers re-running the migration crash.
**Search**: `ADD\s+COLUMN`, `addColumn`
**Verify**: Read matching files; check for `PRAGMA table_info`, `ifNotExists:`, or do-catch.
**Fix**: GRDB's `addColumn(ifNotExists:)`, or check `PRAGMA table_info` first, or wrap in do-catch.
### Pattern 5: INSERT OR REPLACE Breaks Foreign Keys (HIGH/HIGH)
**Issue**: `INSERT OR REPLACE` deletes the old row before inserting the new one. This triggers `ON DELETE CASCADE`, silently destroying child records.
**Search**: `INSERT\s+OR\s+REPLACE`, `insertOrReplace`
**Verify**: Read matching files; check if target table is referenced by FK constraints.
**Fix**: `INSERT ... ON CONFLICT(id) DO UPDATE SET ...` (UPSERT).
### Pattern 6: Foreign Key Addition Without Data Validation (HIGH/MEDIUM)
**Issue**: Adding FK when orphaned rows exist fails the migration or leaves the DB inconsistent.
**Search**: `FOREIGN\s+KEY`, `REFERENCES`, `addForeignKey`
**Verify**: Read matching files; check for orphan-cleanup or `PRAGMA foreign_key_check` before constraint addition.
**Fix**: Clean up orphans first, or run `PRAGMA foreign_key_check` to validate.
### Pattern 7: PRAGMA foreign_keys Not Enabled (HIGH/HIGH)
**Issue**: SQLite ships with foreign keys OFF. Without enabling them, all FK constraints are silently ignored — data integrity is not enforced.
**Search**: `PRAGMA\s+foreign_keys`, `foreignKeysEnabled`
**Verify**: If FK constraints exist (Pattern 6 found `FOREIGN KEY`) but no PRAGMA setting present, flag it.
**Fix**: GRDB: `configuration.prepareDatabase { db in try db.execute(sql: "PRAGMA foreign_keys = ON") }`
### Pattern 8: RENAME COLUMN Without Migration Strategy (MEDIUM/MEDIUM)
**Issue**: RENAME COLUMN (SQLite 3.25.0+, iOS 12+) works but doesn't update Swift code. Raw SQL using the old name silently breaks.
**Search**: `RENAME\s+COLUMN`, `renameColumn`
**Verify**: Read matching files; grep the codebase for the old column name in raw SQL strings.
**Fix**: Update all raw SQL references to the new name.
### Pattern 9: Batch Insert Outside Transaction (MEDIUM/MEDIUM)
**Issue**: Each INSERT outside a transaction triggers a disk sync. 1000 inserts = 1000 syncs = 30 seconds instead of < 1 second.
**Search**: `for.*insert\(db\)`, `for.*execute.*INSERT`
**Verify**: Read matching files; check whether the loop is inside `db.write { }` or `db.inTransaction { }`.
**Fix**: Wrap in a single transaction: `try db.write { db in for item in items { try item.insert(db) } }`
### Pattern 10: CREATE TABLE/INDEX Without IF NOT EXISTS (MEDIUM/LOW)
**Issue**: CREATE without IF NOT EXISTS crashes if the object already exists. Breaks idempotency for re-run scenarios.
**Search**: `CREATE\s+TABLE\s+(?!IF)`, `CREATE\s+INDEX\s+(?!IF)`, `CREATE\s+UNIQUE\s+INDEX\s+(?!IF)`
**Note**: Inside `registerMigration` runs once by design, but IF NOT EXISTS still recommended for safety.
**Fix**: `CREATE TABLE IF NOT EXISTS`, `CREATE INDEX IF NOT EXISTS`.
## Phase 3: Reason About Schema Completeness
Using the Schema 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 |
|----------|----------------|----------------|
| Is `PRAGMA foreign_keys = ON` set in `prepareDatabase`, given that FK constraints exist? | Silent FK enforcement bypass | Constraints declared but ignored — orphaned rows accumulate without error |
| Does every schema-changing migration handle existing rows (DEFAULT, NULL, backfill)? | Production-data crashes | Migration that works on empty DB crashes on a populated one |
| Is there an upgrade path from the oldest supported app version to current? | Unreachable schema state | Users on old versions skip intermediate migrations or crash |
| Are migrations append-only, or do later migrations modify earlier ones? | Migration corruption | Modifying past migrations changes the schema for users who already ran them |
| Is there an `eraseDatabaseOnSchemaChange = false` (or equivalent) commitment in production builds? | Accidental Related in Security
mac-ops
IncludedComprehensive macOS workstation operations — diagnose kernel panics, identify failing drives, audit launchd startup items, decode wake reasons, triage TCC permission denials, manage APFS snapshots, recover from no-boot. Use for: Mac is slow, slow bootup, won't boot, kernel panic, kernel_task hot, mds_stores CPU, photoanalysisd, cloudd, login loop, gray screen, sleep wake failure, drive failing, IO errors, APFS snapshots eating space, Time Machine local snapshots, Spotlight indexing, launchd, LaunchAgent, LaunchDaemon, login items, TCC permissions, Full Disk Access, Screen Recording denied, Gatekeeper, quarantine, com.apple.quarantine, app is damaged, helper tool, /Library/PrivilegedHelperTools, pmset, wake reasons, dark wake, sysdiagnose, panic.ips, DiagnosticReports, configuration profile, MDM profile, remote diagnostics over SSH.
a11y-audit
IncludedRun accessibility audits on web projects combining automated scanning (axe-core, Lighthouse) with WCAG 2.1 AA compliance mapping, manual check guidance, and structured reporting. Output is configurable: markdown report only, markdown plus machine-readable JSON, or markdown plus issue tracker integration. Use this skill whenever the user mentions "accessibility audit", "a11y audit", "WCAG audit", "accessibility check", "compliance scan", or asks to check a web project for accessibility issues. Also trigger when the user wants to verify WCAG conformance or map findings to a specific standard (CAN-ASC-6.2, EN 301 549, ADA/AODA).
erpclaw
IncludedAI-native ERP system with self-extending OS. Full accounting, invoicing, inventory, purchasing, tax, billing, HR, payroll, advanced accounting (ASC 606/842, intercompany, consolidation), and financial reporting. 413 actions across 14 domains, 43 expansion modules. Constitutional guardrails, adversarial audit, schema migration. Double-entry GL, immutable audit trail, US GAAP.
assess
IncludedAssesses and rates quality 0-10 across multiple dimensions (correctness, maintainability, security, performance, testability, simplicity) with pros/cons analysis. Compares against project conventions and prior decisions from memory. Produces structured evaluation reports with actionable improvement suggestions. Use when evaluating code, designs, architectures, or comparing alternative approaches.
spring-boot-security-jwt
IncludedProvides JWT authentication and authorization patterns for Spring Boot 3.5.x covering token generation with JJWT, Bearer/cookie authentication, database/OAuth2 integration, and RBAC/permission-based access control using Spring Security 6.x. Use when implementing authentication or authorization in Spring Boot applications.
code-hardcode-audit
IncludedDetect hardcoded values, magic numbers, and leaked secrets. TRIGGERS - hardcode audit, magic numbers, PLR2004, secret scanning.