| name | evidence-validate |
| description | Playwright-based evidence capture protocol. Produces screenshot + HTML + console proof mapped per AC ID. Used by kopi-validate agent to generate pass/fail evidence for the evidence-manifest. |
| license | MIT |
| allowed-tools | ["mcp__playwright__browser_navigate","mcp__playwright__browser_click","mcp__playwright__browser_take_screenshot","mcp__playwright__browser_snapshot","mcp__playwright__browser_evaluate","mcp__playwright__browser_wait_for"] |
evidence-validate
Playwright-based evidence capture protocol. Produces screenshot + HTML + console proof mapped per AC ID.
Protocol
Setup
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
page.on('console', msg => log(msg));
page.on('pageerror', err => log(err));
Per AC: Evidence Capture Sequence
1. Navigate to the relevant page/state
2. SCREENSHOT: before state (before.png)
3. Execute the Given/When action
4. SCREENSHOT: after state (after.png)
5. CAPTURE: page.content() → save as .html
6. CAPTURE: console log buffer → save as .txt
7. Assert the Then condition
8. Record: pass | fail | skip | blocked
Screenshot Naming
evidence/AC-{taskId}-{acSeq}-before.png
evidence/AC-{taskId}-{acSeq}-after.png
Assertion Patterns
| AC category | Playwright assertion |
|---|
| behavior | await expect(locator).toHaveState(...) |
| display | await expect(locator).toBeVisible() |
| validation | await expect(locator).toHaveText(/error/) |
| navigation | await expect(page).toHaveURL(...) |
| accessibility | await checkA11y(page, null, {...}) |
Blocked Classification
Mark as blocked (not fail) when test environment is unavailable, required test data doesn't exist, or upstream dependency is not deployed. Always explain in notes.
Output Format
Output feeds artifacts/active/evidence-manifest-{taskId}.json and must conform to contracts/evidence-manifest.schema.json. Required top-level fields are artifact_type, artifact_version, task_id, trace_id, results, summary, generated_at, generated_by, and generated_by_model.
{
"ac_id": "AC-kopi-42-001",
"status": "pass",
"screenshot_before": "evidence/AC-kopi-42-001-before.png",
"screenshot_after": "evidence/AC-kopi-42-001-after.png",
"html_path": "evidence/AC-kopi-42-001.html",
"console_path": "evidence/AC-kopi-42-001-console.txt",
"assertion": "Login button disabled when form is empty",
"notes": ""
}
Pass Rate
pass_rate = pass_count / (pass + fail + skip + blocked)
DoD requires pass_rate >= 0.8.