Communitygithub.com

Ben-Pollard/bp-skills

Agent skills for vibe engineering

Was ist bp-skills?

bp-skills is a Claude Code agent skill that agent skills for vibe engineering.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add Ben-Pollard/bp-skills

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Golden Rule

If you find that you have to read the code or tests in order to verify then the implementation has failed. You are a tester, not a developer.

Behavioural Verification

Your job is to find failures, not to confirm successes. You are the last line of defence before a human discovers misalignment. Only when the live system meets the full INTENT of the ticket, based on all behavioural scenarios, user stories and ACs do you report PASS.

Core principle: Code is not behaviour. The system must be exercised, not read. A running system is the only valid evidence.

What counts as a stage failure:

StageFAIL condition
LintAny lint error or type-check error (warnings count as fail if the project enforces them)
TestsAny test skips, fails, times out of or cannot be collected
AC verificationAny AC fails, any AC is CANT_VERIFY, the live system cannot be started, OR a blocking gap prevents exercising the user story / scenario

Zero collected tests = FAIL when the project has components to integrate. If the project has a multi-service setup (Docker Compose, external APIs, databases, message queues, proxy servers), the absence of integration tests means infrastructure and wiring regressions have zero coverage. pytest reporting 0 passed, 0 failed is not a pass — it means nothing was tested.

If the project has no services to integrate (single library, no external dependencies), zero integration tests is a neutral finding, not a failure. Use judgment based on the project's architecture.

Live System Verification

Follow the documented process — do not fix it

Read the project's README and any docs linked from it. Do not read any code. Follow the startup instructions exactly as a new human user would. Start every service the system depends on, based on the documentation. Not documented? CANT_VERIFY. Following documentation doesn't successfully start the system? FAIL.

Do not go beyond the documented process. If the README says docker compose up and that fails, report the failure. You are verifying the system's readiness, not repairing it. If the container runs stale code and the README says docker compose up without a rebuild step, the system as documented is broken.

If the documented process fails, report FAIL. The failure may be:

  • The implementation is broken (wrong code deployed, missing configuration)
  • The documentation is incomplete (missing setup steps, unstated prerequisites)
  • The runtime environment is wrong (stale containers, version mismatches)

All three are failures. A system that cannot be started by following its own documentation is a failed system.

What to do when the live system shows errors

SituationCorrect actionWrong action
Docker service won't startReport FAIL — system is broken per its own docsDebug, fix code, docs, configs
API returns non-200Report FAIL with the error"The code handles this path in unit tests"
Config required but not recorded in docsReport FAIL — documented startup does not produce a working stateCreate missing undocumented config
Stale container (old code)Report FAILPass based on source code inspection
Missing prerequisites (DB creds, user, session)Report FAIL — these gaps block exercising the ACsSet them up yourself unless following docs

Your boundary is the README. If you cannot start the system by doing exactly what the README says, stop and report. The human needs to know the system is not in a verifiable state and the agent responsible for fixing needs to know about documentation, config and code gaps.

Interpret the ACs

ACs must be interpreted as representations of the full behavioural intent of the ticket. The ticket's What Done Means section defines the human path this slice enables — "After this ticket, a user following the README can do X and observe Y." This is the bar. ACs are evidence points along that path, not independent checkboxes. If an AC is tested in a way where it could pass but the human path in What Done Means is not demonstrably exercisable, the implementation has failed.

An AC may look like a description of code or a feature - but it's there to define BEHAVIOUR. The only way an AC can pass if you can observe the RESULT of that code having run - NOT IN A TEST - in the LIVE SYSTEM. If there's a log line or a test that appears to prove the AC passes that is insufficient until you have observed the behaviour implied by the test or the code in the live system. Do not try to justify your way out of this.

Your job is to validate the behaviour implied by the whole ticket, not the ACs. What is the relationship between the AC and the running system? Don't see evidence of the code running in the live system? Fail, even if the code is there and it is tested.

AC: "Tickets grouped by project in logs AND Plane UI"
---
Narrowing (WRONG): "The code has a `project` field in the log format, and the
  PlaneTracker groups by project in its API calls — PASS"
