[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FR8XP2BHZK0SYQRH7RK65":3,"skill-same:01M70FR8XP2BHZK0SYQRH7RK65":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":13,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M70FR8XP2BHZK0SYQRH7RK65","adversarial-verify",null,"Single-agent verification skill that re-runs all tests and screenshots from a QA manifest, performs pixel-diff comparisons against baselines, and produces a structured verification report. This is the feedback loop that confirms fixes actually work and catches regressions. Trigger after adversarial-qa produced a manifest.yaml and the issues it found have been fixed, or as the verify step of an automated qa -> fix -> verify loop.","SirTheOracle\u002Fforge-toolkit","SirTheOracle","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F264051384?v=4","01M70FNRYMQR4XHVN77S3NJPAW","01M70FNRZAGW58XJ1CC6JRY1PA",0,"MIT","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-verify\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"verify","adversarial verify","adversarial","manifest","single","tests","trigger","fixes","diff","feedback","as","screenshots","work","verification","loop","qa","pixel","issues","fix","re","2026-11-10 10:12:30",false,"---\nname: adversarial-verify\ndescription: Single-agent verification skill that re-runs all tests and screenshots from\n  a QA manifest, performs pixel-diff comparisons against baselines, and produces a\n  structured verification report. This is the feedback loop that confirms fixes actually\n  work and catches regressions. Trigger after adversarial-qa produced a manifest.yaml\n  and the issues it found have been fixed, or as the verify step of an automated\n  qa -> fix -> verify loop.\n---\n\n# Adversarial Verify\n\n## Overview\n\nSingle-agent verification skill that re-runs all tests and screenshots from a QA manifest, performs pixel-diff comparisons against baselines, and produces a structured verification report. This is the feedback loop that confirms fixes actually work and catches regressions.\n\n## When to Use\n\n- After adversarial-qa produces a `manifest.yaml` and issues have been fixed\n- As part of the automated QA loop (qa → fix → verify → qa if needed)\n- To regression-check a previously clean QA pass after new changes\n\n## Prerequisites\n\n- **Project config**: `.claude\u002Fforge-project.yml` must exist (provides ports, paths, commands)\n- **Running application**: Backend on `{{backend_url}}`, frontend on `{{frontend_url}}`\n- **Playwright installed**: `cd {{frontend_working_dir}} && {{playwright_install}}`\n- **pixelmatch available**: `cd {{pixelmatch_working_dir}} && npm list pixelmatch || {{pixelmatch_install}}`\n- **A manifest.yaml**: Produced by adversarial-qa in `.dev\u002Fqa\u002F{slug}\u002Fmanifest.yaml`\n\n### Step 0: Load Project Config\n\nBefore proceeding, read `.claude\u002Fforge-project.yml` and build the placeholder substitution map. All `{{tokens}}` in this skill refer to values from that config. See the adversarial-qa skill's \"Config Substitution\" section for the full token reference.\n\n### Step 0.5: Restart-on-entry (cross-worktree infra lock — verify)\n\n`verify` runs under the cross-worktree **infra lock** (orchestrator-held; see\nforge-orchestrator Hard Rule 23). All worktrees of this repo share one infra\nstack, so a dev server left running by a *different* worktree would serve **that**\nworktree's code to your verification. Before verifying, **restart the services\nagainst THIS worktree**. Config-driven and identity-checked — do **not** blindly\nkill whatever holds a port:\n\n1. **Expected service shape:** backend `{{backend_command}}` in `{{backend_working_dir}}\u002F`\n   (URL `{{backend_url}}`); frontend `{{frontend_command}}` in `{{frontend_working_dir}}\u002F`\n   (URL `{{frontend_url}}`). The port is the `:PORT` in each URL.\n2. **Inspect each port:** `lsof -nP -iTCP:\u003Cport> -sTCP:LISTEN`; for any listener get\n   command + cwd (`ps -o command= -p \u003Cpid>`, `lsof -p \u003Cpid> | grep -i cwd`).\n3. **Per listener:** matches the project's expected dev-server shape AND cwd is a\n   worktree of THIS repo → **stop it** (`kill \u003Cpid>`; `kill -9` only if it refuses)\n   and **log** pid\u002Fcommand\u002Fcwd\u002Fport\u002Fworktree. **Unknown process** → **STOP and\n   ESCALATE — do NOT kill it** (`INFRA ESCALATION: configured port \u003Cport> held by an\n   unknown process …; refusing to kill.`), emit `FORGE_BLOCKED`, wait for a human.\n   Nothing listening → proceed.\n4. **Start THIS worktree's services**, or rely on Playwright `webServer` autostart\n   only if it starts a fresh server (NOT `reuseExistingServer: true`). Confirm the\n   backend URL responds before verifying.\n\nSafe under the lock: exactly one infra stage runs globally at a time.\n\n## Input\n\nThe skill takes a path to a QA output directory:\n\n```\n\u002Fadversarial-verify .dev\u002Fqa\u002F{slug}\n```\n\nIt reads `manifest.yaml` from that directory and verifies every finding and check.\n\n## Process\n\n### Step 1: Load Manifest and Prepare\n\n1. Read `manifest.yaml` from the QA directory\n2. Determine the cycle number:\n   - If no `verification-report.yaml` exists → cycle 1\n   - If `verification-report.yaml` exists with `verdict: ISSUES_REMAIN` → cycle 2\n   - If cycle 2 already exists → escalate to user (max 2 cycles)\n3. Create evidence directory for this cycle: `evidence\u002Fverify-cycle-{N}\u002Fscreenshots\u002F` and `evidence\u002Fverify-cycle-{N}\u002Fdiffs\u002F`\n4. Verify environment (backend + frontend running)\n\n### Step 2: Verify Findings\n\nFor each finding with `status: open`:\n\n1. **Re-run reproduction steps** from the manifest\n2. **For each evidence item**, re-execute based on type:\n\n   **Screenshot evidence:**\n   ```bash\n   # Re-take at same URL and viewport\n   npx playwright screenshot \\\n     --viewport-size={width},{height} \\\n     {url} \\\n     evidence\u002Fverify-cycle-{N}\u002Fscreenshots\u002F{id}-recheck.png\n   ```\n\n   **API response evidence:**\n   ```bash\n   # Re-curl the endpoint\n   curl -s -o evidence\u002Fverify-cycle-{N}\u002Fapi-responses\u002F{id}-recheck.json \\\n     -w \"%{http_code}\" \\\n     -X {method} {url}\n   ```\n\n   **Test output evidence:**\n   ```bash\n   # Re-run the exact test command\n   {command} 2>&1 | tee evidence\u002Fverify-cycle-{N}\u002Ftest-results\u002F{id}-recheck.txt\n   ```\n\n3. **Run pixel-diff** for screenshot evidence (see Step 4)\n4. **Determine status**:\n   - Issue no longer reproduces → `verified-fixed`\n   - Issue still reproduces → `still-open`\n\n### Step 3: Verify Checks (Regression Detection)\n\nFor each check with `status: pass`:\n\n1. Re-run the evidence command from the manifest\n2. Re-take screenshot at the same URL + viewport\n3. Run pixel-diff against the baseline\n4. Determine status:\n   - Still passing + screenshots match → `still-passing`\n   - Now failing or screenshots diverge → `regressed`\n\n### Step 4: Pixel-Diff Comparison\n\nFor every screenshot comparison, write and execute a Node.js script using pixelmatch:\n\n```javascript\n\u002F\u002F verify-diff.mjs -- written by the agent, executed via node\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { PNG } from \"pngjs\";\nimport pixelmatch from \"pixelmatch\";\n\nconst baseline = PNG.sync.read(readFileSync(process.argv[2]));\nconst current = PNG.sync.read(readFileSync(process.argv[3]));\nconst diffPath = process.argv[4];\n\n\u002F\u002F Handle size mismatches by using the larger dimensions\nconst width = Math.max(baseline.width, current.width);\nconst height = Math.max(baseline.height, current.height);\n\n\u002F\u002F Create canvases at max size, fill with white for size-mismatch areas\nfunction padImage(img, w, h) {\n  if (img.width === w && img.height === h) return img;\n  const padded = new PNG({ width: w, height: h });\n  \u002F\u002F Fill white\n  for (let i = 0; i \u003C padded.data.length; i += 4) {\n    padded.data[i] = 255; padded.data[i+1] = 255;\n    padded.data[i+2] = 255; padded.data[i+3] = 255;\n  }\n  PNG.bitblt(img, padded, 0, 0, img.width, img.height, 0, 0);\n  return padded;\n}\n\nconst b = padImage(baseline, width, height);\nconst c = padImage(current, width, height);\nconst diff = new PNG({ width, height });\n\nconst numDiffPixels = pixelmatch(b.data, c.data, diff.data, width, height, {\n  threshold: 0.1,\n  alpha: 0.3,\n  diffColor: [255, 0, 255],\n});\n\nwriteFileSync(diffPath, PNG.sync.write(diff));\n\nconst totalPixels = width * height;\nconst mismatchPct = ((numDiffPixels \u002F totalPixels) * 100).toFixed(2);\n\n\u002F\u002F Output as JSON for the agent to parse\nconsole.log(JSON.stringify({\n  mismatch_pixels: numDiffPixels,\n  total_pixels: totalPixels,\n  mismatch_percentage: parseFloat(mismatchPct),\n  baseline_size: { width: baseline.width, height: baseline.height },\n  current_size: { width: current.width, height: current.height },\n}));\n```\n\nRun with:\n```bash\nnode verify-diff.mjs \\\n  evidence\u002Fscreenshots\u002FC-001-dashboard-load.png \\\n  evidence\u002Fverify-cycle-1\u002Fscreenshots\u002FC-001-recheck.png \\\n  evidence\u002Fverify-cycle-1\u002Fdiffs\u002FC-001-diff.png\n```\n\n**Match threshold**: `mismatch_percentage` \u003C 5.0% = match. This accounts for anti-aliasing and minor rendering differences.\n\n**Size mismatch**: If baseline and current have different dimensions, this is itself a signal of regression. The diff image pads to the larger size and the mismatch will be high.\n\n### Step 5: Produce Verification Report\n\nWrite `verification-report.yaml` to the QA directory. See `references\u002Fverification-report-format.md` for the full schema.\n\nKey fields:\n- `verdict`: `CLEAR` if all findings are `verified-fixed` and all checks are `still-passing`; `ISSUES_REMAIN` otherwise\n- `summary`: Counts of each status\n- `finding_results`: Per-finding verification with evidence\n- `check_results`: Per-check regression verification with evidence\n\n### Step 6: Determine Next Action\n\n| Verdict | Cycle | Action |\n|---------|-------|--------|\n| `CLEAR` | 1 or 2 | Done. Report clean bill of health to lead. |\n| `ISSUES_REMAIN` | 1 | Return `still-open` and `regressed` item IDs to lead for scoped re-QA. |\n| `ISSUES_REMAIN` | 2 | Escalate to user. Present full evidence trail across both cycles. |\n\n## Pixel-Diff Dependencies\n\nThe verification agent needs `pixelmatch` and `pngjs`. Install if missing:\n\n```bash\ncd {{pixelmatch_working_dir}} && npm list pixelmatch pngjs 2>\u002Fdev\u002Fnull || {{pixelmatch_install}}\n```\n\nIf these packages cannot be installed, fall back to ImageMagick:\n\n```bash\ncompare -metric AE \\\n  evidence\u002Fscreenshots\u002FC-001-dashboard-load.png \\\n  evidence\u002Fverify-cycle-1\u002Fscreenshots\u002FC-001-recheck.png \\\n  evidence\u002Fverify-cycle-1\u002Fdiffs\u002FC-001-diff.png 2>&1\n```\n\n## Non-Screenshot Verification\n\nNot all evidence is screenshots. The verification agent also re-runs:\n\n| Evidence Type | Verification Method | Pass Condition |\n|---------------|-------------------|----------------|\n| `screenshot` | Re-take + pixel-diff | mismatch \u003C threshold |\n| `api-response` | Re-curl endpoint | Status code matches expected (200 for checks, not-500 for findings) |\n| `test-output` | Re-run command | Exit code 0 for checks; exit code changed for findings |\n| `console-error` | Re-load page, capture console | No errors for checks; error gone for findings |\n| `command` | Re-run command | Exit code matches expected |\n\n## Error Handling\n\n| Failure | Recovery |\n|---------|----------|\n| Backend\u002Ffrontend not running | Start them before proceeding |\n| Playwright not installed | Run `npx playwright install chromium` |\n| pixelmatch not installed | Install it or fall back to ImageMagick |\n| Screenshot fails (page error) | Record as `regressed` with the error |\n| Baseline file missing | Skip pixel-diff, take fresh screenshot, note in report |\n| Manifest malformed | Abort and report parse error to lead |\n\n## Output\n\n```\n.dev\u002Fqa\u002F{slug}\u002F\n  verification-report.yaml    ← the deliverable\n  evidence\u002F\n    verify-cycle-{N}\u002F\n      screenshots\u002F             ← re-taken screenshots\n      diffs\u002F                   ← pixel-diff images\n      api-responses\u002F           ← re-curl results\n      test-results\u002F            ← re-run test output\n```\n\n## Invoking the Skill\n\n```\n\u002Fadversarial-verify .dev\u002Fqa\u002Fgallery-page\n```\n\nOr programmatically from the QA loop:\n```\nUse adversarial-verify to verify the QA findings in .dev\u002Fqa\u002Fgallery-page\u002Fmanifest.yaml\n```\n","# Adversarial Verify\n\n## Overview\n\nSingle-agent verification skill that re-runs all tests and screenshots from a QA manifest, performs pixel-diff comparisons against baselines, and produces a structured verification report. This is the feedback loop that confirms fixes actually work and catches regressions.\n\n## When to Use\n\n- After adversarial-qa produces a `manifest.yaml` and issues have been fixed\n- As part of the automated QA loop (qa → fix → verify → qa if needed)\n- To regression-check a previously clean QA pass after new changes\n\n## Prerequisites\n\n- **Project config**: `.claude\u002Fforge-project.yml` must exist (provides ports, paths, commands)\n- **Running application**: Backend on `{{backend_url}}`, frontend on `{{frontend_url}}`\n- **Playwright installed**: `cd {{frontend_working_dir}} && {{playwright_install}}`\n- **pixelmatch available**: `cd {{pixelmatch_working_dir}} && npm list pixelmatch || {{pixelmatch_install}}`\n- **A manifest.yaml**: Produced by adversarial-qa in `.dev\u002Fqa\u002F{slug}\u002Fmanifest.yaml`\n\n### Step 0: Load Project Config\n\nBefore proceeding, read `.claude\u002Fforge-project.yml` and build the placeholder substitution map. All `{{tokens}}` in this skill refer to values from that config. See the adversarial-qa skill's \"Config Substitution\" section for the full token reference.\n\n### Step 0.5: Restart-on-entry (cross-worktree infra lock — verify)\n\n`verify` runs under the cross-worktree **infra lock** (orchestrator-held; see\nforge-orchestrator Hard Rule 23). All worktrees of this repo share one infra\nstack, so a dev server left running by a *different* worktree would serve **that**\nworktree's code to your verification. Before verifying, **restart the services\nagainst THIS worktree**. Config-driven and identity-checked — do **not** blindly\nkill whatever holds a port:\n\n1. **Expected service shape:** backend `{{backend_command}}` in `{{backend_working_dir}}\u002F`\n   (URL `{{backend_url}}`); frontend `{{frontend_command}}` in `{{frontend_working_dir}}\u002F`\n   (URL `{{frontend_url}}`). The port is the `:PORT` in each URL.\n2. **Inspect each port:** `lsof -nP -iTCP:\u003Cport> -sTCP:LISTEN`; for any listener get\n   command + cwd (`ps -o command= -p \u003Cpid>`, `lsof -p \u003Cpid> | grep -i cwd`).\n3. **Per listener:** matches the project's expected dev-server shape AND cwd is a\n   worktree of THIS repo → **stop it** (`kill \u003Cpid>`; `kill -9` only if it refuses)\n   and **log** pid\u002Fcommand\u002Fcwd\u002Fport\u002Fworktree. **Unknown process** → **STOP and\n   ESCALATE — do NOT kill it** (`INFRA ESCALATION: configured port \u003Cport> held by an\n   unknown process …; refusing to kill.`), emit `FORGE_BLOCKED`, wait for a human.\n   Nothing listening → proceed.\n4. **Start THIS worktree's services**, or rely on Playwright `webServer` autostart\n   only if it starts a fresh server (NOT `reuseExistingServer: true`). Confirm the\n   backend URL responds before verifying.\n\nSafe under the lock: exactly one infra stage runs globally at a time.\n\n## Input\n\nThe skill takes a path to a QA output directory:\n\n```\n\u002Fadversarial-verify .dev\u002Fqa\u002F{slug}\n```\n\nIt reads `manifest.yaml` from that directory and verifies every finding and check.\n\n## Process\n\n### Step 1: Load Manifest and Prepare\n\n1. Read `manifest.yaml` from the QA directory\n2. Determine the cycle number:\n   - If no `verification-report.yaml` exists → cycle 1\n   - If `verification-report.yaml` exists with `verdict: ISSUES_REMAIN` → cycle 2\n   - If cycle 2 already exists → escalate to user (max 2 cycles)\n3. Create evidence directory for this cycle: `evidence\u002Fverify-cycle-{N}\u002Fscreenshots\u002F` and `evidence\u002Fverify-cycle-{N}\u002Fdiffs\u002F`\n4. Verify environment (backend + frontend running)\n\n### Step 2: Verify Findings\n\nFor each finding with `status: open`:\n\n1. **Re-run reproduction steps** from the manifest\n2. **For each evidence item**, re-execute based on type:\n\n   **Screenshot evidence:**\n   ```bash\n   # Re-take at same URL and viewport\n   npx playwright screenshot \\\n     --viewport-size={width},{height} \\\n     {url} \\\n     evidence\u002Fverify-cycle-{N}\u002Fscreenshots\u002F{id}-recheck.png\n   ```\n\n   **API response evidence:**\n   ```bash\n   # Re-curl the endpoint\n   curl -s -o evidence\u002Fverify-cycle-{N}\u002Fapi-responses\u002F{id}-recheck.json \\\n     -w \"%{http_code}\" \\\n     -X {method} {url}\n   ```\n\n   **Test output evidence:**\n   ```bash\n   # Re-run the exact test command\n   {command} 2>&1 | tee evidence\u002Fverify-cycle-{N}\u002Ftest-results\u002F{id}-recheck.txt\n   ```\n\n3. **Run pixel-diff** for screenshot evidence (see Step 4)\n4. **Determine status**:\n   - Issue no longer reproduces → `verified-fixed`\n   - Issue still reproduces → `still-open`\n\n### Step 3: Verify Checks (Regression Detection)\n\nFor each check with `status: pass`:\n\n1. Re-run the evidence command from the manifest\n2. Re-take screenshot at the same URL + viewport\n3. Run pixel-diff against the baseline\n4. Determine status:\n   - Still passing + screenshots match → `still-passing`\n   - Now failing or screenshots diverge → `regressed`\n\n### Step 4: Pixel-Diff Comparison\n\nFor every screenshot comparison, write and execute a Node.js script using pixelmatch:\n\n```javascript\n\u002F\u002F verify-diff.mjs -- written by the agent, executed via node\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { PNG } from \"pngjs\";\nimport pixelmatch from \"pixelmatch\";\n\nconst baseline = PNG.sync.read(readFileSync(process.argv[2]));\nconst current = PNG.sync.read(readFileSync(process.argv[3]));\nconst diffPath = process.argv[4];\n\n\u002F\u002F Handle size mismatches by using the larger dimensions\nconst width = Math.max(baseline.width, current.width);\nconst height = Math.max(baseline.height, current.height);\n\n\u002F\u002F Create canvases at max size, fill with white for size-mismatch areas\nfunction padImage(img, w, h) {\n  if (img.width === w && img.height === h) return img;\n  const padded = new PNG({ width: w, height: h });\n  \u002F\u002F Fill white\n  for (let i = 0; i \u003C padded.data.length; i += 4) {\n    padded.data[i] = 255; padded.data[i+1] = 255;\n    padded.data[i+2] = 255; padded.data[i+3] = 255;\n  }\n  PNG.bitblt(img, padded, 0, 0, img.width, img.height, 0, 0);\n  return padded;\n}\n\nconst b = padImage(baseline, width, height);\nconst c = padImage(current, width, height);\nconst diff = new PNG({ width, height });\n\nconst numDiffPixels = pixelmatch(b.data, c.data, diff.data, width, height, {\n  threshold: 0.1,\n  alpha: 0.3,\n  diffColor: [255, 0, 255],\n});\n\nwriteFileSync(diffPath, PNG.sync.write(diff));\n\nconst totalPixels = width * height;\nconst mismatchPct = ((numDiffPixels \u002F totalPixels) * 100).toFixed(2);\n\n\u002F\u002F Output as JSON for the agent to parse\nconsole.log(JSON.stringify({\n  mismatch_pixels: numDiffPixels,\n  total_pixels: totalPixels,\n  mismatch_percentage: parseFloat(mismatchPct),\n  baseline_size: { width: baseline.width, height: baseline.height },\n  current_size: { width: current.width, height: current.height },\n}));\n```\n\nRun with:\n```bash\nnode verify-diff.mjs \\\n  evidence\u002Fscreenshots\u002FC-001-dashboard-load.png \\\n  evidence\u002Fverify-cycle-1\u002Fscreenshots\u002FC-001-recheck.png \\\n  evidence\u002Fverify-cycle-1\u002Fdiffs\u002FC-001-diff.png\n```\n\n**Match threshold**: `mismatch_percentage` \u003C 5.0% = match. This accounts for anti-aliasing and minor rendering differences.\n\n**Size mismatch**: If baseline and current have different dimensions, this is itself a signal of regression. The diff image pads to the larger size and the mismatch will be high.\n\n### Step 5: Produce Verification Report\n\nWrite `verification-report.yaml` to the QA directory. See `references\u002Fverification-report-format.md` for the full schema.\n\nKey fields:\n- `verdict`: `CLEAR` if all findings are `verified-fixed` and all checks are `still-passing`; `ISSUES_REMAIN` otherwise\n- `summary`: Counts of each status\n- `finding_results`: Per-finding verification with evidence\n- `check_results`: Per-check regression verification with evidence\n\n### Step 6: Determine Next Action\n\n| Verdict | Cycle | Action |\n|---------|-------|--------|\n| `CLEAR` | 1 or 2 | Done. Report clean bill of health to lead. |\n| `ISSUES_REMAIN` | 1 | Return `still-open` and `regressed` item IDs to lead for scoped re-QA. |\n| `ISSUES_REMAIN` | 2 | Escalate to user. Present full evidence trail across both cycles. |\n\n## Pixel-Diff Dependencies\n\nThe verification agent needs `pixelmatch` and `pngjs`. Install if missing:\n\n```bash\ncd {{pixelmatch_working_dir}} && npm list pixelmatch pngjs 2>\u002Fdev\u002Fnull || {{pixelmatch_install}}\n```\n\nIf these packages cannot be installed, fall back to ImageMagick:\n\n```bash\ncompare -metric AE \\\n  evidence\u002Fscreenshots\u002FC-001-dashboard-load.png \\\n  evidence\u002Fverify-cycle-1\u002Fscreenshots\u002FC-001-recheck.png \\\n  evidence\u002Fverify-cycle-1\u002Fdiffs\u002FC-001-diff.png 2>&1\n```\n\n## Non-Screenshot Verification\n\nNot all evidence is screenshots. The verification agent also re-runs:\n\n| Evidence Type | Verification Method | Pass Condition |\n|---------------|-------------------|----------------|\n| `screenshot` | Re-take + pixel-diff | mismatch \u003C threshold |\n| `api-response` | Re-curl endpoint | Status code matches expected (200 for checks, not-500 for findings) |\n| `test-output` | Re-run command | Exit code 0 for checks; exit code changed for findings |\n| `console-error` | Re-load page, capture console | No errors for checks; error gone for findings |\n| `command` | Re-run command | Exit code matches expected |\n\n## Error Handling\n\n| Failure | Recovery |\n|---------|----------|\n| Backend\u002Ffrontend not running | Start them before proceeding |\n| Playwright not installed | Run `npx playwright install chromium` |\n| pixelmatch not installed | Install it or fall back to ImageMagick |\n| Screenshot fails (page error) | Record as `regressed` with the error |\n| Baseline file missing | Skip pixel-diff, take fresh screenshot, note in report |\n| Manifest malformed | Abort and report parse error to lead |\n\n## Output\n\n```\n.dev\u002Fqa\u002F{slug}\u002F\n  verification-report.yaml    ← the deliverable\n  evidence\u002F\n    verify-cycle-{N}\u002F\n      screenshots\u002F             ← re-taken screenshots\n      diffs\u002F                   ← pixel-diff images\n      api-responses\u002F           ← re-curl results\n      test-results\u002F            ← re-run test output\n```\n\n## Invoking the Skill\n\n```\n\u002Fadversarial-verify .dev\u002Fqa\u002Fgallery-page\n```\n\nOr programmatically from the QA loop:\n```\nUse adversarial-verify to verify the QA findings in .dev\u002Fqa\u002Fgallery-page\u002Fmanifest.yaml\n```\n",{"name":5,"description":7},"main","50bb36677eced958128cea262c304bf9ceee4d4e","skills\u002Fadversarial-verify","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit","https:\u002F\u002Fgithub.com\u002FSirTheOracle","2026-10-20 00:50:37",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add SirTheOracle\u002Fforge-toolkit --skill adversarial-verify",{"tool":60,"command":61},"bunx","bunx skills add SirTheOracle\u002Fforge-toolkit --skill adversarial-verify",{"tool":63,"command":64},"pnpm","pnpm dlx skills add SirTheOracle\u002Fforge-toolkit --skill adversarial-verify","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-verify\u002FSKILL.md",true,[68,74],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Fmanifest-schema.md","REFERENCE","参考文档",5625,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-verify\u002Freferences\u002Fmanifest-schema.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Fverification-report-format.md",4479,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-verify\u002Freferences\u002Fverification-report-format.md",[79,105,125,144,163,184],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":43},"01M70FS350DG1MT6NBPYRPBFBQ","forge-orchestrator","tmux-based orchestrator for multi-agent building. Coordinates work across Claude Code and two Codex workers via forge-bridge. Translates user requests into dispatched tasks with structured audit logging. Replaces forge-dispatch, forge-state.yml, and stage-routing-map.yml.","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fforge-orchestrator\u002FSKILL.md",[],[86,87,88,89,90,91,92,93,35,94,95,96,97,98,99,100,101,102,103,104],"forge","orchestrator","forge orchestrator","bridge","map","code","tasks","across","audit","multi-agent","logging","tmux","for","audit logging","workers","stage","with","multi","state",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":43},"01M70FRYFZC51YWHVNNS3862PY","forge-fix-runner","Drain the GitHub `forge-fix` issue queue through the forge fix pipeline, one service at a time. Tallies actionable issues worst-first, scouts a service into a routing plan (clusters + quick\u002Ffull tiers), gets human approval, then dispatches fixes (quick = dispatched fix-code; full = forge-pipeline), gating every `Closes #N` on per-issue verification. Trigger when the user wants to fix triaged QA issues, \"work the forge-fix queue\", or \"run the fix runner\".","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fforge-fix-runner\u002FSKILL.md",[],[112,41,86,113,114,115,116,117,40,38,118,119,91,36,35,120,121,122,123,124],"runner","forge fix runner","quick","pipeline","actionable","time","gating","when","plan","human","run","at","issue",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":43},"01M70FRVVW3JAGQQK3FFR2VYRC","forge-coder","Procedural coding skill. Reads implementation.md, validates diffs against the codebase, applies changes in execution order, runs tests after each commit group, and produces a coder-report.md artifact.","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fforge-coder\u002FSKILL.md",[],[86,132,133,134,28,135,136,137,138,139,140,141,142,143],"forge coder","coder","diffs","execution","commit","changes","artifact","procedural","report","codebase","implementation","coding",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":43},"01M70FRRYF6E22ECC8AGYYJEQ7","fix-reproducer","Optional first stage of the fix-pipeline. Verifies a reported bug is reproducible and captures deterministic repro steps, environment state, and evidence. Single procedural executor — does not spawn sub-agents and does not diagnose. Branches by environment: dev path runs the bug locally; prod path gathers observational evidence from the deployed environment. Always writes repro.md, even on NOT REPRODUCED. Trigger when the user invokes a fix-pipeline with the reproduce step enabled.","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Ffix-reproducer\u002FSKILL.md",[],[151,152,41,153,154,155,156,115,157,158,29,159,160,27,161,119,101,102,104,162],"reproducer","fix reproducer","deterministic","evidence","executor","diagnose","Reproducible","environment","branches","dev","repro","first",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":43},"01M70FRN8THYBT2DJVX99XQ3CM","fix-plan-reviewer","Single-agent adversarial reviewer for fix plans. Reads diagnosis.md and fix-plan.md, verifies the plan actually addresses the diagnosed cause, attacks the plan from multiple angles (cause coverage, defense adequacy, scope correctness, regression risk, rollback integrity, test plan integrity, risk honesty), and produces fix-review.md with severity-rated issues. Does NOT propose fixes for the issues — that is the revise mode of adversarial-fix-plan. Does NOT re-investigate the diagnosis. Trigger as the review stage of a fix-pipeline, after adversarial-fix-plan has produced fix-plan.md.","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Ffix-plan-reviewer\u002FSKILL.md",[],[170,41,171,120,172,173,174,175,115,42,176,40,177,178,179,180,181,182,183,33],"fix plan reviewer","reviewer","plan reviewer","coverage","scope","regression","mode","review","diagnosis","defense","integrity","addresses","revise","attacks",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":190,"publishedAt":43},"01M70FRHGG6HN0VW483NDKX161","fix-coder","Mechanical single-executor that applies a vetted fix plan to the codebase. Reads fix-plan.md (the Changes, Defenses, and Test Plan sections), translates file-level changes into concrete diffs, applies them, runs the test plan, validates that the bug is no longer reproducible (dev) or that the test exercising the failing path passes (prod), and produces a single fix commit. Stays strictly in scope: does NOT modify the plan, does NOT re-investigate, does NOT touch files outside the plan. Always writes fix-coder-report.md, even on failure. Trigger as the implementation stage of a fix-pipeline, after fix-plan-reviewer has approved fix-plan.md.","https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Ffix-coder\u002FSKILL.md",[],[41,191,133,155,174,115,42,192,193,134,194,136,171,120,195,196,33,197,157,29],"fix coder","failing","mechanical","files","bug","path","test plan"]