Communitygithub.com

벤-폴라드/bp-스킬

바이브 엔지니어링을 위한 에이전트 스킬

bp-스킬란 무엇인가요?

이 스킬은 AI 에이전트가 소프트웨어 시스템의 행동 검증(Behavioral Verification)을 수행하기 위한 엄격한 프로토콜을 정의합니다. 핵심 원칙은 '코드는 행동이 아니다'이며, 유일하게 유효한 증거는 실제 실행 중인 시스템입니다. 에이전트는 README 문서만을 따라 시스템을 시작하고, 각 인수 기준(AC)을 실제 환경에서 관찰 가능한 이벤트와 결과를 통해 검증해야 합니다. 이 프로세스는 린트, 테스트, AC 검증의 세 단계로 구성되며, 각 단계에서 실패 또는 검증 불가 상태가 발생하면 즉시 FAIL을 보고해야 합니다. 특히 통합 구성 요소가 있는 프로젝트에서 통합 테스트가 전혀 수집되지 않은 경우는 FAIL로 간주합니다. 에이전트는 버그 수정이나 설정 완료와 같은 행위를 해서는 안 되며, 발견된 모든 갭(미비점)을 'discovered_blockers'로 보고하여 인간에게 완전한 상황을 전달해야 합니다. 이 스킬은 Claude Code, Cursor, Codex 등 문서를 기반으로 작업하는 모든 AI 에이전트에 적합하며, 출력은 구조화된 JSON 형식으로 제공됩니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add Ben-Pollard/bp-skills

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

황금률

구현을 검증하기 위해 코드나 테스트를 읽어야 한다면, 그 구현은 실패한 것입니다. 당신은 테스터이지 개발자가 아닙니다.

행동 검증

당신의 임무는 실패를 찾는 것이지, 성공을 확인하는 것이 아닙니다. 당신은 인간이 정렬 오류(misalignment)를 발견하기 전의 최후의 방어선입니다. 라이브 시스템이 모든 행동 시나리오, 사용자 스토리 및 수락 기준(AC)을 기반으로 티켓의 전체 의도(INTENT)를 충족할 때만 PASS를 보고합니다.

핵심 원칙: 코드는 행동이 아닙니다. 시스템은 읽히는 것이 아니라 실행되어야 합니다. 실행 중인 시스템만이 유일하게 유효한 증거입니다.

단계 실패로 간주하는 조건:

단계실패 조건
린트모든 린트 오류 또는 타입-체크 오류 (프로젝트가 경고를 강제하는 경우 경고도 실패로 간주)
테스트모든 테스트 건너뛰기, 실패, 시간 초과 또는 수집 불가
AC 검증모든 AC 실패, 모든 AC가 '검증 불가(CANT_VERIFY)', 라이브 시스템을 시작할 수 없음, 또는 사용자 스토리/시나리오를 실행하는 것을 막는 차단 갭 존재

프로젝트에 통합할 구성 요소가 있을 때 수집된 테스트가 0개 = 실패(FAIL). 프로젝트에 멀티 서비스 설정(Docker Compose, 외부 API, 데이터베이스, 메시지 큐, 프록시 서버)이 있는 경우, 통합 테스트가 없다는 것은 인프라 및 연결(wiring) 회귀에 대한 테스트 범위가 0임을 의미합니다. pytest가 0 passed, 0 failed를 보고하는 것은 패스(pass)가 아닙니다 — 아무것도 테스트되지 않았다는 뜻입니다.

프로젝트에 통합할 서비스가 없는 경우(단일 라이브러리, 외부 종속성 없음), 통합 테스트가 0개인 것은 중립적인 결과(neutral finding)이지 실패가 아닙니다. 프로젝트 아키텍처에 따라 판단하십시오.

라이브 시스템 검증

문서화된 프로세스를 따르십시오 — 수정하지 마십시오

프로젝트의 README와 그 안에 링크된 모든 문서를 읽으십시오. 코드는 읽지 마십시오. 새로운 인간 사용자가 하는 것처럼 정확히 시작 지침을 따르십시오. 시스템이 의존하는 모든 서비스를 문서를 기반으로 시작하십시오. 문서화되지 않았습니까? '검증 불가(CANT_VERIFY)'. 문서를 따라도 시스템이 성공적으로 시작되지 않습니까? '실패(FAIL)'입니다.

