From beagle-elixir
Verifies code review findings via checklists before reporting to avoid false positives in unused code, validation, types, leaks, and races.
npx claudepluginhub existential-birds/beagle --plugin beagle-elixirThis skill uses the workspace's default tool permissions.
This protocol MUST be followed before reporting any code review finding. Skipping these steps leads to false positives that waste developer time and erode trust in reviews.
Creates new Angular apps using Angular CLI with flags for routing, SSR, SCSS, prefixes, and AI config. Follows best practices for modern TypeScript/Angular development. Use when starting Angular projects.
Generates Angular code and provides architectural guidance for projects, components, services, reactivity with signals, forms, dependency injection, routing, SSR, ARIA accessibility, animations, Tailwind styling, testing, and CLI tooling.
Executes ctx7 CLI to fetch up-to-date library documentation, manage AI coding skills (install/search/generate/remove/suggest), and configure Context7 MCP. Useful for current API refs, skill handling, or agent setup.
This protocol MUST be followed before reporting any code review finding. Skipping these steps leads to false positives that waste developer time and erode trust in reviews.
Before flagging ANY issue, verify:
Before flagging, you MUST:
Common false positives:
Before flagging, you MUST:
Common false positives:
Before flagging, you MUST:
Valid patterns often flagged incorrectly:
# Pattern matching, NOT type casting
%UserData{} = data = load_user()
# Guard clauses narrow the type safely
def process(%User{name: name} = user) do
name # Elixir knows this is a User struct
end
Before flagging, you MUST:
Common false positives:
Before flagging, you MUST:
Do NOT flag:
ONLY use for:
Use for:
Use for:
Use for:
These are NOT review blockers. They should be noted for the author's awareness but must not appear in the actionable issue count. The Verdict should ignore informational items entirely.
| Pattern | Why It's Valid |
|---|---|
case with multiple clauses | Standard pattern matching, not excessive branching |
with chains | Idiomatic for sequential operations that may fail |
Pipe operator (|>) chains | Elixir's core composition pattern |
@spec without Dialyzer enforcement | Documentation value even without static analysis |
defp private functions | Proper encapsulation, not hidden complexity |
| Pattern | Why It's Valid |
|---|---|
assign/2 in mount/3 | Standard LiveView state initialization |
handle_event/3 returning {:noreply, socket} | Correct for UI-triggered state updates |
~H sigil for inline templates | Valid for small components |
on_mount hooks | Correct lifecycle pattern for auth/setup |
| PubSub broadcasts in handle_info | Standard real-time communication pattern |
| Pattern | Why It's Valid |
|---|---|
assert without message | ExUnit provides clear diff output |
setup block for test context | Standard ExUnit fixture pattern |
describe blocks for grouping | Idiomatic test organization |
conn pipeline in controller tests | Phoenix test helper convention |
| Pattern | Why It's Valid |
|---|---|
+? lazy quantifier in regex | Prevents over-matching, correct for many patterns |
| Direct string concatenation | Simpler than template literals for simple cases |
| Multiple returns in function | Can improve readability |
| Comments explaining "why" | Better than no comments |
Flag missing pattern match ONLY IF ALL of these are true:
Flag missing supervision ONLY IF:
Flag missing error handling ONLY IF:
with clause handles the error caseFinal verification:
[FILE:LINE] ISSUE_TITLEIf uncertain about any finding, either: