Curated library of 38 atomic skills, 7 personas, and 1 orchestrator for Elixir and Phoenix development. Organized by category: fundamentals, phoenix, database, testing, auth, infrastructure, quality, security, integrations, tooling, frameworks, personas, and orchestration. Covers core Elixir patterns, Phoenix LiveView, Ecto, OTP, Oban, testing, security, deployment, real-time, and modern tooling (Req, Swoosh, Cachex, Broadway, Ash).
91
91%
Does it follow best practices?
Impact
91%
1.37xAverage score across 56 eval scenarios
Advisory
Suggest reviewing before use
Orchestrates safe Ecto migrations with idempotent cycles, rollback planning, and production deployment safety.
Steps:
down/0.| Class | Lock | Examples |
|---|---|---|
| Safe | Metadata-only (instant) | Add nullable column, create table, create index concurrently |
| Risky | Table rewrite | Change column type, add NOT NULL on existing column, rename column |
| Dangerous | Long lock | Add FK without validation, drop column |
HARD GATE — Plan Approved:
If gate fails: Clarify the schema change plan before implementing.
Steps:
mix ecto.gen.migration <descriptive_name>.up/0 (or change/0 for reversible migrations).down/0 for explicit rollback.up/down over change/0 when rollback semantics require explicit control.execute/1 with raw SQL for data transformations to avoid runtime schema coupling.Idempotent cycle test:
mix ecto.rollback
mix ecto.migrate
mix ecto.rollback
mix ecto.migrateHARD GATE — Idempotent Cycle Verified:
mix ecto.rollback succeedsmix ecto.migrate succeedsIf gate fails: Fix the migration's up/down before proceeding.
Add nullable column (safe):
defmodule MyApp.Repo.Migrations.AddPublishedAtToPosts do
use Ecto.Migration
def up do
alter table(:posts) do
add :published_at, :utc_datetime
end
end
def down do
alter table(:posts) do
remove :published_at
end
end
endAdd NOT NULL column with expand-contract (risky — three separate migrations per Phase 1 strategy):
# Migration 1 of 3: add nullable column with default
defmodule MyApp.Repo.Migrations.AddStatusToPosts do
use Ecto.Migration
def up, do: alter(table(:posts), do: add(:status, :string, default: "draft"))
def down, do: alter(table(:posts), do: remove(:status))
end
# Migration 2 of 3: backfill existing rows
defmodule MyApp.Repo.Migrations.BackfillPostStatus do
use Ecto.Migration
def up, do: execute("UPDATE posts SET status = 'draft' WHERE status IS NULL")
def down, do: :ok # irreversible backfill
end
# Migration 3 of 3: enforce NOT NULL constraint
defmodule MyApp.Repo.Migrations.EnforcePostStatusNotNull do
use Ecto.Migration
def up, do: alter(table(:posts), do: modify(:status, :string, null: false, default: "draft"))
def down, do: alter(table(:posts), do: modify(:status, :string, null: true, default: "draft"))
endAdd index concurrently (safe for large tables):
defmodule MyApp.Repo.Migrations.AddPostAuthorIndex do
use Ecto.Migration
@disable_ddl_transaction true
def up do
create index(:posts, [:author_id], concurrently: true)
end
def down do
drop index(:posts, [:author_id])
end
endSteps:
mix test.MIX_ENV=test mix ecto.migrate.HARD GATE — Test Suite Passes:
mix test
MIX_ENV=test mix ecto.migrateIf gate fails: Fix tests or migration logic.
Steps:
HARD GATE — Rollback Ready:
mix ecto.rollback)If gate fails: Do not deploy — document the exact rollback command, test the rollback locally or on staging, and take a database backup before running the production migration.
After completing a migration, produce a concise report covering:
up/down, idempotent cycle result (✓/✗)mix test result (n tests, 0 failures), MIX_ENV=test mix ecto.migrate resultMigration fails in production: Run mix ecto.rollback if reversible; otherwise write a forward-only fix migration. Diagnose locally, rerun the idempotent cycle, then redeploy.
Rollback fails: Verify down/0 reverses every up/0 operation in correct order. For change/0 migrations Ecto auto-generates the reverse; manual up/down must stay in sync. If truly irreversible, document it and plan a forward-only fix.
Lock timeout on large table: Apply expand-contract (add nullable → backfill separately → enforce NOT NULL). Use concurrently: true with @disable_ddl_transaction true for indexes. Schedule during low-traffic windows.
concurrently on large tablesdown/0 defined.tessl-plugin
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
scenario-36
scenario-37
scenario-38
scenario-39
scenario-40
scenario-41
scenario-42
scenario-43
scenario-44
scenario-45
scenario-46
scenario-47
scenario-48
scenario-49
scenario-50
scenario-51
scenario-52
scenario-53
scenario-54
scenario-55
scenario-56
skills
frameworks
ash-framework
infrastructure
orchestration
elixir-skill-router
personas
phoenix
quality
security
security-essentials
tooling
mix-tasks-generators