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).
73
91%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Orchestrates robust background job implementation with TDD discipline, proper retry/discard strategies, comprehensive failure scenario testing, and production monitoring for Oban jobs.
Steps:
{:error, reason}:discardHARD GATE — Job Design Complete:
If gate fails: Clarify requirements before implementation.
Steps:
perform/1 function directly).mix test — confirm no regressions.HARD GATE — Tests Pass:
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 (see error classification in Phase 1).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 set with appropriate backoff:discard; transient errors return {:error, reason}If gate fails: Job is not production-ready.
Steps:
{:error, ...}:discardHARD GATE — Failure Scenarios Tested:
{:error, ...}:discardIf gate fails: Address failure scenarios before deploying.
Never deploy until all four phase gates above are green.
When completing a background job implementation, output MUST follow this structure:
# Background Job Report — [Job Name]
## Design
- Worker module: <path>
- Idempotency strategy: <unique constraint / status check / conditional guard>
- Error classification: transient (<list>) / permanent (<list>)
## TDD
- RED: <failure message confirming job behavior missing>
- GREEN: <test passes after implementation>
## Retry Configuration
- max_attempts: <n>, Queue: <name>, Uniqueness: <period/fields>
- Discard conditions: <list>
## Failure Scenarios Tested
- Transient error → retries: ✓
- Permanent error → discards: ✓
- Idempotency → no duplicate side effects: ✓
## Monitoring
- Telemetry events: <list>
- Queue depth alerts: <configured threshold>