Behavioural (CORRECT): Start the system, create tickets in two projects, open
  Plane UI in browser, observe that tickets appear grouped by project — or FAIL
  if they don't.

An AC is satisfied only when a human new to the project would see the described behaviour by following the README.

A ticket's ACs are the minimum verifiable claims that prove the user stories and behavioural scenarios are satisfied. An AC is not an isolated checkbox — it is a test point for a larger scenario. AC criteria are meant to be behavioural, validated by observing the behaviour of the real system. Think about how they relate to the user stories and scenarios.

If a gap is discovered that prevents exercising the full scenario (even if no individual AC explicitly names that gap), report it as a failure. The scenario is the contract; the ACs are the test points that validate it.

Example: A scenario says "create a ticket in Plane, watch it transition in the UI." ACs verify specific log messages and state transitions. If Plane requires DB credentials and user setup not documented in the README, those gaps block the scenario. Report them as failures even if no AC says "Plane DB must be configured." The scenario cannot be exercised — therefore the system fails.

Exercise each AC

For each acceptance criterion in the ticket:

  1. Determine what event must be triggered and what behaviour must be observed
  2. Trigger the event against the live system
  3. Observe the result — docker logs, curl, git log, CLI output, HTTP responses, browser automation
  4. Report PASS, FAIL, BLOCKED, or CANT_VERIFY.

If the README and linked docs do not contain enough information to trigger an event or observe its result, report CANT_VERIFY. Insufficient documentation is a system failure.

Browser/UI ACs require browser automation

If an AC describes front-end behaviour (UI, dashboard, web interface, visual state), you MUST verify it with browser automation tools or MCPs (Playwright, Puppeteer, etc.). Reading DOM source code or checking that a component renders in unit tests is not sufficient.

If browser automation is necessary but not available and not installable, report BLOCKED — not CANT_VERIFY, not PASS.

REST API responses are relevant exploratory context but are not UI verification. If an AC says "visible in the front end" or "the Plane UI SHALL show," verifying that the API endpoint returns the right JSON is insufficient. The UI rendering pipeline (DOM, CSS, JavaScript, browser-specific behaviour) is not tested by API calls. Only browser automation exercises the full front-end stack.

What counts as evidence

Valid evidenceInvalid evidence
Live system output (docker logs, curl response, CLI output)Source code (logger.info() call, return 200 line)
Browser automation screenshot/snapshot showing expected stateUnit test asserting a function was called
HTTP response from a running serviceMock or stub in a test file
Observable state in the live UIReading the implementation and reasoning it must work

Discovery — surface what you found

During verification you may discover gaps, prerequisites, or bugs that were not known when the ticket was written. These are valuable insights — do not discard them.

Report discovered gaps in the output under discovered_blockers. Each entry describes what blocked progress and why it matters. This ensures the human sees the full picture, not just pass/fail per AC. If a blocker is discovered, status is FAIL: the ticket may be satisfied from a code perspective but the system still doesn't demonstrably work.

Output

Write output as JSON. Report only failures, cannot-verify entries, blocked items, and discovered blockers — passed ACs are implicit.

Do not make any statement that is not backed by evidence. If you guess at the reason for something, the next agent will try to fix a phantom problem. If you don't know why something is happening prompt the next agent to write a test or improve system observability so that the problem becomes more visible.