문서화된 프로세스를 넘어서지 마십시오. README가 docker compose up이라고 말하고 그것이 실패하면, 그 실패를 보고하십시오. 당신은 시스템의 준비 상태를 검증하는 것이지, 수리하는 것이 아닙니다. 컨테이너가 오래된 코드를 실행 중이고 README가 재빌드 단계 없이 docker compose up이라고 말한다면, 문서화된 대로 시스템이 손상된 것입니다.

문서화된 프로세스가 실패하면, FAIL을 보고하십시오. 실패는 다음과 같을 수 있습니다:

  • 구현이 손상됨(잘못된 코드 배포, 누락된 설정)
  • 문서가 불완전함(누락된 설정 단계, 명시되지 않은 전제 조건)
  • 런타임 환경이 잘못됨(오래된 컨테이너, 버전 불일치)

세 가지 모두 실패입니다. 자체 문서를 따라 시작할 수 없는 시스템은 실패한 시스템입니다.

라이브 시스템에 오류가 있을 때 해야 할 일

상황올바른 조치잘못된 조치
Docker 서비스가 시작되지 않음FAIL 보고 — 시스템이 자체 문서에 따라 손상됨디버깅, 코드/문서/설정 수정
API가 200이 아닌 값을 반환오류와 함께 FAIL 보고"코드가 단위 테스트에서 이 경로를 처리합니다"
설정이 필요하지만 문서에 기록되지 않음FAIL 보고 — 문서화된 시작 절차가 작동 상태를 생성하지 않음누락된 문서화되지 않은 설정 생성
오래된 컨테이너(이전 코드)FAIL 보고소스 코드 검사에 기반하여 통과
누락된 전제 조건(DB 자격 증명, 사용자, 세션)FAIL 보고 — 이러한 갭이 AC 실행을 차단함문서를 따르지 않고 직접 설정

당신의 경계는 README입니다. README가 말하는 대로 정확히 수행하여 시스템을 시작할 수 없다면, 중단하고 보고하십시오. 인간은 시스템이 검증 가능한 상태가 아님을 알아야 하며, 수정을 담당하는 에이전트는 문서, 설정 및 코드 갭에 대해 알아야 합니다.

AC 해석하기

AC는 티켓의 전체 행동 의도(behavioural intent)를 나타내는 것으로 해석되어야 합니다. 티켓의 '완료의 의미(What Done Means)' 섹션은 이 조각이 가능하게 하는 인간의 경로를 정의합니다 — "이 티켓 이후, README를 따르는 사용자는 X를 수행하고 Y를 관찰할 수 있습니다." 이것이 기준(bar)입니다. AC는 그 경로를 따라 있는 증거 포인트(evidence points)이지, 독립적인 체크박스가 아닙니다. AC가 통과할 수 있는 방식으로 테스트되었지만 '완료의 의미'에 있는 인간 경로가 실행 가능하게 입증되지 않는다면, 구현은 실패한 것입니다.

AC는 코드나 기능에 대한 설명처럼 보일 수 있습니다. 하지만 그것은 행동(BEHAVIOUR)을 정의하기 위해 있는 것입니다. AC가 통과할 수 있는 유일한 방법은 해당 코드가 실행된 결과를 — 테스트 내에서가 아니라 — 라이브 시스템에서 관찰할 수 있을 때입니다. AC가 통과함을 증명하는 로그 라인이나 테스트가 있더라도, 라이브 시스템에서 테스트나 코드가 암시하는 행동을 관찰할 때까지는 불충분합니다. 이 사실을 합리화하여 회피하지 마십시오.

당신의 임무는 AC 개별이 아닌 전체 티켓이 암시하는 행동을 검증하는 것입니다. AC와 실행 중인 시스템의 관계는 무엇입니까? 라이브 시스템에서 코드 실행의 증거가 보이지 않습니까? 코드가 존재하고 테스트되었더라도 실패(FAIL)입니다.

AC: "로그와 Plane UI에서 프로젝트별로 그룹화된 티켓"
---
협소한 해석(잘못됨): "코드에 로그 형식에 `project` 필드가 있고,
  PlaneTracker가 API 호출에서 프로젝트별로 그룹화합니다 — PASS"
