Run test plan
Skill existential-birds/beagle/plugins/beagle-testing/skills/run-test-plan
Agent Skills marketplace: framework-aware skills for code review, documentation, test-plan generation, AI-writing detection, architectural analysis, and git workflows — for Python, Go, Rust, Elixir, React, Remix, and iOS/Swift. Works with Claude Code, Codex, and any agent that supports Agent Skills.
npx -y skills add existential-birds/beagle --skill run-test-planAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Execute YAML test plan, stop on first failure, output rich debug prompt
SKILL.md
11.4 KB, ~2.9k tokens by cl100k_base, as published. Nobody here has run it
Run Test Plan
Execute a YAML test plan, run setup commands, health checks, and each test sequentially. Stop on first failure with rich debug output.
Prerequisites
- agent-browser CLI: Browser tests require the
agent-browsercommand-line tool to be available onPATH
Arguments
--plan <path>: Path to test plan (default:docs/testing/test-plan.yaml)--skip-setup: Skip setup commands and health checks (for re-running after failure)
Step 1: Parse Test Plan
Read and validate the test plan:
# Resolve plan path from --plan (default shown)
PLAN_PATH="${PLAN_PATH:-docs/testing/test-plan.yaml}"
# Check file exists
ls "$PLAN_PATH" || { echo "Error: Test plan not found: $PLAN_PATH"; exit 1; }
# Validate YAML
python3 -c "import yaml; yaml.safe_load(open('$PLAN_PATH'))" || { echo "Error: Invalid YAML: $PLAN_PATH"; exit 1; }
Extract from the YAML:
setup.commands: List of setup commandssetup.health_checks: List of URLs to polltests: Array of test cases
Step 2: Run Setup (unless --skip-setup)
2a. Check Prerequisites
If setup.prerequisites exists, verify each one:
# For each prerequisite in setup.prerequisites
<prerequisite.check> || { echo "Prerequisite not met: <prerequisite.name>"; exit 1; }
2b. Set Environment Variables
If setup.env exists, export each variable. Variables using ${VAR} syntax should be resolved from the current environment:
# For each key/value in setup.env
export <key>="<value>"
2c. Build
If setup.build exists, execute build commands sequentially:
# For each command in setup.build
<command> || { echo "Build failed: <command>"; exit 1; }
2d. Start Services
If setup.services exists, start long-running processes and wait for health checks:
# For each service in setup.services
nohup <service.command> > .beagle/service-<index>.log 2>&1 &
echo $! > .beagle/service-<index>.pid
For each service with a health_check, poll until ready:
timeout=<service.health_check.timeout or 30>
url=<service.health_check.url>
elapsed=0
while [ $elapsed -lt $timeout ]; do
if curl -s -o /dev/null -w "%{http_code}" "$url" | grep -qE "^(200|301|302)"; then
echo "✓ Health check passed: $url"
break
fi
sleep 2
elapsed=$((elapsed + 2))
done
if [ $elapsed -ge $timeout ]; then
echo "✗ Health check timeout: $url"
exit 1
fi
2e. Legacy Setup Format
If the plan uses the older flat format (setup.commands + setup.health_checks instead of prerequisites/build/services), fall back to executing setup.commands sequentially and polling setup.health_checks as before.
Step 3: Gate — setup ready before tests
Do not start Step 4 until each condition you can check is true:
- Plan load: The file from
--plan(defaultdocs/testing/test-plan.yaml) exists and parses as YAML (same checks as Step 1). - Setup branch:
- If not using
--skip-setup: Everysetup.prerequisitescheck that exists exited 0; everysetup.buildcommand succeeded; every servicehealth_checkreached HTTP 200, 301, or 302 within its timeout or legacysetup.health_checkspassed aftersetup.commands. - If using
--skip-setup: Before TC-01, confirm anything the plan still needs is alive—at minimum one successfulcurl(or equivalent) to each URL insetup.health_checksor eachsetup.services[].health_check.urlthat the tests depend on.
- If not using
- Evidence path:
mkdir -p docs/testing/evidencesucceeds and the directory exists.
If any gate fails, stop, fix setup or flags, and do not execute tests.
Step 4: Execute Tests Sequentially
For each test in the plan:
4a. Log Test Start
## Running: TC-XX - <test.name>
Context: <test.context>
4b. Execute Steps
For each step in test.steps, determine the step type and execute accordingly:
Shell commands (run: steps):
The most common step type. Execute the command via Bash and capture stdout, stderr, and exit code:
# Execute the command, capture output and exit code
<command> 2>&1
echo "EXIT_CODE: $?"
Capture all output for evaluation in step 4c. Shell steps cover:
- CLI binary invocations (e.g.,
./target/debug/myapp status --all) - Database queries (e.g.,
psql "${DATABASE_URL}" -c "SELECT ...") - File inspection (e.g.,
ls -la /path/to/expected/output) - Process lifecycle checks (e.g.,
timeout 5 ./myapp 2>&1 || true) - Any other command a human would type in a terminal
curl actions (action: curl steps):
curl -X <method> \
-H "Content-Type: application/json" \
<additional headers> \
-d '<body>' \
"<url>" \
-o response.json \
-w "%{http_code}" > status_code.txt
# Capture response for evaluation
cat response.json
cat status_code.txt
agent-browser CLI actions:
Steps starting with agent-browser are browser automation commands:
# Navigate
agent-browser open <url>
# Snapshot interactive elements (always do before interacting)
agent-browser snapshot -i
# Interact using refs from snapshot output (@e1, @e2, etc.)
agent-browser fill @<ref> "<value>"
agent-browser click @<ref>
# Wait for conditions
agent-browser wait --url "<pattern>"
agent-browser wait --text "<text>"
agent-browser wait --load networkidle
# Capture evidence
agent-browser screenshot docs/testing/evidence/<test.id>.png
Important: Always run agent-browser snapshot -i before interacting with elements to get valid refs, and re-snapshot after navigation or significant DOM changes.
Save screenshots to docs/testing/evidence/<test.id>.png
4c. Evaluate Result
Gate — artifacts before PASS/FAIL:
run:steps: Stdout and stderr captured; exit code recorded (e.g.EXIT_CODE:line or equivalent).action: curlsteps: Response body and HTTP status captured to known paths (e.g.response.json,status_code.txtor paths the plan specifies).- agent-browser steps: After any navigation or DOM change, a fresh
agent-browser snapshot -iexists before asserting; if the test records evidence, the screenshot file path is created or failure is explicit.
Then, using agent reasoning, compare actual outcome against test.expected:
- Read the expected behavior description
- Compare with actual response/screenshot
- Determine PASS or FAIL
4d. On PASS
✓ TC-XX PASSED: <test.name>
Continue to next test.
4e. On FAIL
Stop immediately. Go to Step 6.
Step 5: On All Tests Pass
## Test Results: ALL PASSED
| ID | Name | Result |
|----|------|--------|
| TC-01 | <name> | ✓ PASS |
| TC-02 | <name> | ✓ PASS |
| ... | ... | ... |
**Total:** N/N tests passed
### Evidence
Screenshots saved to `docs/testing/evidence/`
### Cleanup
Stopping background services...
Clean up:
# Kill background services
for pidfile in .beagle/service-*.pid .beagle/dev-server.pid; do
if [ -f "$pidfile" ]; then
kill $(cat "$pidfile") 2>/dev/null
rm "$pidfile"
fi
done
Step 6: On Failure - Generate Debug Prompt
When a test fails, generate rich debug output:
6a. Gather Context
# Get changed files relevant to the failure
git diff --name-only $(git merge-base HEAD origin/main)..HEAD
# Get recent changes in files mentioned in test.context
git diff $(git merge-base HEAD origin/main)..HEAD -- <relevant_files>
6b. Output Debug Report
## Test Failure: TC-XX - <test.name>
### What Failed
**Test:** <test.name>
**Expected:**
<test.expected>
**Actual:**
<Describe what actually happened - response code, error message, screenshot description>
### Relevant Changes in This PR
<For each file mentioned in test.context or related to the failure:>
- `<file>` (lines X-Y) - <brief description of changes>
### Evidence
<If screenshot exists:>
- Screenshot: `docs/testing/evidence/<test.id>.png`
<If API response:>
- Status code: <code>
- Response body:
```json
<response>
Error Details
<If error message in response or logs:> ``` <error message> ```Suggested Investigation
<Based on the error, suggest 2-3 specific things to check:>
- <First thing to check based on error type>
- <Second thing related to changed files>
- <Third thing about environment/setup>
Debug Session Prompt
Copy this to start a new agent session:
I'm debugging a test failure in branch <branch>.
Test: <test.name> Error: <brief error description>
<Summarize what the test was checking and what went wrong>Relevant files: <List changed files related to this test>
Help me investigate why <specific failure reason>.
### 6c. Preserve Evidence
```bash
# Ensure evidence directory exists
mkdir -p docs/testing/evidence
# Save failure context
cat > docs/testing/evidence/<test.id>-failure.md << 'EOF'
# Failure Report: <test.id>
<Full debug report content>
EOF
6d. Cleanup and Exit
# Kill background services
for pidfile in .beagle/service-*.pid .beagle/dev-server.pid; do
if [ -f "$pidfile" ]; then
kill $(cat "$pidfile") 2>/dev/null
rm "$pidfile"
fi
done
Test Results Summary Table
Always output a summary table showing progress:
## Test Results
| ID | Name | Result |
|----|------|--------|
| TC-01 | <name> | ✓ PASS |
| TC-02 | <name> | ✗ FAIL |
| TC-03 | <name> | - SKIP |
**Passed:** 1/3
**Failed:** TC-02
Tests after a failure are marked as SKIP (not executed).
Verification
Before completing:
# Verify evidence directory exists
ls -la docs/testing/evidence/
# List captured evidence
ls docs/testing/evidence/*.png docs/testing/evidence/*.md 2>/dev/null
Pass conditions (all must be true to call the run complete):
ls -la docs/testing/evidence/exits 0 (directory exists).- Every test that ran has an explicit PASS or FAIL (not only “felt right”).
- If any test failed: a failure artifact exists (
docs/testing/evidence/<test.id>-failure.mdor equivalent) or the debug report was emitted with expected vs actual. - Cleanup ran: no stale
.beagle/service-*.pidpointing at live processes you started, unless the plan says to leave them up.
Verification Checklist:
- Setup commands executed successfully (or
--skip-setupwith live dependencies confirmed) - Health checks passed before test execution (Step 3 gate)
- Each executed test has recorded result
- Evidence captured in
docs/testing/evidence/ - On failure: debug prompt includes expected vs actual
- On failure: relevant PR changes listed
- Background processes cleaned up
Gates (ordered)
- Plan valid: YAML parses; required keys for your branch (
setup/tests) are present. - Setup healthy: Step 3 pass conditions met before TC-01.
- Per-test artifacts: Step 4c gate satisfied before marking PASS.
- Stop on fail: First failure → Step 6; later tests = SKIP in the summary table.
- Cleanup: Step 5 or Step 6d executed so background PIDs from this run are released.
Rules
- Stop on first test failure (do not continue to other tests)
- Always capture evidence (screenshots, responses)
- Include file:line references in debug prompts when possible
- Use
--skip-setupflag to re-run after fixing issues - Never hardcode secrets - use environment variables
- Clean up background processes even on failure
- Preserve failure evidence for debugging
- Make debug prompts copy-paste ready for new sessions
Gives 0 of the 12 instructions most plan spec skills give in ~2.9k tokens
Counted across 1,100 of the 1,860 authors here whose files we hold, read 2026-08-06
- ask one question at a timein 46 of 1100, across 38 files
- Break plans into vertical slicesin 28 of 1100, across 10 files
- Publish issues in dependency orderin 27 of 1100, across 9 files
- Iterate until user approves the breakdownin 24 of 1100, across 6 files
- Explore the repository to understand the codebase statein 24 of 1100, across 7 files
- Use domain glossary vocabularyin 23 of 1100, across 5 files
- Apply correct triage labels to published issuesin 23 of 1100, across 5 files
- Write failing tests before implementation codein 23 of 1100, across 18 files
- Prefer AFK slices over HITLin 22 of 1100, across 7 files
- ask clarifying questions until requirements are concretein 21 of 1100, across 13 files
- Respect existing architecture decision recordsin 20 of 1100, across 5 files
- write a specification before writing any codein 20 of 1100, across 12 files
Said here and by no other author read
- stop on first test failure
- verify setup before tests
- capture stdout stderr and exit codes
- snapshot interactive elements before browser interactions
- save screenshots to evidence directory
- generate debug prompt on test failure
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.