{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "name": "Website change detection acceptance fixtures",
  "description": "24 original synthetic acceptance fixtures with explicit expected labels. No third-party product has been tested or ranked using this release.",
  "url": "https://konabayev.com/blog/website-change-detection-test-dataset/",
  "slug": "website-change-detection-test-dataset",
  "version": "1.0.0",
  "dateModified": "2026-10-04",
  "creator": {
    "@type": "Person",
    "name": "Tugelbay Konabayev",
    "url": "https://konabayev.com/about/"
  },
  "isAccessibleForFree": true,
  "measurementTechnique": "Manually authored synthetic fixtures and acceptance oracles; deterministic serialization, not an empirical benchmark.",
  "variableMeasured": [
    {
      "@type": "PropertyValue",
      "propertyID": "fixture_id",
      "name": "fixture_id",
      "description": "Stable authored case ID, not a customer or observation identifier."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "observation_type",
      "name": "observation_type",
      "description": "Always authored_test_fixture: synthetic inputs and author-defined expected labels."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "input",
      "name": "input",
      "description": "Nested test input. JSON object serialized as JSON text in the CSV cell; parse it before use."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "expected",
      "name": "expected",
      "description": "Author-defined acceptance oracle, not output observed from a vendor. Nested object serialized as JSON in CSV."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "rule_ids",
      "name": "rule_ids",
      "description": "Ordered IDs from dataset.rules explaining the applicable authored contract; JSON array in CSV."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "rationale",
      "name": "rationale",
      "description": "Reason for the case and its limits; not an empirical performance claim."
    }
  ],
  "distribution": [
    {
      "@type": "DataDownload",
      "encodingFormat": "text/csv",
      "contentUrl": "https://konabayev.com/data/website-change-detection-test-dataset.csv"
    },
    {
      "@type": "DataDownload",
      "encodingFormat": "application/json",
      "contentUrl": "https://konabayev.com/data/website-change-detection-test-dataset.json"
    },
    {
      "@type": "DataDownload",
      "encodingFormat": "application/x-ndjson",
      "contentUrl": "https://konabayev.com/data/website-change-detection-test-dataset.jsonl"
    }
  ],
  "row_count": 24,
  "observation_type": "authored_test_fixture",
  "product_performance_measured": false,
  "usage_scope": "Download and use locally for your own acceptance tests, and cite the dataset and version. No open redistribution license is asserted for this fixture release.",
  "rules": {
    "W-SCOPE": "Compare one #watch region in each authored static document. Ignore outside content, comments, hidden subtrees and explicit data-ignore descendants. No JavaScript execution or computed CSS.",
    "W-TEXT": "Decode entities and collapse Unicode whitespace. Preserve case, punctuation, accents and text order. Ignore HTML wrappers and attributes, including href: this is a text-change contract, not every possible website change.",
    "W-UNKNOWN": "Both simulated responses must be HTTP 200 with querySelectorAll(selector).length === 1 before selecting and no explicit data-render-required sentinel. querySelector alone must not silently choose the first match. Missing/unready/403 is unavailable; multiple matches ambiguous; neither is unchanged. Successful empty selected text is an actual empty string, not null."
  },
  "data_dictionary": {
    "fixture_id": "Stable authored case ID, not a customer or observation identifier.",
    "observation_type": "Always authored_test_fixture: synthetic inputs and author-defined expected labels.",
    "input": "Nested test input. JSON object serialized as JSON text in the CSV cell; parse it before use.",
    "expected": "Author-defined acceptance oracle, not output observed from a vendor. Nested object serialized as JSON in CSV.",
    "rule_ids": "Ordered IDs from dataset.rules explaining the applicable authored contract; JSON array in CSV.",
    "rationale": "Reason for the case and its limits; not an empirical performance claim."
  },
  "nested_dictionaries": {
    "input": {
      "before_html": "Authored static document before the comparison.",
      "after_html": "Authored static document after the comparison.",
      "before_status": "Simulated HTTP status, not a measured response.",
      "after_status": "Simulated HTTP status, not a measured response.",
      "selector": "Region selected in both documents.",
      "policy": "Versioned authored text-change contract."
    },
    "expected": {
      "decision": "changed, unchanged, unavailable, or ambiguous.",
      "before_text": "Normalized selected text; null means unavailable, empty string means successful empty extraction.",
      "after_text": "Normalized selected text; null means unavailable, empty string means successful empty extraction."
    }
  },
  "source_provenance": [
    {
      "type": "original_authorship",
      "authored_date": "2026-10-04",
      "scope": "All fixture inputs, expected outputs and decision rules are original synthetic constructions; methodological citations in the article do not supply these labels."
    }
  ],
  "reproduction": {
    "release_ref": "acceptance-fixtures-v1.0.0",
    "code_url": "https://konabayev.com/data/acceptance-fixtures-v1.0.0-generator.txt",
    "source_sha256": "b57bf52907f67efad945335b76a88cfdbdaa2d02f581efef9dde9f3b2a3446d1",
    "instructions": "Download the version 1.0.0 source from code_url and save it as generator.mjs. Verify its SHA-256 against source_sha256 and retain the source with your outputs; no repository access or package installation is required.",
    "command": "node ./generator.mjs --out ./fixture-data",
    "check_command": "node ./generator.mjs --out ./fixture-data --check",
    "csv_objects": "input, expected and rule_ids are JSON strings inside properly quoted CSV cells.",
    "note": "The generator reproduces datasets; it does not implement an extractor, CRM matcher or website monitor. compareResults emits pass, mismatch or missing, not automatic failure-type diagnoses."
  },
  "data": [
    {
      "fixture_id": "CHANGE-001",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Stable text.</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Stable text.</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Stable text.",
        "after_text": "Stable text."
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Identical selected text."
    },
    {
      "fixture_id": "CHANGE-002",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>One  two</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>One\n two</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "One two",
        "after_text": "One two"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Collapse ordinary prose whitespace."
    },
    {
      "fixture_id": "CHANGE-003",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>One&nbsp;two</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>One two</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "One two",
        "after_text": "One two"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Normalize nonbreaking spaces."
    },
    {
      "fixture_id": "CHANGE-004",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Salt &amp; pepper</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Salt &#38; pepper</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Salt & pepper",
        "after_text": "Salt & pepper"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Equivalent character references."
    },
    {
      "fixture_id": "CHANGE-005",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><nav>New navigation</nav><main id=\"watch\"><p>Ready</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Outside region is ignored."
    },
    {
      "fixture_id": "CHANGE-006",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main><footer>Old</footer></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main><footer>New</footer></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Footer outside selector is ignored."
    },
    {
      "fixture_id": "CHANGE-007",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><div><p>Ready</p></div></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Wrapper changes do not alter selected text."
    },
    {
      "fixture_id": "CHANGE-008",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\" class=\"new\"><p>Ready</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Class-only changes are excluded from text mode."
    },
    {
      "fixture_id": "CHANGE-009",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><!-- New comment --><p>Ready</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Comments are excluded."
    },
    {
      "fixture_id": "CHANGE-010",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p><time data-ignore>10:00</time></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p><time data-ignore>11:00</time></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Only explicitly marked data-ignore descendants are suppressed."
    },
    {
      "fixture_id": "CHANGE-011",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Price: 20</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Price: 25</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Price: 20",
        "after_text": "Price: 25"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "An authored amount change is retained; amounts are not vendor prices."
    },
    {
      "fixture_id": "CHANGE-012",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Available</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Unavailable</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Available",
        "after_text": "Unavailable"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Status text changes."
    },
    {
      "fixture_id": "CHANGE-013",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Shipping included</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Shipping not included</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Shipping included",
        "after_text": "Shipping not included"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "A negation must not disappear during normalization."
    },
    {
      "fixture_id": "CHANGE-014",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>READY</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Ready",
        "after_text": "READY"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Case is significant under this contract."
    },
    {
      "fixture_id": "CHANGE-015",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready.</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready!</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Ready.",
        "after_text": "Ready!"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Punctuation is significant."
    },
    {
      "fixture_id": "CHANGE-016",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Café</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Cafe</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Café",
        "after_text": "Cafe"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Accents are preserved."
    },
    {
      "fixture_id": "CHANGE-017",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>First\nSecond</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Second\nFirst</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "First Second",
        "after_text": "Second First"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Order is significant after whitespace normalization."
    },
    {
      "fixture_id": "CHANGE-018",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><a href=\"/old\">Reference</a></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><a href=\"/new\">Reference</a></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Reference",
        "after_text": "Reference"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Text mode intentionally cannot detect a destination-only change."
    },
    {
      "fixture_id": "CHANGE-019",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p><span hidden>Old draft</span></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p><span hidden>New draft</span></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unchanged",
        "before_text": "Ready",
        "after_text": "Ready"
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Hidden descendants are excluded."
    },
    {
      "fixture_id": "CHANGE-020",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"other\"><p>Ready</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unavailable",
        "before_text": "Ready",
        "after_text": null
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Missing selector is unknown, not unchanged."
    },
    {
      "fixture_id": "CHANGE-021",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main><main id=\"watch\"><p>Second region</p></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "ambiguous",
        "before_text": "Ready",
        "after_text": null
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Require querySelectorAll(selector).length === 1 before selection; querySelector alone silently returns the first of these two matches."
    },
    {
      "fixture_id": "CHANGE-022",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\" data-render-required=\"true\">Loading</main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unavailable",
        "before_text": "Ready",
        "after_text": null
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Explicit fixture sentinel needs a later rendered observation."
    },
    {
      "fixture_id": "CHANGE-023",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Access denied</p></main></body></html>",
        "before_status": 200,
        "after_status": 403,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "unavailable",
        "before_text": "Ready",
        "after_text": null
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Simulated HTTP 403 cannot be accepted as a content change."
    },
    {
      "fixture_id": "CHANGE-024",
      "observation_type": "authored_test_fixture",
      "input": {
        "before_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"><p>Ready</p></main></body></html>",
        "after_html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main id=\"watch\"></main></body></html>",
        "before_status": 200,
        "after_status": 200,
        "selector": "#watch",
        "policy": "selected-static-text-v1"
      },
      "expected": {
        "decision": "changed",
        "before_text": "Ready",
        "after_text": ""
      },
      "rule_ids": [
        "W-SCOPE",
        "W-TEXT",
        "W-UNKNOWN"
      ],
      "rationale": "Successful uniquely selected empty content is distinct from a failed observation."
    }
  ]
}
