{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "name": "Article extraction 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/article-extraction-test-dataset/",
  "slug": "article-extraction-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/article-extraction-test-dataset.csv"
    },
    {
      "@type": "DataDownload",
      "encodingFormat": "application/json",
      "contentUrl": "https://konabayev.com/data/article-extraction-test-dataset.json"
    },
    {
      "@type": "DataDownload",
      "encodingFormat": "application/x-ndjson",
      "contentUrl": "https://konabayev.com/data/article-extraction-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": {
    "E-SCOPE": "Select the single main element. No computed CSS is evaluated and no assets are fetched; inert image src values may exist in the HTML. Static source text is the scope, not a rendered screenshot.",
    "E-BLOCKS": "Ordered blocks: headings, paragraphs, list items, table rows (cells joined by \" | \"), pre, figcaption, summary. Do not duplicate text through parent blocks. Decode entities; normalize Unicode whitespace except inside pre; preserve accents, case and punctuation. Join blocks by newline.",
    "E-EXCLUSIONS": "Exclude nav, aside, footer, script, style, comments, hidden and aria-hidden=true subtrees. Exclude image alt and link destinations from this output. These are authored choices, not a general readability standard.",
    "E-RENDER": "data-render-required=true is an explicit synthetic sentinel, not an automatic test for whether arbitrary pages need JavaScript."
  },
  "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": {
      "html": "Complete authored static HTML document, never fetched from a real site.",
      "selector": "Single region selected in the static document.",
      "policy": "Versioned authored extraction contract."
    },
    "expected": {
      "status": "ok, empty, or render_required; empty and unresolved are distinct.",
      "blocks": "Ordered array of extracted text blocks.",
      "text": "Expected blocks joined by newline.",
      "must_not_include": "Forbidden contamination strings; oracle-only constraints, not fields required in adapter output."
    }
  },
  "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": "EXTRACT-001",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><h1>Sample article</h1><p>A complete paragraph.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Sample article",
          "A complete paragraph."
        ],
        "text": "Sample article\nA complete paragraph.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Keep the selected heading and paragraph in source order."
    },
    {
      "fixture_id": "EXTRACT-002",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><nav>Home Pricing</nav><main><p>Article body.</p></main><footer>Site footer</footer></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Article body."
        ],
        "text": "Article body.",
        "must_not_include": [
          "Home Pricing",
          "Site footer"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Outside navigation and footer are outside the selected region."
    },
    {
      "fixture_id": "EXTRACT-003",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Keep this.</p><nav>Related navigation</nav><p>Keep that.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Keep this.",
          "Keep that."
        ],
        "text": "Keep this.\nKeep that.",
        "must_not_include": [
          "Related navigation"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "The explicit excluded-element policy applies inside the region too."
    },
    {
      "fixture_id": "EXTRACT-004",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Main claim.</p><aside>Advertisement copy</aside></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Main claim."
        ],
        "text": "Main claim.",
        "must_not_include": [
          "Advertisement copy"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "An aside is excluded by this fixture contract, even if a real editorial aside could be useful."
    },
    {
      "fixture_id": "EXTRACT-005",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Main text.</p><footer>Article footer promotion</footer></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Main text."
        ],
        "text": "Main text.",
        "must_not_include": [
          "Article footer promotion"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Exclude footer descendants under the chosen contract."
    },
    {
      "fixture_id": "EXTRACT-006",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Keep <strong>important</strong> text.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Keep important text."
        ],
        "text": "Keep important text.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Inline emphasis does not split a block."
    },
    {
      "fixture_id": "EXTRACT-007",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>One <a href=\"https://example.test/reference\">reference</a> follows.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "One reference follows."
        ],
        "text": "One reference follows.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Keep anchor text; destinations are outside this text-only output."
    },
    {
      "fixture_id": "EXTRACT-008",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>  Several\n spaces\t here. </p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Several spaces here."
        ],
        "text": "Several spaces here.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Collapse ordinary whitespace within prose blocks."
    },
    {
      "fixture_id": "EXTRACT-009",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Salt &amp; pepper &#169; 2026.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Salt & pepper © 2026."
        ],
        "text": "Salt & pepper © 2026.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Decode HTML character references."
    },
    {
      "fixture_id": "EXTRACT-010",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>First&nbsp;second.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "First second."
        ],
        "text": "First second.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Normalize nonbreaking spaces to ordinary spaces in prose."
    },
    {
      "fixture_id": "EXTRACT-011",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Visible.</p><p hidden>Hidden draft</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Visible."
        ],
        "text": "Visible.",
        "must_not_include": [
          "Hidden draft"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Exclude a hidden attribute and its descendants."
    },
    {
      "fixture_id": "EXTRACT-012",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Visible.</p><div aria-hidden=\"true\"><p>Decorative copy</p></div></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Visible."
        ],
        "text": "Visible.",
        "must_not_include": [
          "Decorative copy"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Explicitly exclude aria-hidden=true for this contract; this is not a CSS visibility inference."
    },
    {
      "fixture_id": "EXTRACT-013",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Visible.</p><script>window.fixture=\"Script text\";</script><style>.x{content:\"Style text\"}</style></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Visible."
        ],
        "text": "Visible.",
        "must_not_include": [
          "Script text",
          "Style text"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Never include script or style contents as article prose."
    },
    {
      "fixture_id": "EXTRACT-014",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><!-- Internal note --><p>Public paragraph.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Public paragraph."
        ],
        "text": "Public paragraph.",
        "must_not_include": [
          "Internal note"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "HTML comments are not text output."
    },
    {
      "fixture_id": "EXTRACT-015",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><h1>Heading</h1><h2>Section</h2><p>Explanation.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Heading",
          "Section",
          "Explanation."
        ],
        "text": "Heading\nSection\nExplanation.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Keep heading text as ordered blocks; output does not preserve heading-level metadata."
    },
    {
      "fixture_id": "EXTRACT-016",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><ul><li>First item</li><li>Second item</li></ul></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "First item",
          "Second item"
        ],
        "text": "First item\nSecond item",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Each list item is a block; synthetic bullets are not required."
    },
    {
      "fixture_id": "EXTRACT-017",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><table><tr><th>Plan</th><th>Units</th></tr><tr><td>Example</td><td>12</td></tr></table></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Plan | Units",
          "Example | 12"
        ],
        "text": "Plan | Units\nExample | 12",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "A table row is one block with cell boundaries represented by a literal vertical bar."
    },
    {
      "fixture_id": "EXTRACT-018",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><blockquote><p>Quoted sentence.</p></blockquote><p>Comment.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Quoted sentence.",
          "Comment."
        ],
        "text": "Quoted sentence.\nComment.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "A blockquote does not duplicate its paragraph."
    },
    {
      "fixture_id": "EXTRACT-019",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><pre>line 1\n  line 2</pre></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "line 1\n  line 2"
        ],
        "text": "line 1\n  line 2",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Preserve line breaks and indentation inside preformatted text."
    },
    {
      "fixture_id": "EXTRACT-020",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><figure><img src=\"example.png\" alt=\"Alternative label\"><figcaption>Caption text.</figcaption></figure></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Caption text."
        ],
        "text": "Caption text.",
        "must_not_include": [
          "Alternative label"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Caption is a block; image alt is outside this text-output contract."
    },
    {
      "fixture_id": "EXTRACT-021",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><details><summary>Question?</summary><p>Authored answer.</p></details></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Question?",
          "Authored answer."
        ],
        "text": "Question?\nAuthored answer.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Static extraction includes details descendants regardless of initial open state; not a visible-pixels policy."
    },
    {
      "fixture_id": "EXTRACT-022",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main><p>Алматы: қала. Café.</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "ok",
        "blocks": [
          "Алматы: қала. Café."
        ],
        "text": "Алматы: қала. Café.",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "Preserve Unicode letters and punctuation without translation."
    },
    {
      "fixture_id": "EXTRACT-023",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "empty",
        "blocks": [],
        "text": "",
        "must_not_include": []
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS"
      ],
      "rationale": "An existing empty region is an empty result, not a successful article extraction."
    },
    {
      "fixture_id": "EXTRACT-024",
      "observation_type": "authored_test_fixture",
      "input": {
        "html": "<!doctype html><html lang=\"en\"><head><title>Fixture document</title></head><body><main data-render-required=\"true\"><p>Loading article…</p></main></body></html>",
        "selector": "main",
        "policy": "static-article-text-v1"
      },
      "expected": {
        "status": "render_required",
        "blocks": [],
        "text": "",
        "must_not_include": [
          "Loading article…"
        ]
      },
      "rule_ids": [
        "E-SCOPE",
        "E-BLOCKS",
        "E-EXCLUSIONS",
        "E-RENDER"
      ],
      "rationale": "The authored render-required sentinel requests an unresolved result; it is not a generic loading-text detector."
    }
  ]
}
