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
Steps:
{:error, reason}:discardHARD GATE — Job Design Complete:
If gate fails: Return to job design — document the missing idempotency mechanism, complete the error classification, or record the queue/priority/timeout value before writing any code.
Steps:
mix test — confirm no regressions.HARD GATE — Tests Pass:
mix test exits clean with no regressionsIf gate fails: If RED is wrong (misconfiguration or syntax, not a missing implementation), fix the test first; if GREEN fails, revise the implementation and do not proceed until mix test passes with no regressions.
Example job test skeleton (for SendWelcomeEmail worker):
# test/my_app/workers/send_welcome_email_test.exs
defmodule MyApp.Workers.SendWelcomeEmailTest do
use MyApp.DataCase, async: true
alias MyApp.Workers.SendWelcomeEmail
setup do
user = user_fixture()
%{user: user}
end
test "sends welcome email", %{user: user} do
assert :ok = SendWelcomeEmail.perform(%Oban.Job{args: %{"user_id" => user.id}})
end
test "is idempotent", %{user: user} do
job = %Oban.Job{args: %{"user_id" => user.id}}
assert :ok = SendWelcomeEmail.perform(job)
assert :ok = SendWelcomeEmail.perform(job)
end
test "raises on transient email errors" do
job = %Oban.Job{args: %{"user_id" => -1}}
assert {:error, _} = SendWelcomeEmail.perform(job)
end
endSteps:
max_attempts for retry with exponential backoff.discard_on or explicit handling for permanent errors (per the error classification in Phase 1).telemetry-essentials for patterns).Key implementation pattern:
defmodule MyApp.Workers.SendWelcomeEmail do
use Oban.Worker,
queue: :mailers,
max_attempts: 5,
unique: [period: 300]
@impl Oban.Worker
def perform(%Oban.Job{args: %{"user_id" => user_id}}) do
user = Accounts.get_user!(user_id)
# Idempotency guard
if user.welcome_email_sent_at, do: return(:ok)
case Emails.send_welcome(user) do
:ok -> Accounts.mark_welcome_sent(user); :ok
{:error, :rate_limited} -> {:error, "Rate limited — will retry"}
{:error, :invalid_email} -> Accounts.mark_welcome_failed(user, :invalid_email); :discard
{:error, reason} -> {:error, reason}
end
end
endHARD GATE — Retry Strategy Configured:
max_attempts, backoff, and timeout are set to values derived from the Phase 1 error classification:discard in code; every transient error maps to {:error, reason}If gate fails: Re-derive max_attempts, backoff, and timeout from the Phase 1 error classification, and correct any error whose return value contradicts its class ({:error, reason} for transient, :discard for permanent).
Steps:
{:error, ...}, permanent → :discard).telemetry-essentials for alerting patterns).HARD GATE — Failure Scenarios Tested:
If gate fails: Add the missing error-path assertion or telemetry check, or set and document the queue-depth threshold, then re-run the failure-scenario tests.
Never deploy until all four phase gates above are green.
When completing a background job implementation, produce a concise summary report:
# Background Job Report — [Job Name]
- Worker module: <path>
- Idempotency strategy: <unique constraint / status check / conditional guard>
- Error classification: transient (<list>) / permanent (<list>)
- RED: <failure message confirming job behavior missing>
- GREEN: <test passes after implementation>
- max_attempts: <n>, Queue: <name>, Uniqueness: <period/fields>
- Discard conditions: <list>
- Telemetry events: <list>
- Queue depth alerts: <configured threshold>Effects duplicate when a job retries:
perform/1 twice and asserts a single side effect.A transient error is discarded (or a permanent error keeps retrying):
{:error, reason} (retryable) and permanent errors to :discard, and adjust max_attempts to match.A job exhausts its retries in production:
:discard branch; if transient and recoverable, raise max_attempts or widen the backoff.The queue backs up (depth alert firing):
.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