Best for
- ALWAYS use when writing, reviewing, or planning PostgreSQL schema changes — ALTER TABLE, CREATE/DROP INDEX, column type changes, constraint additions, RLS policy changes, or any DDL touching production tables.
johnqtcg/awesome-skills/skills/pg-migration/SKILL.md
PostgreSQL schema migration safety reviewer and DDL generator. ALWAYS use when writing, reviewing, or planning PostgreSQL schema changes — ALTER TABLE, CREATE/DROP INDEX, column type changes, constraint additions, RLS policy changes, or any DDL touching production tables. Covers lock-level analysis, CREATE INDEX CONCURRENTLY, NOT VALID constraint patterns, transactional DDL rollback, expand-contract for table rewrites, pg_repack for online reorganisation, phased rollout design, and backward comp
Decision brief
PostgreSQL schema migration safety reviewer and DDL generator. Covers lock-level analysis, CREATE INDEX CONCURRENTLY, NOT VALID constraint patterns, transactional DDL rollback, expand-contract for table rewrites, pg_repack for online reorganisation, phased rollout design, and backward comp
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/johnqtcg/awesome-skills --skill "skills/pg-migration"Inspect the Agent Skill "pg-migration" from https://github.com/johnqtcg/awesome-skills/blob/d933bc88237f7a18a7ecf01e5d97a745b083df0f/skills/pg-migration/SKILL.md at commit d933bc88237f7a18a7ecf01e5d97a745b083df0f. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. Lock classification — determine lock level for each DDL. The governing rule from the ALTER TABLE reference: "An ACCESS EXCLUSIVE lock is acquired unless explicitly noted. When multiple subcommands are given, the lock acquired will be the strictest one required by any subcomma…
Review the “9.3 Risk Assessment Table” section in the pinned source before continuing.
Review the “9.7 Rollback Plan (per-phase; note transactional vs manual rollback)” section in the pinned source before continuing.
Review the “Quick Reference” section in the pinned source before continuing.
In scope — schema migration safety for PostgreSQL 14–18 (the community-supported majors as of 2026-08; 12 and 13 are EOL, 19 is unreleased):
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 95/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 30 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
| If you need to… | Go to |
|---|---|
| Understand what this skill covers | §1 Scope |
| Check mandatory prerequisites | §2 Mandatory Gates |
| Choose review depth | §3 Depth Selection |
| Handle incomplete context | §4 Degradation Modes |
| Analyze DDL safety item by item | §5 DDL Safety Checklist |
| Design a phased execution plan | §6 Execution Plan |
| Avoid common migration mistakes | §7 Anti-Examples |
| Score the review result | §8 Scorecard |
| Format review output | §9 Output Contract |
| Look up DDL lock levels by operation | references/pg-ddl-lock-matrix.md |
| Plan a large-table (>10M rows) change | references/large-table-migration.md |
In scope — schema migration safety for PostgreSQL 14–18 (the community-supported majors as of 2026-08; 12 and 13 are EOL, 19 is unreleased):
Out of scope — delegate to dedicated skills:
postgresql-best-practisego-code-reviewer or language-specific reviewersecurity-reviewExecute gates sequentially. Each gate has a STOP condition.
| Item | Why it matters | If unknown |
|---|---|---|
| PG version (14 / 15 / 16 / 17 / 18) | DDL behavior differs by version (REINDEX CONCURRENTLY needs 12+, DETACH PARTITION CONCURRENTLY needs 14+) | Assume PG 14 — the oldest supported major, so the least capable. If the user names 12 or 13, flag it as EOL before reviewing |
| Table row count | Determines lock tolerance and tool choice | Ask, or estimate via pg_class.reltuples |
| Table size (data + indexes) | Large tables need CONCURRENTLY / expand-contract | Estimate via pg_total_relation_size() |
| Active QPS on table | High-traffic amplifies lock contention | Assume high-traffic |
| Replication type | Streaming vs logical; DDL handling differs | Assume streaming replica |
| Maintenance window | Some DDL needs low-traffic period | Assume none (zero-downtime required) |
| Migration framework | Flyway/Alembic/golang-migrate affect transaction handling | Detect from project files |
| Extensions in use | Some DDL depends on extensions (pg_repack, pgcrypto) | Check \dx |
If database access is available, run:
SELECT version();
SELECT relname, reltuples::bigint, pg_total_relation_size(oid) FROM pg_class WHERE relname = '<table>';
SELECT * FROM pg_extension;
STOP: Cannot determine whether the target is PostgreSQL. Redirect to appropriate skill.
PROCEED: At least PG version and table name known or conservatively assumed. Record all assumptions.
| Mode | Trigger | Output |
|---|---|---|
| review | User provides existing migration SQL/file | Safety analysis of provided DDL |
| generate | User describes desired schema change | Migration SQL + safety analysis |
| plan | User describes goal without specifics | Phased migration plan + rationale |
STOP: Request is not migration-related. Redirect to postgresql-best-practise.
PROCEED: Migration intent confirmed.
For each DDL statement, classify by lock impact:
| Risk | Lock level | Examples | Required action |
|---|---|---|---|
| SAFE | ShareUpdateExclusiveLock or lower — reads and writes continue | CREATE/DROP INDEX CONCURRENTLY, VALIDATE CONSTRAINT, SET STATISTICS, fillfactor/autovacuum storage params | Standard session guards |
| WARN | ShareLock or ShareRowExclusiveLock — reads continue, writes block | plain CREATE INDEX (ShareLock); ADD FOREIGN KEY with or without NOT VALID (ShareRowExclusive on both the altered and the referenced table) | Off-peak window + monitoring, on both tables |
| UNSAFE | AccessExclusiveLock on a table >1M rows, or any full table rewrite | most ALTER TABLE subcommands, incl. ADD CHECK (with or without NOT VALID); int→bigint; volatile-DEFAULT ADD COLUMN | Expand-contract or create-swap-rename + staged rollout (see §5.2 item 6) |
NOT VALID shortens how long the lock is held, never its class — an FK is
ShareRowExclusive either way, a CHECK is AccessExclusive either way (AE-18).
STOP: Any UNSAFE item has no mitigation plan.
PROCEED: Every DDL statement has risk level and mitigation.
Before delivering output, verify all §9 Output Contract sections present. §9.9 Uncovered Risks must never be empty.
| Depth | When to use | Gates | References to load |
|---|---|---|---|
| Lite | ≤3 DDL statements, none of which scans or rewrites the table (ADD nullable column, CONCURRENTLY index) | 1–4 | None |
| Standard | 4–15 statements, or any operation that holds AccessExclusiveLock for a scan or rewrite | 1–4 | pg-ddl-lock-matrix.md |
| Deep | >15 statements, table >10M rows, or multi-step data migration | 1–4 | Both reference files |
"Lite" is about duration, not lock class. ADD COLUMN … NULL still takes
AccessExclusiveLock (verified on live 14.23/18.4) — briefly, but it still queues behind
every open transaction and blocks everything behind it while waiting, so it still needs
lock_timeout. Only ShareUpdateExclusive operations are genuinely non-blocking.
Force Standard or higher when any signal appears: column type change, NOT NULL addition, PK modification, FK/CHECK constraint, RLS policy change, partition restructuring, column removal, extension upgrade.
When context is incomplete, degrade gracefully — never fabricate information.
| Available context | Mode | What you can do | What you cannot do |
|---|---|---|---|
| Full (version, size, QPS, replicas) | Full | All checklist items; lock-time estimates conditional on a stated I/O rate, with the assumption written out | Precise wall-clock. Duration depends on production I/O throughput, cache state, and how long the longest open transaction makes the DDL wait for its lock — none of which are in the schema |
| Version + size known, others unknown | Degraded | Full checklist with conservative assumptions | Precise lock-time estimates |
| Only migration SQL, no context | Minimal | Static DDL analysis, flag all unknowns | Version-specific advice, replication assessment |
| No SQL (planning request) | Planning | Generate migration plan from requirements | Review existing SQL |
Hard rule: Never claim "SAFE" without evidence. In Degraded/Minimal mode, mark items as "SAFE (assumed — verify against production)" and list all assumptions in §9.9 Uncovered Risks.
Execute every item for each DDL statement. Mark SAFE / WARN / UNSAFE with evidence.
ALTER TABLE reference: "An ACCESS EXCLUSIVE lock is acquired unless explicitly noted. When multiple subcommands are given, the lock acquired will be the strictest one required by any subcommand."
AccessExclusiveLock: blocks ALL operations including SELECT — the default for ALTER TABLE. When uncertain → load references/pg-ddl-lock-matrix.md.ShareRowExclusiveLock: blocks writes, allows reads. ADD FOREIGN KEY is this class, on both the altered table and the referenced table. ADD CHECK is not — it is AccessExclusive. Never state a combined rule for FK and CHECK.ShareLock: blocks writes but allows reads (e.g., CREATE INDEX non-concurrently).ShareUpdateExclusiveLock: allows concurrent reads AND writes (e.g., CREATE INDEX CONCURRENTLY, VALIDATE CONSTRAINT, SET STATISTICS, fillfactor/autovacuum storage parameters).ALGORITHM= hint — the lock level is determined by the operation type.1b. Never batch subcommands of different lock classes. Because a multi-subcommand ALTER TABLE escalates to the strictest lock, appending a cheap subcommand to a low-lock one destroys the benefit:
-- WRONG: the ADD COLUMN drags the whole statement to AccessExclusive
ALTER TABLE orders
ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID,
ADD COLUMN note text;
-- RIGHT: one statement per lock class
ALTER TABLE orders ADD COLUMN note text;
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
lock_timeout — mandatory before every DDL, but the correct form depends on whether the statement runs inside a transaction block. Getting this wrong is silent: SET LOCAL outside a transaction "emits a warning and otherwise has no effect", so the guard you think you set does not exist.
Case A — transactional DDL (the default). Use SET LOCAL; it reverts automatically on COMMIT/ROLLBACK:
BEGIN;
SET LOCAL lock_timeout = '3s';
SET LOCAL statement_timeout = '30s';
ALTER TABLE users ADD COLUMN bio text;
COMMIT;
Case B — statements that cannot be in a transaction block (CREATE/DROP INDEX CONCURRENTLY, REINDEX CONCURRENTLY, DETACH PARTITION CONCURRENTLY). SET LOCAL is a no-op here. Use session-level SET and reset afterwards:
SET lock_timeout = '3s';
SET statement_timeout = 0; -- see item 3: never cap a concurrent build
CREATE INDEX CONCURRENTLY idx_orders_date ON orders (created_at);
RESET statement_timeout;
RESET lock_timeout;
Equivalent out-of-band forms: PGOPTIONS="-c lock_timeout=3s" psql …, or ALTER ROLE migrator SET lock_timeout = '3s'.
Without lock_timeout, DDL queues indefinitely on its lock and every query behind it stalls.
CONCURRENTLY for indexes — CREATE INDEX CONCURRENTLY takes ShareUpdateExclusiveLock instead of ShareLock, allowing concurrent writes. Plain CREATE INDEX blocks all writes for the whole build. Always use CONCURRENTLY on production tables. Two hard caveats:
statement_timeout around it. statement_timeout aborts any statement that exceeds it, and a concurrent build on a large table can run for hours. A 30s cap kills the build and leaves an INVALID index. Guard the lock wait with lock_timeout; leave statement_timeout at 0 for the build.NOT VALID for constraints — NOT VALID skips the row-validation scan, so it shortens the duration the lock is held. It does not change the lock class. Follow up with VALIDATE CONSTRAINT (ShareUpdateExclusiveLock, non-blocking):
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT fk_user; -- non-blocking
ADD ... NOT VALID is AccessExclusive but brief; the bare form holds AccessExclusive for the whole scan.NOT VALID: the server raises cannot add NOT VALID foreign key on partitioned table, so the two-step pattern is unavailable — plan the single-step addition or attach pre-validated partitions. PG 18 accepts it. Verified on live 14.23/15/16/17/18.4. Check the target version before emitting SQL that would fail.ADD COLUMN with DEFAULT — the gate is volatility, not the presence of a DEFAULT. A non-volatile DEFAULT is stored in catalog metadata and requires no rewrite (PG 11+). A volatile DEFAULT (random(), clock_timestamp(), gen_random_uuid()) rewrites the entire table and its indexes on every version. Check the default expression's volatility before calling this safe.
Column type change — the documented exemption is narrow: no rewrite only when the USING clause does not change the column contents and the old type is binary coercible to the new type (or an unconstrained domain over it). Everything else rewrites.
varchar(N) → varchar(M) widening; text ↔ varchar with no collation change.int → bigint. int4 is not binary coercible to int8. Integer widening is not cheap — this is the most common false assumption in PostgreSQL migration planning.numeric(10,2) → numeric(12,4), and any collation change (index rebuild mandatory even if the heap is untouched).pg_repack cannot change a schema — it reorganises a table under its existing
definition and has no column-type option. Use expand-contract, create-swap-rename,
or a logical-replication cutover. pg_repack afterwards only if you measure bloat: a
rewriting ALTER builds a fresh compact heap and leaves none, whereas the batched
UPDATEs of an expand-contract backfill do. references/large-table-migration.md §1.Constraint idempotency — PostgreSQL lacks ADD CONSTRAINT IF NOT EXISTS, so guards are hand-written, and both common forms are wrong in a way that reports success:
conrelid. Constraint names are unique per table, not per database, so a bare conname check skips the migration whenever any other table carries that name (AE-16).pg_get_constraintdef() and RAISE EXCEPTION on mismatch — never skip. CREATE INDEX IF NOT EXISTS has the identical hole: an existing idx_x ON t (amt) silently survives a migration asking for idx_x ON t (note). Both verified on a live server.Full template for both: AE-19 in references/migration-anti-examples.md. Index guards additionally need schema scoping (pg_indexes.schemaname, or a relnamespace join on pg_class).
FK cascade risk — ON DELETE CASCADE on large parent → uncontrolled write amplification. Ensure FK target columns are indexed (critical for CASCADE performance).
Deployment ordering — same as MySQL: column add → schema first, then app; column remove → app first, then schema; column rename → create new + dual-write → drop old.
Rollback feasibility — PostgreSQL's transactional DDL means most DDL can be rolled back within a transaction. However:
Session timeouts — every migration must set lock_timeout. Pick the form by execution context (§5.1 item 2): SET LOCAL inside a transaction block, session-level SET + RESET for statements that cannot be in one. statement_timeout should bound ordinary DDL but must be 0 (or unset) around CONCURRENTLY builds.
Disk / WAL space — table rewrite creates new heap + indexes (~2× table size). CONCURRENTLY index build needs temporary disk. Check pg_total_relation_size().
Vacuum after migration — large backfills create dead tuples. Run ANALYZE <table> after migration; consider manual VACUUM if autovacuum lag is expected.
Statement granularity — wrap related DDL in a single transaction where possible (PostgreSQL advantage), but never batch subcommands of different lock classes into one ALTER TABLE (item 1b). Exception: CONCURRENTLY must be outside transactions.
In scope, but no automated lint rule covers these — review by hand and record the outcome in §9.9. Details and checklists: references/replication-rls-extensions.md.
Logical replication does not replicate DDL. Recording "replication type" is not enough. Apply additive DDL on every subscriber first, then the publisher; reverse for removals. Otherwise replication halts and the subscription falls behind. Streaming replication needs none of this, but a table rewrite ships the entire rewritten heap as WAL — estimate that against replica bandwidth.
RLS policy changes take AccessExclusiveLock. ENABLE ROW LEVEL SECURITY with no policy denies all rows to non-owner roles, and testing as the table owner proves nothing (owners bypass policies). Add policies before enabling; test as the application role.
Extension management — CREATE/ALTER EXTENSION ... UPDATE runs the extension's own scripts, taking whatever locks its author chose. Pin the version, read the upgrade script, and treat it as unbounded-risk DDL.
Standard phased pattern for zero-downtime migration:
references/large-table-migration.md §3)VALIDATE CONSTRAINT (non-blocking), add NOT NULLEach phase: Pre-condition → SQL (with lock_timeout) → Validation → Rollback → Go/No-go.
For tables >10M rows needing a schema change, use expand-contract or create-swap-rename —
not pg_repack, which cannot alter a schema, takes AccessExclusiveLock twice, and by default
kills the backends blocking it. references/large-table-migration.md §1.
-- WRONG: blocks all writes for entire index build duration (ShareLock)
CREATE INDEX idx_orders_date ON orders (created_at);
-- RIGHT: non-blocking index build
CREATE INDEX CONCURRENTLY idx_orders_date ON orders (created_at);
NOT VALID shortens how long the lock is held; it never changes the lock class.
-- WRONG: ShareRowExclusive on orders AND on users, held for the whole validating scan.
-- Reads still work; every write to either table blocks for minutes on a large table.
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
-- RIGHT: same ShareRowExclusive class, but held only briefly, then a non-blocking validation
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT fk_user; -- ShareUpdateExclusive + RowShare on users
A CHECK is a different class — AccessExclusive either way, so it blocks reads too (AE-18). On a partitioned table the FK two-step is only available from PG 18 (§5.1 item 4).
-- WRONG: no guard at all — waits indefinitely, blocking every query behind it
ALTER TABLE users ADD COLUMN bio TEXT;
-- WRONG: CONCURRENTLY cannot be in a transaction block, so there is no transaction for
-- SET LOCAL to scope to. PostgreSQL warns and the timeout is NEVER APPLIED.
SET LOCAL lock_timeout = '3s';
CREATE INDEX CONCURRENTLY idx_orders_date ON orders (created_at);
-- RIGHT (in a transaction): SET LOCAL, auto-reverts on COMMIT
BEGIN;
SET LOCAL lock_timeout = '3s';
ALTER TABLE users ADD COLUMN bio TEXT;
COMMIT;
-- RIGHT (cannot be in a transaction): session-level SET, then RESET
SET lock_timeout = '3s';
SET statement_timeout = 0;
CREATE INDEX CONCURRENTLY idx_orders_date ON orders (created_at);
RESET statement_timeout;
RESET lock_timeout;
-- WRONG: full table rewrite with AccessExclusiveLock on 50M-row table
ALTER TABLE events ALTER COLUMN payload TYPE jsonb USING payload::jsonb;
-- ALSO WRONG: pg_repack cannot change a schema — it has no column-type option at all
-- RIGHT: expand-contract — add nullable, batch-backfill, dual-write, cut reads, drop later
ALTER TABLE events ADD COLUMN payload_jsonb jsonb;
Alternatives when expand-contract does not fit: create-swap-rename, or a logical-replication
cutover. All three in references/large-table-migration.md §1–§2.
-- WRONG: PostgreSQL does NOT support IF NOT EXISTS for constraints — this is a syntax error
ALTER TABLE orders ADD CONSTRAINT IF NOT EXISTS fk_user FOREIGN KEY (user_id) REFERENCES users(id);
-- RIGHT: use DO block with pg_constraint check (see §5.2 item 7)
-- WRONG: "WARN — table name 'OrderItems' uses CamelCase"
-- RIGHT: only flag naming if it causes functional problems (quoting issues, ORM conflicts)
Extended anti-examples (AE-7 through AE-19) in references/migration-anti-examples.md — including
short statement_timeout around a concurrent build (AE-14), mixed lock classes in one
ALTER TABLE (AE-15), unqualified constraint guards (AE-16), and int → bigint treated as
metadata-only (AE-17).
lock_timeout set before every DDL, in the form matching its execution context — SET LOCAL inside a transaction block, session-level SET + RESET for CONCURRENTLY statements (which cannot be in one). A SET LOCAL outside a transaction block is a FAIL: it only warns and has no effect.CREATE INDEX CONCURRENTLY (not plain CREATE INDEX) on production tables, outside any transaction block, without a short statement_timeoutNOT VALID + VALIDATE CONSTRAINT two-step on tables >100K rows. N/A for an FK on a partitioned table below PG 18 — the server rejects NOT VALID there (§5.1 item 4), so FAIL would penalise the only SQL that runs. Record the single-step addition and its write-freeze window in §9.9.ADD CONSTRAINT)LIMIT/OFFSETstatement_timeout set alongside lock_timeoutANALYZE scheduled after large backfillsVerdict: X/N; Critical: Y/3; Standard: Z/A; Hygiene: W/4.
N is the total number of applicable items and A is the number of applicable
Standard items. PASS requires: Critical 3/3 AND Standard Z/A ≥80% AND Hygiene ≥3/4.
N/A is excluded from both denominators, never counted as a pass. For example, one
Standard N/A yields X/11 overall; Standard 3/4 is then 75% and FAILS the unchanged
≥80% bar. Record every N/A reason in §9.9.
Every migration review MUST produce these sections. Write "N/A — [reason]" if inapplicable.
### 9.1 Context Gate
| Item | Value | Source |
### 9.2 Depth & Mode
[Lite/Standard/Deep] × [review/generate/plan] — [rationale]
### 9.3 Risk Assessment Table
| # | DDL Statement | Lock Level | Risk | Notes |
### 9.4 Execution Plan (Standard/Deep; "N/A — Lite" for Lite)
### 9.5 Migration SQL (with lock_timeout, CONCURRENTLY, NOT VALID as applicable)
### 9.6 Validation SQL
### 9.7 Rollback Plan (per-phase; note transactional vs manual rollback)
### 9.8 Post-Deploy Checks
### 9.9 Uncovered Risks (MANDATORY — never empty)
| Area | Reason | Impact | Follow-up |
Volume rules:
Scorecard summary (append after §9.9):
Scorecard: X/N — Critical Y/3, Standard Z/A, Hygiene W/4 — PASS/FAIL
Data basis: [full context | degraded | minimal | planning]
| Condition | Load |
|---|---|
| Standard or Deep depth | references/pg-ddl-lock-matrix.md |
| Deep depth, or table >10M rows | references/large-table-migration.md |
| Extended anti-example matching | references/migration-anti-examples.md |
| Logical replication, RLS, or extension DDL in scope | references/replication-rls-extensions.md |
Frequently asked questions
PostgreSQL schema migration safety reviewer and DDL generator. Covers lock-level analysis, CREATE INDEX CONCURRENTLY, NOT VALID constraint patterns, transactional DDL rollback, expand-contract for table rewrites, pg_repack for online reorganisation, phased rollout design, and backward comp
The source record exposes this install command: npx skills add https://github.com/johnqtcg/awesome-skills --skill "skills/pg-migration". Inspect the command and pinned source before running it.
Alternatives
narrative-io/narrative-skills-marketplace
Translate a fuzzy analytical question into a rigorous investigation plan. Interrogates the ask, grounds the plan in the available data dictionary, applies analytical best practices, and produces a structured brief of query specifications for a downstream query-writing skill. Plans, does not write SQL. Use when: "why did X drop", "is there a relationship between A and B", "who are our highest-value customers", "what's driving the change in Y", "investigate this trend", "design an analysis for", "
JasonColapietro/suede-creator-skills
Suede-owned retention discipline for voluntary and involuntary churn: cancel flows, pause paths, evidence-based save offers, failed-payment recovery, proactive signals, and win-back design. Use when diagnosing subscriber loss or designing a bounded retention intervention. NOT FOR: lifecycle-email production (use suede-emails), pricing architecture (use suede-pricing), paywall design (use suede-paywalls), or event instrumentation (use suede-analytics).
kensaurus/cursor-kenji
Cross-page UX audit for user stories, task completion, and information architecture — the layer audit-ux (per-page heuristics) skips. Use when "audit user flows", "IA audit", "can users find X", "navigation audit", or "funnel drop-off". Full DS burndown → plan-uiux-unification.
K-Dense-AI/scientific-agent-skills
Analyze Neuropixels extracellular recordings end-to-end with SpikeInterface. Covers loading SpikeGLX/Open Ephys/NWB data, preprocessing, drift/motion correction, Kilosort4 (and CPU) spike sorting, quality metrics, and unit curation (threshold-based, model-based UnitRefine, and AI-assisted visual review). Use when working with Neuropixels 1.0/2.0 recordings, spike sorting, or extracellular electrophysiology analysis.