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
live "/path" in router).mount/3 contract: which params and session keys are used, what assigns are set.handle_event, handle_info, handle_params) this LiveView must handle.HARD GATE — Contract Defined:
If gate fails: Return to Phase 1 — decide the module, file path, and route; document the assigns shape; and enumerate every event before writing tests.
live_isolated for component-level testslive/2 (LiveViewTest) for full-page testsmix test test/my_app_web/live/my_live_test.exs — failure must be confirmed before moving to implementation.Sample test skeleton:
defmodule MyAppWeb.ItemLiveTest do
use MyAppWeb.ConnCase, async: true
import Phoenix.LiveViewTest
test "mounts and renders item list", %{conn: conn} do
{:ok, lv, html} = live(conn, ~p"/items")
assert html =~ "Items"
assert has_element?(lv, "[data-role=item-list]")
end
test "adding an item updates the stream", %{conn: conn} do
{:ok, lv, _html} = live(conn, ~p"/items")
lv |> form("#item-form", item: %{name: "Widget"}) |> render_submit()
assert has_element?(lv, "[data-role=item-list]", "Widget")
end
endHARD GATE — Test Fails:
mix test confirms tests fail (module not yet implemented)If gate fails: If the test errors for the wrong reason (syntax or setup, not the missing module), fix the test until it fails because the LiveView is unimplemented.
mount/3: assign all documented keys; use stream/3 for collections (see stream rule in Phase 4 Quality Gate).handle_event/3 for each listed event; update socket with assign/2 or stream_insert/3.render/1 (or .html.heex template): use dot access (@key) for assigns guaranteed by mount/3; bracket access (assigns[:key]) only for keys that may be absent.Minimal LiveView module:
defmodule MyAppWeb.ItemLive do
use MyAppWeb, :live_view
alias MyApp.Catalog
@impl true
def mount(_params, _session, socket) do
{:ok,
socket
|> assign(:page_title, "Items")
|> assign(:form, to_form(Catalog.change_item(%Catalog.Item{})))
|> stream(:items, Catalog.list_items())}
end
@impl true
def handle_event("save", %{"item" => item_params}, socket) do
case Catalog.create_item(item_params) do
{:ok, item} ->
{:noreply, stream_insert(socket, :items, item)}
{:error, changeset} ->
{:noreply, assign(socket, :form, to_form(changeset))}
end
end
@impl true
def render(assigns) do
~H"""
<h1><%= @page_title %></h1>
<.form for={@form} id="item-form" phx-submit="save">
<.input field={@form[:name]} label="Name" />
<.button>Save</.button>
</.form>
<ul id="items" phx-update="stream" data-role="item-list">
<li :for={{dom_id, item} <- @streams.items} id={dom_id}>
<%= item.name %>
</li>
</ul>
"""
end
endHARD GATE — Implementation Complete:
mount/3 sets all documented assigns and streamsphx-update="stream"mix test passesIf gate fails: Implement the missing mount/3 assign, event handler, or phx-update="stream" container, then re-run mix test until it is green.
Run these checks before considering the LiveView done.
Stream rule — use streams for any collection that may exceed 10 items:
# ❌ assigns bloat
assign(socket, :items, Catalog.list_items())
# ✅ correct
stream(socket, :items, Catalog.list_items())Template access rule — dot access for guaranteed assigns, bracket access for optional keys:
<%# ✅ dot access — guaranteed by mount/3 %>
<%= @user.name %>
<%# ✅ bracket access — optional keys %>
<%= @user[:name] %>Quality gate checklist:
phx-update="stream"render/1 — all data preparation in mount/3 or event handlershandle_event clauses return {:noreply, socket} (or {:reply, map, socket})mix test passes with no compiler warningsHARD GATE — Quality Gate Passes:
If gate fails: Address the flagged checklist item — convert bloated assigns to streams, move data prep out of render/1, or fix warnings — then re-run the quality gate.
When completing a LiveView, output a report using this template:
# LiveView Report — [Module Name]
## Contract
- Module / route: <MyAppWeb.ItemLive @ /items>
- Assigns: <keys + types; streams noted>
- Events: <handle_event / handle_info / handle_params>
## Test
- File: <test path>
- RED: <exact failure confirming the module is unimplemented>
## Implementation
- mount/3: <assigns + streams set>
- Events: <implemented list>
## Quality Gate
- Streams for >10-item collections: ✓
- Dot vs bracket access correct: ✓
- No logic in render/1: ✓
- mix test: ✓ (<n> tests, 0 failures, no warnings)
Verdict: <PASS / CHANGES REQUESTED — reason>Test fails for the wrong reason (setup or syntax, not the missing module):
ConnCase, ~p route, imports) until the only failure is the unimplemented LiveView.mount/3 returns but the template raises KeyError on an assign:
mount/3.@assigns[:key]).A stream renders empty or items duplicate:
phx-update="stream" and each child uses its dom_id as the id.stream_insert/3 in the event handler instead of reassigning the whole collection.Assigns bloat — socket state grows unbounded:
stream/3..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