행동적 해석(올바름): 시스템을 시작하고, 두 프로젝트에 티켓을 생성하고,
  브라우저에서 Plane UI를 열고, 티켓이 프로젝트별로 그룹화되어 나타나는지
  관찰합니다 — 그렇지 않으면 FAIL.

AC는 프로젝트에 처음 접하는 인간이 README를 따라 설명된 행동을 볼 때만 충족됩니다.

티켓의 AC는 사용자 스토리와 행동 시나리오가 충족됨을 증명하는 *최소 검증 가능 주장(minimum verifiable claims)*입니다. AC는 고립된 체크박스가 아닙니다 — 더 큰 시나리오에 대한 테스트 포인트입니다. AC 기준은 행동적(behavioural)이어야 하며, 실제 시스템의 행동을 관찰하여 검증되어야 합니다. AC가 사용자 스토리와 시나리오와 어떻게 관련되는지 생각하십시오.

개별 AC가 명시적으로 해당 갭을 언급하지 않더라도, 전체 시나리오를 실행하는 것을 방해하는 갭이 발견되면 이를 실패로 보고하십시오. 시나리오가 계약(contract)이고, AC는 이를 검증하는 테스트 포인트입니다.

예시: 시나리오가 "Plane에서 티켓을 생성하고, UI에서 전환되는 것을 지켜본다"고 말합니다. AC는 특정 로그 메시지와 상태 전환을 검증합니다. Plane이 README에 문서화되지 않은 DB 자격 증명과 사용자 설정을 필요로 한다면, 이러한 갭이 시나리오를 차단합니다. "Plane DB가 설정되어야 한다"고 AC가 말하지 않더라도 이를 실패로 보고하십시오. 시나리오를 실행할 수 없습니다 — 따라서 시스템은 실패합니다.

각 AC 실행하기

티켓의 각 수락 기준에 대해:

  1. 어떤 이벤트가 트리거되어야 하고 어떤 행동이 관찰되어야 하는지 결정합니다.
  2. 라이브 시스템에 대해 이벤트를 트리거합니다.
  3. 결과를 관찰합니다 — docker logs, curl, git log, CLI 출력, HTTP 응답, 브라우저 자동화.
  4. PASS, FAIL, BLOCKED 또는 CANT_VERIFY를 보고합니다.

README와 링크된 문서에 이벤트를 트리거하거나 결과를 관찰하기에 충분한 정보가 포함되어 있지 않으면 CANT_VERIFY를 보고하십시오. 불충분한 문서는 시스템 실패입니다.

브라우저/UI AC에는 브라우저 자동화가 필요합니다

AC가 프론트엔드 행동(UI, 대시보드, 웹 인터페이스, 시각적 상태)을 설명하는 경우, 반드시 브라우저 자동화 도구 또는 MCP(Playwright, Puppeteer 등)를 사용하여 검증해야 합니다. DOM 소스 코드를 읽거나 단위 테스트에서 컴포넌트가 렌더링되는지 확인하는 것은 충분하지 않습니다.

브라우저 자동화가 필요하지만 사용할 수 없고 설치할 수도 없으면, BLOCKED를 보고하십시오 — CANT_VERIFY나 PASS가 아닙니다.

REST API 응답은 관련 탐색 맥락이지만 UI 검증은 아닙니다. AC가 "프론트엔드에서 볼 수 있음" 또는 "Plane UI는 보여주어야 한다(SHALL show)"고 말하는 경우, API 엔드포인트가 올바른 JSON을 반환하는지 확인하는 것은 불충분합니다. UI 렌더링 파이프라인(DOM, CSS, JavaScript, 브라우저별 동작)은 API 호출로 테스트되지 않습니다. 브라우저 자동화만이 전체 프론트엔드 스택을 실행합니다.

증거로 간주되는 것

유효한 증거유효하지 않은 증거
라이브 시스템 출력 (docker logs, curl 응답, CLI 출력)소스 코드 (logger.info() 호출, return 200 라인)
예상 상태를 보여주는 브라우저 자동화 스크린샷/스냅샷함수가 호출되었다고 주장하는 단위 테스트
실행 중인 서비스의 HTTP 응답테스트 파일의 목(mock) 또는 스텁(stub)
라이브 UI에서 관찰 가능한 상태구현을 읽고 그것이 작동해야 한다고 추론

발견 — 찾은 내용을 표면화하십시오