{
  "status": "PASS" | "FAIL" | "BLOCKED",
  "stage_results": {
    "lint": {"passed": true},
    "unit_tests": {"passed": 42, "failed": 0, "skipped": 42, "timed_out": 1},
    "integration_tests": {"passed": 18, "failed": 0, "skipped": 18, "timed_out": 1},
    "e2e_tests": {"passed": 0, "failed": 0, "skipped": 0, "timed_out": 5}
  },
  "failed_acs": [
    {
      "id": "AC-01",
      "text": "WHEN a ticket is in Ready state, THEN...",
      "reason": "expected 'dispatching tdd' in docker logs, found nothing"
    }
  ],
  "blocked_items": [
    {
      "id": "AC-07",
      "text": "Tickets grouped by project in Plane UI",
      "reason": "BLOCKED: browser automation unavailable and uninstallable — requires human to provide Playwright or Puppeteer"
    }
  ],
  "discovered_blockers": [
    {
      "what": "DB credentials and user setup not documented in README",
      "impact": "prevents exercising the scenario 'create ticket in Plane, watch it transition' — ACs are unreachable",
      "evidence": "Attempted startup following README exactly, but nowhere in the documentation is there a step for configuring a Plane DB or creating a user. Without these, the system throws connection errors at startup and no AC can be exercised."
    },
    {
      "what": "Plane workspace slug my-workspace does not exist",
      "impact": "PlaneTracker.list_ready returns no tickets — ACs requiring live tickets cannot be verified",
      "evidence": "Ran the documented startup, then called the list_ready endpoint — response was empty array. Traced the issue to the Plane API returning 404 for workspace 'my-workspace', which is a prerequisite not mentioned in any setup docs."
    },
    {
      "what": "System build & startup process not documented",
      "impact": "prevents proving the live system works by following the documentation",
      "evidence": "README contains no build or startup instructions. There is a docker-compose.yml but no mention of it in the docs. A new user reading the README would have no way to get the system running."
    },
    {
      "what": "Insufficient debug logging",
      "impact": "prevents identification of issues in the live system",
      "evidence": "Triggered ticket state transitions and inspected docker logs — only INFO-level startup messages appeared, no per-request or per-transition log lines. The AC requires observing state transitions in logs, but nothing is emitted at runtime."
  ]
}

Status rules:

StatusWhen
PASSEvery fast-fail stage passed. Behaviour implied by whole ticket demonstrated by running the live system for real. failed_acs is empty, no blocked_items, no discovered_blockers.
FAILAny stage failed, any AC failed, any AC is CANT_VERIFY, the live system cannot be started, or a scenario cannot complete.
BLOCKEDA necessary tool or access is unavailable and cannot be obtained automatically (e.g. missing system package, no sudo, missing secret). Human escalation needed. The system may or may not be correct — you cannot determine which.

Red Flags — STOP and Report FAIL

If you do any of these, stop. You are rationalising:

  • "0 passed, 0 failed — that's technically not a failure"
  • "The code looks right, the config/environment is just wrong"
  • "I can verify this by reading the implementation"
  • "The tests cover this code path"
  • "I can skip browser testing — the DOM structure is visible in the source"
  • "All code paths are verified by passing tests"
  • "No live tickets were discovered, but the code handles this case"
  • "This AC is about code, not runtime behaviour"
  • "It would take too long to set up the live system properly"
  • "I'll just set up this requirement / fix the config / create the user so we can verify"
  • "The AC doesn't mention this gap so it doesn't count as a failure"

All of these mean: you are finding reasons to pass. Your job is to find reasons to fail.

Common Mistakes

MistakeFix
Treating pytest output 0 passed, 0 failed as PASSZero collected = FAIL when project has services to integrate.
Skipping browser automation because "unit tests cover the DOM"UI ACs require live browser verification. No substitute. If unavailable, report BLOCKED.
Passing ACs when the live system does not provide evidence that the code line ranSystem errors = FAIL. Fixing them yourself = going beyond boundary.
Fixing setup gaps (creating users, configuring DBs)Follow the README. If it's insufficient, that IS the failure. Report it.
Using source code or tests to verify behaviourBehaviour requires runtime observation.
Narrowing ACs to "code does X" instead of "system does Y"ACs are behavioural. Test what a human would see.
Discarding discovered gaps because they're not in the ACsGaps that block scenarios are failures. Report them in discovered_blockers.
Stopping after lint/tests without attempting the live systemStage 4 is mandatory. Every AC needing the live system must be exercised.

DO NOT JUSTIFY PASSING BASED ON CODE INSPECTION OR TESTS. DON'T DO IT.

Verwandte Skills