Skip to content
Back to skills

Schema Review

ASecurity

Use when reviewing a migration diff or schema change for scale hazards — indexes, unsafe migrations, unbounded growth, N+1. Triggers on 'review this migration', 'will this scale'.

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 2, 2026
ai-agentsrustgophpbashsqlnodegitdatabaseperformance

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 2, 2026

npx -y skills add event4u-app/agent-config --skill schema-review --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Schema Review?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Schema Review
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/event4u-app-schema-review/badge)](https://www.skillsdirectory.com/skills/event4u-app-schema-review)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
model_tier: medium
name: schema-review
description: "Use when reviewing a migration diff or schema change for scale hazards — indexes, unsafe migrations, unbounded growth, N+1. Triggers on 'review this migration', 'will this scale'."
domain: engineering
workspaces:
  - engineering
packs:
  - scale-discipline
trust:
  level: professional
install:
  default: false
  removable: true
---

# schema-review

## When to use

- A migration diff, new migration file, or schema change is under review
  and the question is scale-shaped: indexes, reversibility, growth,
  query patterns against the new columns.
- The user asks "will this scale", "review this migration", "check the
  schema", or a PR touches `migrations/`, `schema.prisma`, or raw `.sql`
  migration files.
- NOT for runtime performance analysis of live traffic (no APM here —
  route to `performance-analysis`) and NOT for authoring a new migration
  from scratch (route to `laravel-migration` or the stack-native tool,
  then come back with the diff).

## Procedure

1. **Detect the stack surface** in the diff: Laravel migrations
   (`database/migrations/*.php`), Prisma (`schema.prisma` +
   `prisma/migrations/**/migration.sql`), raw SQL (`*.sql`). One diff can
   carry several.
2. **Run the deterministic linter** on the touched files plus the query
   surface that references the changed tables:

   ```bash
   npx tsx node_modules/@event4u/agent-config/src/scripts/lint_persistence.ts -- --dir <path> [--stack eloquent|prisma|raw-sql] --format json
   ```

   The linter emits `gate` findings (pattern-detected: F1 N+1, F2
   index-parity, F3 unbounded reads, F6 migration-safety, F7
   growth-budget, F8 audit-coverage, F9 sync-in-handler, F11 non-durable
   async) and `advice` findings (heuristics — never treat as blockers).
3. **Walk the gap table** — for every `gate` finding decide: fix, or
   waiver with a reason (`// no-index: <reason>`, `// sync-required:
   <reason>`, `-- no-retention: <reason>`, …). An empty waiver reason is
   itself a finding.
4. **Check the R-A6/R-A7 invariants by hand** where the linter is blind:
   reversibility of data transformations, retention policy for any new
   append-only table (the `-- retention: <policy>` line), backfill plan
   for new NOT NULL columns on large tables.
5. **Report waiver density neutrally** — count waivers per rule; state
   both readings (informed exceptions vs rule misfit) and let the human
   decide. Density alone is never a verdict.

## Output

The review MUST contain:

1. **Gap table** — one row per finding: `rule · file:line · finding ·
   proposed action (fix | waiver | accepted)`, gate findings first,
   advice findings clearly marked as advice.
2. **Waiver-density line** — `N waivers across M findings` with the
   two-reading note (informed exceptions vs rule misfit).
3. A one-line verdict: ready / needs fixes / needs human schema decision
   — never a bare "looks good" without the table.

## Gotcha

- The linter proves **pattern presence**, not instance-level correctness
  — a flagged `Http::` call in a controller may be legitimately sync
  (then it gets a `// sync-required:` waiver with a reason), and a clean
  run does not prove the schema scales. Say what was checked, not more.
- Prisma's `@relation` fields are indexed implicitly on some connectors
  and not on others — when the linter reports a missing FK index on a
  Prisma model, verify the connector before calling it a defect.

## Do NOT

- Do NOT gate a review on `advice`-tier findings (F4 denormalization,
  F10 event-decoupling heuristics) — they are review inputs, not
  blockers.
- Do NOT strip or rewrite existing waivers — surface stale-looking ones
  and ask.
- Do NOT invent index recommendations for columns the query surface
  never filters or orders by — index parity cuts both ways; unused
  indexes cost write throughput.

Files in this skill

  • SKILL.md3.8 KB
  • evals/triggers.json1.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…