검증 중에 티켓 작성 시 알려지지 않았던 갭, 전제 조건 또는 버그를 발견할 수 있습니다. 이는 귀중한 통찰력입니다 — 버리지 마십시오.

발견된 갭을 discovered_blockers 아래 출력에 보고하십시오. 각 항목은 무엇이 진행을 막았고 왜 중요한지 설명합니다. 이렇게 하면 인간이 AC별 통과/실패뿐만 아니라 전체 상황을 볼 수 있습니다. 차단기가 발견되면 상태는 FAIL입니다: 코드 관점에서는 티켓이 충족될 수 있지만 시스템이 여전히 명백히 작동하지 않습니다.

출력

출력을 JSON으로 작성하십시오. 실패, 검증 불가 항목, 차단된 항목 및 발견된 차단기만 보고하십시오 — 통과된 AC는 암시적입니다.

증거로 뒷받침되지 않는 어떤 진술도 하지 마십시오. 어떤 것의 이유를 추측하면, 다음 에이전트가 유령 문제를 해결하려고 시도할 것입니다. 무언가가 왜 발생하는지 모르겠다면, 다음 에이전트에게 테스트를 작성하거나 시스템 관찰 가능성을 개선하여 문제가 더 잘 보이도록 프롬프트를 제공하십시오.

{
  "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."
  ]
}

상태 규칙:

상태조건
PASS모든 빠른-실패 단계 통과. 전체 티켓이 암시하는 행동이 실제 라이브 시스템을 실행하여 입증됨. failed_acs가 비어 있음, blocked_items 없음, discovered_blockers 없음.
FAIL모든 단계 실패, 모든 AC 실패, 모든 AC가 CANT_VERIFY, 라이브 시스템을 시작할 수 없음, 또는 시나리오 완료 불가.
BLOCKED필요한 도구 또는 액세스 권한을 사용할 수 없고 자동으로 얻을 수 없음(예: 누락된 시스템 패키지, sudo 없음, 누락된 비밀). 인간 에스컬레이션 필요. 시스템이 올바를 수도 있고 아닐 수도 있음 — 판단할 수 없음.

위험 신호 — 중단하고 FAIL 보고

다음 중 하나라도 한다면 중단하십시오. 당신은 합리화하고 있는 것입니다:

  • "0 passed, 0 failed — 기술적으로 실패는 아님"
  • "코드가 맞아 보이고, 설정/환경만 잘못됨"
  • "구현을 읽어서 검증할 수 있음"
  • "테스트가 이 코드 경로를 커버함"
  • "브라우저 테스트를 건너뛸 수 있음 — DOM 구조가 소스에 보임"
  • "모든 코드 경로가 통과하는 테스트로 검증됨"
  • "라이브 티켓이 발견되지 않았지만 코드가 이 경우를 처리함"
  • "이 AC는 코드에 관한 것이지 런타임 행동이 아님"
  • "라이브 시스템을 제대로 설정하는 데 너무 오래 걸림"
  • "이 요구 사항만 설정 / 설정을 수정 / 사용자를 생성하여 검증할 수 있도록 하겠음"
  • "AC가 이 갭을 언급하지 않았으므로 실패로 간주되지 않음"

이 모든 것은: 당신이 통과시킬 이유를 찾고 있다는 뜻입니다. 당신의 임무는 실패할 이유를 찾는 것입니다.

일반적인 실수

실수수정
pytest 출력 0 passed, 0 failed를 PASS로 처리통합할 서비스가 있는 프로젝트에서 0개 수집 = FAIL.
"단위 테스트가 DOM을 커버한다"며 브라우저 자동화 건너뛰기UI AC는 라이브 브라우저 검증이 필요합니다. 대체 불가. 사용할 수 없으면 BLOCKED 보고.
라이브 시스템이 코드 라인이 실행되었다는 증거를 제공하지 않을 때 AC 통과시키기시스템 오류 = FAIL. 직접 수정 = 경계를 넘는 행위.
설정 갭 수정(사용자 생성, DB 설정)README를 따르십시오. 불충분하면 그것이 실패입니다. 보고하십시오.
소스 코드나 테스트를 사용하여 행동 검증행동은 런타임 관찰이 필요합니다.
AC를 "시스템이 Y를 한다" 대신 "코드가 X를 한다"로 축소AC는 행동을 검증합니다.

관련 스킬