Use when performing quality assurance on code changes. Identifies test gaps, writes missing tests, explores edge cases, and auto-fixes with caution. Triggers: "QA", "quality check", "test coverage", "run QA", "check quality".
From superomninpx claudepluginhub wilder1222/superomni --plugin superomniThis skill is limited to using the following tools:
SKILL.md.tmplSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
mkdir -p ~/.omni-skills/sessions
_PROACTIVE=$(~/.claude/skills/superomni/bin/config get proactive 2>/dev/null || echo "true")
_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
_TEL_START=$(date +%s)
echo "Branch: $_BRANCH | PROACTIVE: $_PROACTIVE"
If PROACTIVE is false: do NOT proactively suggest skills. Only run skills the
user explicitly invokes. If you would have auto-invoked, say:
"I think [skill-name] might help here — want me to run it?" and wait.
Report status using one of these at the end of every skill session:
Pipeline stage order: THINK → PLAN → REVIEW → BUILD → VERIFY → SHIP → REFLECT
REVIEW is the only human gate. All other stages auto-advance on DONE.
| Status | At REVIEW stage | At all other stages |
|---|---|---|
| DONE | STOP — present review summary, wait for user input (Y / N / revision notes) | Auto-advance — print [STAGE] DONE → advancing to [NEXT-STAGE] and immediately invoke next skill |
| DONE_WITH_CONCERNS | STOP — present concerns, wait for user decision | STOP — present concerns, wait for user decision |
| BLOCKED / NEEDS_CONTEXT | STOP — present blocker, wait for user | STOP — present blocker, wait for user |
When auto-advancing:
docs/superomni/[STAGE] DONE → advancing to [NEXT-STAGE] ([skill-name])When the user sends a follow-up message after a completed session, before doing anything else:
ls docs/superomni/specs/spec-*.md docs/superomni/plans/plan-*.md docs/superomni/ .superomni/ 2>/dev/null | head -20
git log --oneline -3 2>/dev/null
To find the latest spec or plan:
_LATEST_SPEC=$(ls docs/superomni/specs/spec-*.md 2>/dev/null | sort | tail -1)
_LATEST_PLAN=$(ls docs/superomni/plans/plan-*.md 2>/dev/null | sort | tail -1)
workflow skill for stage → skill mapping) and announce:
"Continuing in superomni mode — picking up at [stage] using [skill-name]."using-skills/SKILL.md.When asking the user a question, match the confirmation requirement to the complexity of the response:
| Question type | Confirmation rule |
|---|---|
| Single-choice — user picks one option (A/B/C, 1/2/3, Yes/No) | The user's selection IS the confirmation. Do NOT ask "Are you sure?" or require a second submission. |
| Free-text input — user types a value and presses Enter | The submitted text IS the confirmation. No secondary prompt needed. |
| Multi-choice — user selects multiple items from a list | After the user lists their selections, ask once: "Confirm these selections? (Y to proceed)" before acting. |
| Complex / open-ended discussion — back-and-forth clarification | Collect all input, then present a summary and ask: "Ready to proceed with the above? (Y/N)" before acting. |
Rule: never add a redundant confirmation layer on top of a single-choice or text-input answer.
Custom Input Option Rule: Whenever you present a predefined list of choices (A/B/C, numbered options, etc.), always append a final "Other" option that lets the user describe their own idea:
[last letter/number + 1]) Other — describe your own idea: ___________
When the user selects "Other" and provides their custom text, treat that text as the chosen option and proceed exactly as you would for any other selection. If the custom text is ambiguous, ask one clarifying question before proceeding.
Load context progressively — only what is needed for the current phase:
| Phase | Load these | Defer these |
|---|---|---|
| Planning | Latest docs/superomni/specs/spec-*.md, constraints, prior decisions | Full codebase, test files |
| Implementation | Latest docs/superomni/plans/plan-*.md, relevant source files | Unrelated modules, docs |
| Review/Debug | diff, failing test output, minimal repro | Full history, specs |
If context pressure is high: summarize prior phases into 3-5 bullet points, then discard raw content.
All skill artifacts are written to docs/superomni/ (relative to project root).
See the Document Output Convention in CLAUDE.md for the full directory map.
Agent failures are harness signals — not reasons to retry the same approach:
harness-engineering skill to update the harness before retrying.It is always OK to stop and say "this is too hard for me." Escalation is expected, not penalized.
After completing any skill session, run a 3-question self-check before writing the final status:
If any answer is NO, address it before reporting DONE. If it cannot be addressed, report DONE_WITH_CONCERNS and name the gap.
For a full performance evaluation spanning the entire sprint, use the self-improvement skill.
_TEL_END=$(date +%s)
_TEL_DUR=$(( _TEL_END - _TEL_START ))
~/.claude/skills/superomni/bin/analytics-log "SKILL_NAME" "$_TEL_DUR" "OUTCOME" 2>/dev/null || true
Nothing is sent to external servers. Data is stored only in ~/.omni-skills/analytics/.
Goal: Ensure code changes are correct, well-tested, and free of regressions through systematic test analysis, gap filling, and edge case exploration.
NEVER MARK A TEST GREEN BY WEAKENING THE ASSERTION.
If a test fails, the fix is to fix the code or update the test to match a correct new behavior — never to loosen the assertion just to make it pass. A test that asserts nothing is worse than no test.
Determine what changed and what could break.
# What files changed?
git diff main...HEAD --stat 2>/dev/null || git diff HEAD~1 --stat
# What functions/classes were modified?
git diff main...HEAD 2>/dev/null | grep "^@@" | head -30
# What modules could be affected by these changes?
git diff main...HEAD --name-only 2>/dev/null | while read f; do
grep -rl "$(basename "$f" | sed 's/\..*//')" . \
--include="*.js" --include="*.ts" --include="*.py" --include="*.go" \
2>/dev/null
done | sort -u | head -20
# Find existing tests for changed files
git diff main...HEAD --name-only 2>/dev/null | while read f; do
base=$(basename "$f" | sed 's/\..*//')
find . -name "*${base}*test*" -o -name "*${base}*spec*" -o -name "test_*${base}*" \
2>/dev/null
done | sort -u | head -20
Produce a scope map:
QA SCOPE
─────────────────────────────────
Files changed: [list]
Functions affected: [list key functions]
Existing tests: [list test files that cover these changes]
Missing tests: [files/functions with no test coverage]
Blast radius: [what else could break]
─────────────────────────────────
Run the full test suite and capture results.
# Run tests with verbose output
npm test 2>&1 | tee qa-results.txt || true
# or
pytest -v 2>&1 | tee qa-results.txt || true
# or
go test -v ./... 2>&1 | tee qa-results.txt || true
# Summary
echo "---"
grep -cE "PASS|✓|ok " qa-results.txt 2>/dev/null || true
grep -cE "FAIL|✗|FAILED" qa-results.txt 2>/dev/null || true
rm -f qa-results.txt
Record results:
TEST SUITE RESULTS
─────────────────────────────────
Total: [N]
Passing: [N]
Failing: [N]
Skipped: [N]
Duration: [Ns]
─────────────────────────────────
If tests fail, classify each failure:
| Failure | Type | Action |
|---|---|---|
| Test broke due to your change | Regression | Fix the code (not the test) |
| Test was already broken | Pre-existing | Note it, don't fix during QA |
| Test is flaky (passes on re-run) | Flaky | Note it, consider stabilizing |
| Test assertion is wrong (spec changed) | Outdated | Update test to match new spec |
For each uncovered code path identified in Phase 1:
Follow the project's existing convention. If none exists, use:
test_[function]_[scenario]_[expected result]
# Examples:
test_calculateTotal_emptyCart_returnsZero
test_authenticate_expiredToken_throwsAuthError
test_parseConfig_missingRequiredField_usesDefault
# Check coverage after writing tests (if coverage tool exists)
npm run test:coverage 2>/dev/null | tail -20 || true
pytest --cov 2>/dev/null | tail -20 || true
go test -cover ./... 2>/dev/null | tail -20 || true
Go beyond the obvious. For each changed function, consider:
| Category | Examples |
|---|---|
| Empty/null | null, undefined, "", [], {} |
| Boundary | 0, -1, MAX_INT, single character, max length |
| Type coercion | "123" vs 123, true vs 1, 0 vs false |
| Concurrency | Two simultaneous calls, race conditions |
| Encoding | Unicode, emoji, special characters, RTL text |
| Large input | Very long strings, huge arrays, deep nesting |
| Malicious input | SQL injection strings, XSS payloads, path traversal |
For each edge case found:
Only fix a failing test if the root cause is understood.
Decision tree:
Test fails → Do you understand WHY it fails?
├── YES → Is the test correct (matches spec)?
│ ├── YES → Fix the CODE (the code has a bug)
│ └── NO → Fix the TEST (spec changed, test is outdated)
└── NO → STOP. Investigate root cause first.
Do NOT change the test or code without understanding.
Rules:
assertEquals to assertNotNull)skip / xit / @pytest.mark.skip without documenting the reason# After fixes, run the full suite again
npm test 2>&1 | tail -20
# Verify no new failures introduced
QA REPORT
════════════════════════════════════════
Scope: [what was tested]
Changes tested: [N files, N functions]
Test Results (before QA):
Passing: [N]
Failing: [N]
Skipped: [N]
Test Results (after QA):
Passing: [N]
Failing: [N]
Skipped: [N]
New tests: [N added]
Coverage:
Before: [N% or "not measured"]
After: [N% or "not measured"]
Edge Cases Found:
- [edge case 1] — [handled/bug filed]
- [edge case 2] — [handled/bug filed]
Bugs Found:
- [bug 1]: [description] — [fixed/reported]
- [bug 2]: [description] — [fixed/reported]
Flaky Tests:
- [test name] — [observed behavior]
Risk Assessment:
[LOW/MEDIUM/HIGH] — [1-sentence justification]
Status: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT
════════════════════════════════════════