skills/avad-ship/SKILL.md
Ship workflow: validate branch state, sync with target branch, run tests, pre-landing review, push, and create PR. Project-aware — reads target branch, test commands, and review checklist from docs/GIT_WORKFLOW.md.
npx skillsauth add agwacom/avadbot avad-shipInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are running the /ship workflow. This is automated by default — run straight through
and output the PR URL at the end.
Only stop for:
Never stop for:
Before anything else, check if you are on a known protected branch:
branch=$(git branch --show-current)
If $branch is main or master, use AskUserQuestion with options:
<branch> directly — bypass branch protection ruleThis prevents accidentally committing onto a protected branch while still giving the user control.
Read docs/GIT_WORKFLOW.md.
docs/GIT_WORKFLOW.md exists:Read it. Extract everything you need:
dev, main)Also read:
CLAUDE.md — for test/lint/typecheck commandsAGENTS.md — for domain rules (canonical values, API whitelist, etc.)~/.avadbot/projects/<repo>/review-checklist.md — for pre-landing review checklist (if it exists)docs/GIT_WORKFLOW.md does NOT exist:Generate it. Read the project's available context to infer the workflow:
Scan for signals:
CLAUDE.md, AGENTS.md — rules, commands, conventionsgit log --oneline -20 — commit message style, branch merge patternsgit branch -r — what remote branches existgit config pull.rebase — merge vs rebase preferencepyproject.toml / package.json / Cargo.toml / go.mod — language and tooling.github/workflows/ — CI configurationAsk the user key questions (one AskUserQuestion, all at once):
dev, main)Generate docs/GIT_WORKFLOW.md covering:
Write the file but do NOT commit yet. Step 1 must validate the branch first. The file will be committed in Step 7 along with other changes (or on its own if there are no other changes).
This file persists — future /ship runs read it directly.
Run git status --short --branch (never use -uall).
Confirm the current branch is a valid work branch:
docs/GIT_WORKFLOW.md)docs/GIT_WORKFLOW.mdchore/description) and continue shipping<branch> directly — bypass branch protection ruleCheck for uncommitted changes:
test.md
in root with no meaningful content, temp debug files, scratch files)(Recommended)):
git stash push -u -m "ship: stashed unrelated changes" and continuerm <files>) and continuegit diff and git status, then re-ask A/B/CDetect already-merged branches:
git ls-remote --heads origin <branch>
git diff --stat origin/<target>...HEAD
If the branch does NOT exist on remote AND the diff against <target> is empty
(all commits already upstream), the branch was already merged and deleted.
In this case, check for uncommitted changes:
origin/<target> with these changesDo NOT offer "Commit and ship as-is" — the branch is dead, pushing to it would recreate a branch for a closed PR.
Confirm the branch represents one logical change only. If the branch history mixes unrelated work, stop and require splitting.
Review the shipment scope:
git diff --stat origin/<target>...HEAD
git log --oneline origin/<target>..HEAD
Check review readiness:
SLUG=$(basename "$(git remote get-url origin 2>/dev/null)" .git 2>/dev/null || echo "unknown")
BRANCH=$(git branch --show-current | tr '/' '-')
cat ~/.avadbot/projects/$SLUG/$BRANCH-reviews.jsonl 2>/dev/null || echo "NO_REVIEWS"
Parse the output. Find the most recent entry for each skill (plan-ceo-review, plan-eng-review, plan-design-review, design-review-lite). Ignore entries with timestamps older than 7 days. Display:
+====================================================================+
| REVIEW READINESS DASHBOARD |
+====================================================================+
| Review | Runs | Last Run | Status | Required |
|-----------------|------|---------------------|-----------|----------|
| Eng Review | 1 | 2026-03-16 15:00 | CLEAR | YES |
| CEO Review | 0 | — | — | no |
| Design Review | 0 | — | — | no |
+--------------------------------------------------------------------+
| VERDICT: CLEARED — Eng Review passed |
+====================================================================+
Review tiers:
Verdict logic:
If Eng Review is NOT "CLEAR":
Check for a prior override on this branch:
grep '"skill":"ship-review-override"' ~/.avadbot/projects/$SLUG/$BRANCH-reviews.jsonl 2>/dev/null || echo "NO_OVERRIDE"
If an override exists, display the dashboard and note "Review gate previously accepted — continuing." Do NOT ask again.
If no override exists, use AskUserQuestion:
If the user chooses A or C, persist the decision so future /ship runs on this branch
skip the gate:
mkdir -p ~/.avadbot/projects/$SLUG
echo '{"skill":"ship-review-override","timestamp":"'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'","decision":"USER_CHOICE"}' >> ~/.avadbot/projects/$SLUG/$BRANCH-reviews.jsonl
Substitute USER_CHOICE with "ship_anyway" or "not_relevant".
Use the integration strategy defined in docs/GIT_WORKFLOW.md:
git fetch origin
# If GIT_WORKFLOW.md specifies rebase:
git rebase --autostash origin/<target>
# If GIT_WORKFLOW.md specifies merge (or no preference):
git merge origin/<target> --no-edit
If conflicts appear:
If already up to date, continue silently.
This is a hard gate. Do NOT continue past this step if the branch has no diff.
After rebase/merge, verify the branch still has changes:
git diff --stat origin/<target>...HEAD
If the diff is not empty, continue to Step 3.
If the diff is empty (all commits were dropped as already-upstream), the branch is dead — it was already merged. STOP and follow one of these paths:
If uncommitted changes exist (e.g. from autostash): use AskUserQuestion:
origin/<target> with
these changes and restart /ship from Step 1If no uncommitted changes exist: Report "All branch commits already upstream. Nothing to ship." and stop.
Do NOT continue shipping on the dead branch. Do NOT push it. Do NOT create a PR from it. Pushing a dead branch recreates a branch for a closed PR.
This gate catches cases where Step 1 pre-flight didn't detect the merged state (e.g. the branch still existed on remote when Step 1 ran, but rebase revealed all content was upstream).
Detect existing test framework and project runtime:
# Detect project runtime
[ -f Gemfile ] && echo "RUNTIME:ruby"
[ -f package.json ] && echo "RUNTIME:node"
[ -f requirements.txt ] || [ -f pyproject.toml ] && echo "RUNTIME:python"
[ -f go.mod ] && echo "RUNTIME:go"
[ -f Cargo.toml ] && echo "RUNTIME:rust"
[ -f composer.json ] && echo "RUNTIME:php"
[ -f mix.exs ] && echo "RUNTIME:elixir"
# Detect sub-frameworks
[ -f Gemfile ] && grep -q "rails" Gemfile 2>/dev/null && echo "FRAMEWORK:rails"
[ -f package.json ] && grep -q '"next"' package.json 2>/dev/null && echo "FRAMEWORK:nextjs"
# Check for existing test infrastructure
ls jest.config.* vitest.config.* playwright.config.* .rspec pytest.ini pyproject.toml phpunit.xml 2>/dev/null
ls -d test/ tests/ spec/ __tests__/ cypress/ e2e/ 2>/dev/null
# Check opt-out marker
[ -f .avadbot/no-test-bootstrap ] && echo "BOOTSTRAP_DECLINED"
If test framework detected (config files or test directories found): Print "Test framework detected: {name} ({N} existing tests). Skipping bootstrap." Read 2-3 existing test files to learn conventions (naming, imports, assertion style, setup patterns). Store conventions as prose context for use in Step 3.5 test generation. Skip the rest of bootstrap.
If BOOTSTRAP_DECLINED appears: Print "Test bootstrap previously declined — skipping." Skip the rest of bootstrap.
If NO runtime detected (no config files found): Use AskUserQuestion:
"I couldn't detect your project's language. What runtime are you using?"
Options: A) Node.js/TypeScript B) Ruby/Rails C) Python D) Go E) Rust F) PHP G) Elixir H) This project doesn't need tests.
If user picks H → write .avadbot/no-test-bootstrap and continue without tests.
If runtime detected but no test framework — bootstrap:
Use WebSearch to find current best practices for the detected runtime:
"[runtime] best test framework 2025 2026""[framework A] vs [framework B] comparison"If WebSearch is unavailable, use this built-in knowledge table:
| Runtime | Primary recommendation | Alternative | |---------|----------------------|-------------| | Ruby/Rails | minitest + fixtures + capybara | rspec + factory_bot + shoulda-matchers | | Node.js | vitest + @testing-library | jest + @testing-library | | Next.js | vitest + @testing-library/react + playwright | jest + cypress | | Python | pytest + pytest-cov | unittest | | Go | stdlib testing + testify | stdlib only | | Rust | cargo test (built-in) + mockall | — | | PHP | phpunit + mockery | pest | | Elixir | ExUnit (built-in) + ex_machina | — |
Use AskUserQuestion: "I detected this is a [Runtime/Framework] project with no test framework. I researched current best practices. Here are the options: A) [Primary] — [rationale]. Includes: [packages]. Supports: unit, integration, smoke, e2e B) [Alternative] — [rationale]. Includes: [packages] C) Skip — don't set up testing right now RECOMMENDATION: Choose A because [reason based on project context]"
If user picks C → write .avadbot/no-test-bootstrap. Tell user: "If you change your mind later, delete .avadbot/no-test-bootstrap and re-run." Continue without tests.
If multiple runtimes detected (monorepo) → ask which runtime to set up first, with option to do both sequentially.
If package installation fails → debug once. If still failing → revert with git checkout -- package.json package-lock.json (or equivalent for the runtime). Warn user and continue without tests.
Generate 3-5 real tests for existing code:
git log --since=30.days --name-only --format="" | sort | uniq -c | sort -rn | head -10expect(x).toBeDefined() — test what the code DOES.Never import secrets, API keys, or credentials in test files. Use environment variables or test fixtures.
# Run the full test suite to confirm everything works
{detected test command}
If tests fail → debug once. If still failing → revert all bootstrap changes and warn user.
# Check CI provider
ls -d .github/ 2>/dev/null && echo "CI:github"
ls .gitlab-ci.yml .circleci/ bitrise.yml 2>/dev/null
If .github/ exists (or no CI detected — default to GitHub Actions):
Create .github/workflows/test.yml with:
runs-on: ubuntu-latestIf non-GitHub CI detected → skip CI generation with note: "Detected {provider} — CI pipeline generation supports GitHub Actions only. Add test step to your existing pipeline manually."
First check: If TESTING.md already exists → read it and update/append rather than overwriting. Never destroy existing content.
Write TESTING.md with:
First check: If CLAUDE.md already has a ## Testing section → skip. Don't duplicate.
Append a ## Testing section:
git status --porcelain
Only commit if there are changes. Stage all bootstrap files (config, test directory, TESTING.md, CLAUDE.md, .github/workflows/test.yml if created):
git commit -m "chore: bootstrap test framework ({framework name})"
Run all discovered test/lint/type-check commands in parallel where possible.
Use a unique temp directory to avoid collisions with concurrent runs, and capture exit codes explicitly:
_land_tmp=$(mktemp -d)
(set -o pipefail; <test-cmd> 2>&1 | tee "$_land_tmp/tests.txt"; echo $? > "$_land_tmp/tests.exit") &
(set -o pipefail; <lint-cmd> 2>&1 | tee "$_land_tmp/lint.txt"; echo $? > "$_land_tmp/lint.exit") &
(set -o pipefail; <typecheck-cmd> 2>&1 | tee "$_land_tmp/types.txt"; echo $? > "$_land_tmp/types.exit") &
wait
After all complete, check each *.exit file. If any contains a non-zero code,
show that command's output and stop.
Rules:
$_land_tmp — run rm -rf "$_land_tmp" before any exit,
whether validation passed, failed, or the workflow stops for any reason.
Since the agent runs individual shell commands (not a script), trap does not
persist between calls. Instead, run the cleanup explicitly before stopping.If the project has no test commands, warn the user and continue.
100% coverage is the goal — every untested path is a path where bugs hide and vibe coding becomes yolo coding. Evaluate what was ACTUALLY coded (from the diff), not what was planned.
Before analyzing coverage, detect the project's test framework:
## Testing section with test command and framework name. If found, use that as the authoritative source.# Detect project runtime
[ -f Gemfile ] && echo "RUNTIME:ruby"
[ -f package.json ] && echo "RUNTIME:node"
[ -f requirements.txt ] || [ -f pyproject.toml ] && echo "RUNTIME:python"
[ -f go.mod ] && echo "RUNTIME:go"
[ -f Cargo.toml ] && echo "RUNTIME:rust"
# Check for existing test infrastructure
ls jest.config.* vitest.config.* playwright.config.* cypress.config.* .rspec pytest.ini phpunit.xml 2>/dev/null
ls -d test/ tests/ spec/ __tests__/ cypress/ e2e/ 2>/dev/null
0. Before/after test count:
# Count test files before any generation
find . -name '*.test.*' -o -name '*.spec.*' -o -name '*_test.*' -o -name '*_spec.*' | grep -v node_modules | wc -l
Store this number for the PR body.
1. Trace every codepath changed using git diff origin/<base>...HEAD:
Read every changed file. For each one, trace how data flows through the code — don't just list functions, actually follow the execution:
This is the critical step — you're building a map of every line of code that can execute differently based on input. Every branch in this diagram needs a test.
2. Map user flows, interactions, and error states:
Code coverage isn't enough — you need to cover how real users interact with the changed code. For each changed feature, think through:
Add these to your diagram alongside the code branches. A user flow with no test is just as much a gap as an untested if/else.
3. Check each branch against existing tests:
Go through your diagram branch by branch — both code paths AND user flows. For each one, search for a test that exercises it:
processPayment() → look for billing.test.ts, billing.spec.ts, test/billing_test.rbhelperFn() that has its own branches → those branches need tests tooQuality scoring rubric:
When checking each branch, also determine whether a unit test or E2E/integration test is the right tool:
RECOMMEND E2E (mark as [→E2E] in the diagram):
RECOMMEND EVAL (mark as [→EVAL] in the diagram):
STICK WITH UNIT TESTS:
IRON RULE: When the coverage audit identifies a REGRESSION — code that previously worked but the diff broke — a regression test is written immediately. No AskUserQuestion. No skipping. Regressions are the highest-priority test because they prove something broke.
A regression is when:
When uncertain whether a change is a regression, err on the side of writing the test.
Format: commit as test: regression test for {what broke}
4. Output ASCII coverage diagram:
Include BOTH code paths and user flows in the same diagram. Mark E2E-worthy and eval-worthy paths:
CODE PATH COVERAGE
===========================
[+] src/services/billing.ts
│
├── processPayment()
│ ├── [★★★ TESTED] Happy path + card declined + timeout — billing.test.ts:42
│ ├── [GAP] Network timeout — NO TEST
│ └── [GAP] Invalid currency — NO TEST
│
└── refundPayment()
├── [★★ TESTED] Full refund — billing.test.ts:89
└── [★ TESTED] Partial refund (checks non-throw only) — billing.test.ts:101
USER FLOW COVERAGE
===========================
[+] Payment checkout flow
│
├── [★★★ TESTED] Complete purchase — checkout.e2e.ts:15
├── [GAP] [→E2E] Double-click submit — needs E2E, not just unit
├── [GAP] Navigate away during payment — unit test sufficient
└── [★ TESTED] Form validation errors (checks render only) — checkout.test.ts:40
[+] Error states
│
├── [★★ TESTED] Card declined message — billing.test.ts:58
├── [GAP] Network timeout UX (what does user see?) — NO TEST
└── [GAP] Empty cart submission — NO TEST
[+] LLM integration
│
└── [GAP] [→EVAL] Prompt template change — needs eval test
─────────────────────────────────
COVERAGE: 5/13 paths tested (38%)
Code paths: 3/5 (60%)
User flows: 2/8 (25%)
QUALITY: ★★★: 2 ★★: 2 ★: 1
GAPS: 8 paths need tests (2 need E2E, 1 needs eval)
─────────────────────────────────
Fast path: All paths covered → "Step 3.5: All new code paths have test coverage." Continue.
5. Generate tests for uncovered paths:
If test framework detected (or bootstrapped in Step 2.75):
test: coverage for {feature}Caps: 30 code paths max, 20 tests generated max (code + user flow combined), 2-min per-test exploration cap.
If no test framework AND user declined bootstrap → diagram only, no generation. Note: "Test generation skipped — no test framework configured."
Diff is test-only changes: Skip Step 3.5 entirely: "No new application code paths to audit."
6. After-count and coverage summary:
# Count test files after generation
find . -name '*.test.*' -o -name '*.spec.*' -o -name '*_test.*' -o -name '*_spec.*' | grep -v node_modules | wc -l
For PR body: Tests: {before} → {after} (+{delta} new)
Coverage line: Test Coverage Audit: N new code paths. M covered (X%). K tests generated, J committed.
After producing the coverage diagram, write a test plan artifact so /avad-qa can consume it:
SLUG=$(git remote get-url origin 2>/dev/null | sed 's|.*[:/]\([^/]*/[^/]*\)\.git$|\1|;s|.*[:/]\([^/]*/[^/]*\)$|\1|' | tr '/' '-')
mkdir -p ~/.avadbot/projects/$SLUG
USER=$(whoami)
DATETIME=$(date +%Y%m%d-%H%M%S)
Write to ~/.avadbot/projects/{slug}/{user}-{branch}-ship-test-plan-{datetime}.md:
# Test Plan
Generated by /avad-ship on {date}
Branch: {branch}
Repo: {owner/repo}
## Affected Pages/Routes
- {URL path} — {what to test and why}
## Key Interactions to Verify
- {interaction description} on {page}
## Edge Cases
- {edge case} on {page}
## Critical Paths
- {end-to-end flow that must work}
If the repository defines a validation matrix (in governing docs or CLAUDE.md), check which areas are affected:
git diff --name-only origin/<target>...HEAD
Run any additional area-specific checks beyond the general test suite. Examples: migration validation, contract tests, idempotency checks.
Skip this step if no validation matrix is defined.
Review the diff for structural issues that tests don't catch.
git diff origin/<target>...HEAD
Always use three-dot diff (...) — this shows only your branch's changes since
divergence, not changes on the target branch.
If a project-specific checklist exists (~/.avadbot/projects/<repo>/review-checklist.md):
read it and use it.
If no checklist exists, generate one before proceeding:
Read the project's governing docs, CLAUDE.md, AGENTS.md, and scan the codebase
structure to understand:
Read ../avad-review/checklist-seed.md and use it as the bootstrap taxonomy.
Adapt it before writing anything:
Generate ~/.avadbot/projects/<repo>/review-checklist.md following this structure:
# Pre-Landing Review Checklist
## Instructions
Review the diff for the issues listed below. Be specific — cite `file:line`
and suggest fixes. Skip anything that's fine. Only flag real problems.
**Two-pass review:**
- **Pass 1 (CRITICAL):** Run critical categories first. These block `/ship`.
- **Pass 2 (INFORMATIONAL):** Run remaining categories. Included in PR body
but do not block.
**Output format:**
Pre-Landing Review: N issues (X critical, Y informational)
**CRITICAL** (blocking):
- [file:line] Problem description
Fix: suggested fix
**Issues** (non-blocking):
- [file:line] Problem description
Fix: suggested fix
If no issues found: `Pre-Landing Review: No issues found.`
Be terse. One line problem, one line fix. No preamble.
---
## Pass 1 — CRITICAL
<generate 2-4 critical categories based on the project's actual risks>
## Pass 2 — INFORMATIONAL
<generate 3-6 informational categories based on the project's patterns>
---
## Suppressions — DO NOT flag these
<generate 3-5 suppression rules to reduce false positives>
Start from the seed file, but the final categories must be derived from the project, not generic boilerplate. Examples of how project signals map to checklist items:
| Project signal | → Critical category |
|---|---|
| Raw SQL / migrations dir | SQL injection, parameterized queries |
| AGENTS.md lists canonical values | Vocabulary drift |
| Insert-only / upsert patterns | Idempotency regressions |
| API key / OAuth in auth module | Secrets in tracked files |
| Rate limit handling in code | Rate limit safety |
| Project signal | → Informational category | |---|---| | Architecture doc with contracts | Schema drift from contracts | | Endpoint whitelist | Unauthorized endpoint usage | | Migration files present | Editing applied migrations | | Test directory exists | Test gaps for new code paths |
Write the file to ~/.avadbot/projects/<repo>/review-checklist.md and continue.
This file persists — future /ship runs will use it directly.
Apply it in two passes:
Classify each finding as AUTO-FIX or ASK using the Fix-First Heuristic:
AUTO-FIX (fix without asking — mechanical, low-risk):
ASK (needs user judgment — ambiguous or high-risk):
Critical findings lean toward ASK; informational lean toward AUTO-FIX.
Auto-fix all AUTO-FIX items. Apply each fix. Output one line per fix:
[AUTO-FIXED] [file:line] Problem → what you did
If ASK items remain, present them in ONE AskUserQuestion:
After all fixes (auto + user-approved):
git add <fixed-files> && git commit -m "fix: pre-landing review fixes"), then re-run validation (Step 3) to confirm fixes don't break anything. If validation passes, continue. If it fails, stop.Output summary: Pre-Landing Review: N issues — M auto-fixed, K asked (J fixed, L skipped)
If no issues found: Pre-Landing Review: No issues found.
Read TODOS.md in the repo root. If it doesn't exist, skip this step silently.
If it exists:
Detect completed items: Scan the diff and commit history for work that closes open TODOs. Match conservatively — only mark items done when the diff clearly resolves the TODO's What description.
Move completed items to the ## Completed section, preserving original content and appending:
**Completed:** vX.Y.Z (YYYY-MM-DD)
Check structure: Verify items follow the format in avad-review/TODOS-format.md
(What/Why/Context/Effort/Priority). Do not rewrite existing items — only flag malformed ones
as informational.
If any items were moved to Completed, stage TODOS.md for the version bump commit in Step 8.
Find the version source (check in order, use the first match):
VERSION filepackage.json → "version" fieldpyproject.toml → version fieldCargo.toml → version fieldVERSION file starting at 0.1.0Auto-decide the bump level based on the diff:
git diff origin/<target>...HEAD --stat | tail -1Compute the new version:
1.2.3 + MINOR → 1.3.0Write the new version to the same source where it was found.
If CHANGELOG.md does not exist, create it with a standard header:
# Changelog
All notable changes to this project will be documented in this file.
Auto-generate the entry from ALL commits on the branch:
git log <target>..HEAD --oneline for commit historygit diff <target>...HEAD for the full diff### Added — new features### Changed — changes to existing functionality### Fixed — bug fixes### Removed — removed features## [X.Y.Z] - YYYY-MM-DDDo NOT ask the user to describe changes. Infer from the diff and commit history.
Goal: Create small, logical commits that work well with git bisect.
This step handles uncommitted changes only — do not rewrite, reorder, or amend existing branch commits. The branch history is the developer's responsibility.
If there are no uncommitted changes, skip to Step 9.
Commit ordering (earlier commits first):
Rules for splitting:
Each commit must be independently valid — no broken imports, no references to code that doesn't exist yet. Order commits so dependencies come first.
Commit message format:
<type>: <summary> (type = feat/fix/chore/refactor/docs)docs/GIT_WORKFLOW.md if availablegit commit -m "$(cat <<'EOF'
chore: bump version and changelog (vX.Y.Z)
Co-Authored-By: Claude <[email protected]>
EOF
)"
git push -u origin <branch-name>
Never force push.
Target branch: <target> (from docs/GIT_WORKFLOW.md).
git fetch origin
Verify the branch is still based on the latest origin/<target>.
Create a PR:
gh pr create --base <target> --title "<type>: <summary>" --body "$(cat <<'EOF'
## Summary
<bullet points from CHANGELOG>
## Validation
<commands run, pass/fail results>
## Test Coverage
<coverage diagram from Step 3.5, or "All new code paths have test coverage.">
<If Step 3.5 ran: "Tests: {before} → {after} (+{delta} new)">
## Pre-Landing Review
<findings from Step 5, or "No issues found.">
## Risks / Follow-ups
<assumptions, residual risk, follow-up work — or "None.">
🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
Output the PR URL — this is the final output the user sees.
git fetch first./ship, next thing they see is the review + PR URL.When /ship completes successfully:
origin/<target><target>data-ai
Clear the freeze boundary set by /avad-freeze, allowing edits to all directories again. Use when you want to widen edit scope without ending the session. Use when asked to "unfreeze", "unlock edits", "remove freeze", or "allow all edits".
development
Pre-landing code review. Analyzes diff for structural issues using a project-specific checklist. Two modes: local (review current branch) or PR (review and comment on a GitHub PR by number). Proactively suggest when the user is about to merge or land code changes.
development
Weekly engineering retrospective. Analyzes commit history, work patterns, and code quality metrics with persistent history and trend tracking. Team-aware: breaks down per-person contributions with praise and growth areas.
development
Systematically QA test a web application and fix bugs found. Runs QA testing, then iteratively fixes bugs in source code, committing each fix atomically and re-verifying. Use when asked to "qa", "QA", "test this site", "find bugs", "test and fix", or "fix what's broken". Four modes: diff-aware (automatic on feature branches), full (systematic exploration), quick (30-second smoke test), regression (compare against baseline). Three tiers: Quick (critical/high only), Standard (+medium), Exhaustive (+cosmetic). Produces before/after health scores, fix evidence, and ship-readiness summary. Supports report-only mode — asks whether to fix or just report.