{
  "title": "WipeTok extension controls: controlled source checks",
  "kind": "controlled-source-fixture-checks",
  "evaluatedAt": "2026-09-07T12:15:00.732Z",
  "nodeVersion": "v24.14.1",
  "productRevision": "f208dbdc2a410dd87c060ad018b985ab9eb9d6c7",
  "productWorktreeDirty": false,
  "extensionSourceVersion": "1.0.2",
  "sourceHashes": {
    "extension/content.js": "55ebe44304376836ef1c2952c755b31a10a398eac4b2c7ac0a3b3b13d68d6d65",
    "extension/sidepanel.js": "48edc9aaeeba3c92b582e956728882e699a8cf0fa9b025fee3e5eee6f1741e12",
    "extension/manifest.json": "588cefd3fd47e82da33cc710f54e658721c8c2640fcf3990797d8a5aee86f3cf"
  },
  "methodology": "Full, unmodified content.js and sidepanel.js executed in Node VM synthetic DOM and Chrome-message fixtures. Synthetic timers preserved scheduling order, not elapsed time. No network API, TikTok account, real repost, browser session, or purchase was used.",
  "limitations": [
    "Not live TikTok or Chrome compatibility evidence.",
    "Not an account-safety guarantee or completion-rate/throughput benchmark.",
    "Source checkout/version may differ from the currently published store build.",
    "Pass means observed behavior matches the stated check, including explicitly labeled limitations."
  ],
  "passed": 13,
  "failed": 0,
  "checks": [
    { "id": "missing-reposts-tab", "name": "Missing Reposts tab", "status": "pass", "limitation": false, "observation": "A missing Reposts tab reports zero found; no removal button is clicked." },
    { "id": "scan-deduplicates-and-does-not-remove", "name": "Counting without removal", "status": "pass", "limitation": false, "observation": "Three synthetic tiles with two unique video IDs produce a count of two. Scanning does not invoke removal." },
    { "id": "remove-requires-scan", "name": "Scan before cleanup", "status": "pass", "limitation": false, "observation": "A remove message before a nonempty scan does not start cleanup." },
    { "id": "readable-state-flip", "name": "Readable state changes", "status": "pass", "limitation": false, "observation": "An active repost button that visibly flips off is counted once, with one click." },
    { "id": "readable-state-unchanged", "name": "Readable state unchanged", "status": "pass", "limitation": false, "observation": "An active button that stays on is skipped, with no second toggle attempt." },
    { "id": "already-off-is-not-clicked", "name": "Already removed", "status": "pass", "limitation": false, "observation": "A readable already-off button is not clicked." },
    { "id": "unknown-state-limitation", "name": "Unreadable state", "status": "pass", "limitation": true, "observation": "An unreadable button state can still be reported removed without a visible state flip. This documents a limitation, not verified removal." },
    { "id": "stop-at-next-item-boundary", "name": "Stop before the next item", "status": "pass", "limitation": false, "observation": "Stop after the first item prevents clicking the next item." },
    { "id": "stop-during-inflight-item", "name": "Stop during the current item", "status": "pass", "limitation": true, "observation": "Stop during the current item's open/wait stage may still allow that item's removal before the loop stops." },
    { "id": "pause-at-boundary-then-stop", "name": "Pause, then stop", "status": "pass", "limitation": false, "observation": "Pause waits at the next item boundary. Stop exits that wait without removing the next item." },
    { "id": "three-missing-buttons-stop-run", "name": "Missing repost buttons", "status": "pass", "limitation": false, "observation": "Three consecutive missing repost buttons end the removal loop." },
    { "id": "pacing-is-additive-not-a-benchmark", "name": "Pacing and other waits", "status": "pass", "limitation": false, "observation": "The first successful synthetic item schedules separate opening, verification, closing, and pacing waits. A 2800ms pacing constant is not a measured per-item duration." },
    { "id": "csv-uses-removed-events", "name": "CSV export", "status": "pass", "limitation": false, "observation": "The actual panel code exports reported removed-event captions and URLs and escapes caption quotes. The fixture captures the Blob without writing a download." }
  ]
}
