Fruitful Docs
GuidesCapture

Freeze private review evidence

Turn an authenticated capture into a committable fixture without leaking the account it came from.

Review evidence proves a package works, and for logged-in sites that evidence started as a page from someone's account. This guide is how a capture becomes a fixture that is safe to commit.

The boundary

  • Raw authenticated captures, screenshots, WARC data, cookies, and browser profiles stay on the machine that made them. They are never uploaded and never committed.
  • A fixture enters the repository only after its exact sanitized bytes have been inspected and approved.
  • Review evidence never ships to users. The release separates runtime/ from review/ and binds both by digest.

Sanitize the capture

yarn fruitful plugin sanitize-fixture <capture.html> \
  --out review/fixtures/newsfeed.html \
  --redactions redactions.json --json

The sanitizer removes executable elements, DOM event handlers, and form state, and strips email addresses. It applies literal replacements from the redactions file so a review can see exactly what changed:

{
  "replacements": [
    { "find": "Real Person", "replace": "Example Author" },
    { "find": "real-person", "replace": "example-author" }
  ]
}

It does not claim to find every private value. Read the whole candidate and search for names, handles, private URLs, message text, account identifiers, and auth or session vocabulary. Every sanitizer finding is blocking until explained or removed. If a value has no safe deterministic replacement, keep the evidence private and use a smaller representative fixture instead.

Declare the case

Add the fixture and its content-free evidence sidecar to review/review-evidence.json:

{
  "id": "newsfeed-capture",
  "displayName": "Newsfeed",
  "format": "html",
  "fixture": "review/fixtures/newsfeed.html",
  "url": "https://www.linkedin.com/feed/",
  "binding": "newsfeed",
  "expectation": "review/expectations/newsfeed.json",
  "provenance": { "kind": "sanitized-capture", "evidence": "review/evidence/newsfeed.json" }
}

The sidecar records the raw capture's SHA-256 as lineage and the sanitized fixture's digest. Publication verifies the sidecar's digest matches the committed fixture bytes.

Then generate and validate

yarn fruitful plugin generate feed-packages/<name> --write --json
yarn fruitful plugin validate feed-packages/<name> --json

Regeneration writes the expectation from the new fixture. Review that expectation as a semantic diff: a regenerated golden is not correct because it was regenerated.

Reference: Validate and check coverage.

On this page