{
  "source": "09-final.md",
  "source_sha256": "8738973d80f48bb7a1d084351172f30fd48513fb9158f1dadb64a759857803da",
  "python": "3.11.14",
  "blocks": 4,
  "input_count": 12,
  "executions": [
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "sample",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0659,
      "input_sha256": "96ea11a6c06d593679663f16aaee600c57fc50d9cccdb6a68ff906023f4420ab",
      "output": "snippet-1/sample/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really",
        "reading order. A two-column report interleaves its text streams, so a naive extractor will",
        "splice the left column's third paragraph into the middle of the right column's heading, and the",
        "output reads like a corrupted transcript rather than a document.",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text",
        "runs and line strokes, and the converter must reconstruct which cells belong to which row",
        "before it can even think about pipes and dashes. When header cells span two columns,",
        "most tools emit a flattened row that loses the grouping entirely.",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the",
        "pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps,",
        "and skewed margins come back as coherent sentences instead of confident nonsense",
        "scattered across the middle of an otherwise clean document.",
        "",
        "Quarterly invoice summary",
        "Item Qty Unit Price Total",
        "Consulting hours 12 85.00 1020.00",
        "Data export fee 3 40.00 120.00",
        "Template license 1 190.00 190.00",
        "Support retainer 6 55.00 330.00",
        ""
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.071,
      "input_sha256": "1aba9812ef4e0f66bf981ff759c4b62ccc3c0794549b5a4db86fa550d72e3fb1",
      "output": "snippet-1/columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not Demand forecasts fail upward more often than they",
        "the ledger. Teams that reconcile weekly pull the fail downward. Optimistic sales inputs push safety",
        "payment provider's settlement report first, match it stock up for slow movers, and the excess sits in the",
        "against issued invoices by number, and only then warehouse for two quarters before anyone reopens",
        "open the accounting system. Skipping the export the spreadsheet. A weekly report on stock cover by",
        "step leaves ghost receivables that nobody can trace SKU surfaces the overcorrection before the capital is",
        "back to a real transaction. committed.",
        "Returns processing needs a cutoff rule before it Vendor onboarding stalls on the bank details form.",
        "needs software. A warehouse that accepts returns Procurement collects the legal name and tax number",
        "within thirty days must decide whether the clock early, but the remittance address and bank letter",
        "starts at shipment, delivery, or carrier scan, because arrive weeks later because nobody owned that",
        "each choice shifts which orders qualify by several request. Routing the form through finance on day",
        "days. The rule has to be written down before the one removes the most common bottleneck in the",
        "tooling question matters. whole checklist.",
        "Freight quotes age badly in volatile weeks. A Cycle counts beat annual stocktakes for finding",
        "forwarder quoting on Monday may honour the errors early. Counting twenty high-value SKUs every",
        "number for seventy-two hours or until fuel Friday catches a misplaced pallet while the",
        "surcharges update, whichever comes first, and the movement is still in memory, where a December full",
        "difference shows up on the invoice. Buyers who count finds it months after the staff involved have",
        "screenshot the quote save themselves an argument rotated. Accuracy improves because the feedback"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "equation",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0513,
      "input_sha256": "f9c584e021b1c22b5314cca507d6e0aab8f4a43f75b714fab5f162917ff36dd3",
      "output": "snippet-1/equation/output.md",
      "first_20_lines": [
        "Most extraction tools treat a displayed equation as an ordinary text line. That works when",
        "the expression is short and linear, like the examples below, but it breaks as soon as a",
        "fraction, exponent stack, or integral needs two-dimensional layout.",
        "E = mc^2",
        "a^2 + b^2 = c^2",
        "f(x) = 3x + 7",
        "sum_{i=1}^{n} x_i"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "mixed",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0618,
      "input_sha256": "3af170d4912e557e032735dcae16c3ac48b406f51105f740a98dd8cfb58f696c",
      "output": "snippet-1/mixed/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really",
        "reading order. A two-column report interleaves its text streams, so a naive extractor will",
        "splice the left column's third paragraph into the middle of the right column's heading, and the",
        "output reads like a corrupted transcript rather than a document.",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text",
        "runs and line strokes, and the converter must reconstruct which cells belong to which row",
        "before it can even think about pipes and dashes. When header cells span two columns,",
        "most tools emit a flattened row that loses the grouping entirely.",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the",
        "pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps,",
        "and skewed margins come back as coherent sentences instead of confident nonsense",
        "scattered across the middle of an otherwise clean document.",
        "",
        "Quarterly invoice summary",
        "Item Qty Unit Price Total",
        "Consulting hours 12 85.00 1020.00",
        "Data export fee 3 40.00 120.00",
        "Template license 1 190.00 190.00",
        "Support retainer 6 55.00 330.00",
        ""
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "prose-single",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.059,
      "input_sha256": "d681d5fb140cec6f3908856c33a8b37c3ad99fc1b56f2e76bff3baea2a28b689",
      "output": "snippet-1/prose-single/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really",
        "reading order. A two-column report interleaves its text streams, so a naive extractor will",
        "splice the left column's third paragraph into the middle of the right column's heading, and the",
        "output reads like a corrupted transcript rather than a document.",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text",
        "runs and line strokes, and the converter must reconstruct which cells belong to which row",
        "before it can even think about pipes and dashes. When header cells span two columns,",
        "most tools emit a flattened row that loses the grouping entirely.",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the",
        "pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps,",
        "and skewed margins come back as coherent sentences instead of confident nonsense",
        "scattered across the middle of an otherwise clean document."
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "rotated-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0526,
      "input_sha256": "d57b370eb86eb782713b372667cdc814b1c92b39229d07b3a104e3980b22b8d8",
      "output": "snippet-1/rotated-header/output.md",
      "first_20_lines": [
        "Rotated header invoice",
        "metI ytQ",
        "ecirP",
        "tinU",
        "latoT",
        "Consulting hours 12 85.00 1020.00",
        "Data export fee 3 40.00 120.00",
        "Template license 1 190.00 190.00",
        "Support retainer 6 55.00 330.00"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "scan-image",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0505,
      "input_sha256": "359717583b8ba393fd1bd56df12c75213ef33e19c36373ebf0faea0e4ef91f65",
      "output": "snippet-1/scan-image/output.md",
      "first_20_lines": [],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "table-merged-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0527,
      "input_sha256": "201c9455f5903f9e452c8f7be770050905fb174e2f79f489a2330c586d8d23b5",
      "output": "snippet-1/table-merged-header/output.md",
      "first_20_lines": [
        "Invoice with grouped price columns",
        "Item Qty Price",
        "Unit Total",
        "Consulting hours 12 85.00 1020.00",
        "Data export fee 3 40.00 120.00",
        "Template license 1 190.00 190.00",
        "Support retainer 6 55.00 330.00"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "table-simple",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0544,
      "input_sha256": "441ef69958a95269e6814abc0d1a97950545edebab609f24cd30af720922e603",
      "output": "snippet-1/table-simple/output.md",
      "first_20_lines": [
        "Quarterly invoice summary",
        "Item Qty Unit Price Total",
        "Consulting hours 12 85.00 1020.00",
        "Data export fee 3 40.00 120.00",
        "Template license 1 190.00 190.00",
        "Support retainer 6 55.00 330.00"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "two-column",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0674,
      "input_sha256": "f7036c37568100b578ce83b22e8b789b4068f5690cd9126b97a0b6c2331f3fae",
      "output": "snippet-1/two-column/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not Demand forecasts fail upward more often than they",
        "the ledger. Teams that reconcile weekly pull the fail downward. Optimistic sales inputs push safety",
        "payment provider's settlement report first, match it stock up for slow movers, and the excess sits in the",
        "against issued invoices by number, and only then warehouse for two quarters before anyone reopens",
        "open the accounting system. Skipping the export the spreadsheet. A weekly report on stock cover by",
        "step leaves ghost receivables that nobody can trace SKU surfaces the overcorrection before the capital is",
        "back to a real transaction. committed.",
        "Returns processing needs a cutoff rule before it Vendor onboarding stalls on the bank details form.",
        "needs software. A warehouse that accepts returns Procurement collects the legal name and tax number",
        "within thirty days must decide whether the clock early, but the remittance address and bank letter",
        "starts at shipment, delivery, or carrier scan, because arrive weeks later because nobody owned that",
        "each choice shifts which orders qualify by several request. Routing the form through finance on day",
        "days. The rule has to be written down before the one removes the most common bottleneck in the",
        "tooling question matters. whole checklist.",
        "Freight quotes age badly in volatile weeks. A Cycle counts beat annual stocktakes for finding",
        "forwarder quoting on Monday may honour the errors early. Counting twenty high-value SKUs every",
        "number for seventy-two hours or until fuel Friday catches a misplaced pallet while the",
        "surcharges update, whichever comes first, and the movement is still in memory, where a December full",
        "difference shows up on the invoice. Buyers who count finds it months after the staff involved have",
        "screenshot the quote save themselves an argument rotated. Accuracy improves because the feedback"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "wide-columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.074,
      "input_sha256": "065a020fbd2e546bebb55e52207af37e1a44ec76d6efa21d6ed6be86323fc551",
      "output": "snippet-1/wide-columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Demand forecasts fail upward more often than they fail",
        "Teams that reconcile weekly pull the payment provider's downward. Optimistic sales inputs push safety stock up for slow",
        "settlement report first, match it against issued invoices by movers, and the excess sits in the warehouse for two quarters",
        "number, and only then open the accounting system. Skipping before anyone reopens the spreadsheet. A weekly report on",
        "the export step leaves ghost receivables that nobody can trace stock cover by SKU surfaces the overcorrection before the",
        "back to a real transaction. capital is committed.",
        "Returns processing needs a cutoff rule before it needs software. Vendor onboarding stalls on the bank details form. Procurement",
        "A warehouse that accepts returns within thirty days must decide collects the legal name and tax number early, but the remittance",
        "whether the clock starts at shipment, delivery, or carrier scan, address and bank letter arrive weeks later because nobody",
        "because each choice shifts which orders qualify by several days. owned that request. Routing the form through finance on day",
        "The rule has to be written down before the tooling question one removes the most common bottleneck in the whole",
        "matters. checklist.",
        "Freight quotes age badly in volatile weeks. A forwarder quoting Cycle counts beat annual stocktakes for finding errors early.",
        "on Monday may honour the number for seventy-two hours or Counting twenty high-value SKUs every Friday catches a",
        "until fuel surcharges update, whichever comes first, and the misplaced pallet while the movement is still in memory, where a",
        "difference shows up on the invoice. Buyers who screenshot the December full count finds it months after the staff involved have",
        "quote save themselves an argument about which number was rotated. Accuracy improves because the feedback loop is short.",
        "actually agreed.",
        "",
        "Quarterly invoice summary"
      ],
      "stderr": null
    },
    {
      "block": 1,
      "script": "snippet-1.py",
      "sample": "wide-columns",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.069,
      "input_sha256": "53eb5443742966574a4564ee1c8a367ad4b52337954e0a2cb71aea86fb021209",
      "output": "snippet-1/wide-columns/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Demand forecasts fail upward more often than they fail",
        "Teams that reconcile weekly pull the payment provider's downward. Optimistic sales inputs push safety stock up for slow",
        "settlement report first, match it against issued invoices by movers, and the excess sits in the warehouse for two quarters",
        "number, and only then open the accounting system. Skipping before anyone reopens the spreadsheet. A weekly report on",
        "the export step leaves ghost receivables that nobody can trace stock cover by SKU surfaces the overcorrection before the",
        "back to a real transaction. capital is committed.",
        "Returns processing needs a cutoff rule before it needs software. Vendor onboarding stalls on the bank details form. Procurement",
        "A warehouse that accepts returns within thirty days must decide collects the legal name and tax number early, but the remittance",
        "whether the clock starts at shipment, delivery, or carrier scan, address and bank letter arrive weeks later because nobody",
        "because each choice shifts which orders qualify by several days. owned that request. Routing the form through finance on day",
        "The rule has to be written down before the tooling question one removes the most common bottleneck in the whole",
        "matters. checklist.",
        "Freight quotes age badly in volatile weeks. A forwarder quoting Cycle counts beat annual stocktakes for finding errors early.",
        "on Monday may honour the number for seventy-two hours or Counting twenty high-value SKUs every Friday catches a",
        "until fuel surcharges update, whichever comes first, and the misplaced pallet while the movement is still in memory, where a",
        "difference shows up on the invoice. Buyers who screenshot the December full count finds it months after the staff involved have",
        "quote save themselves an argument about which number was rotated. Accuracy improves because the feedback loop is short.",
        "actually agreed."
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "sample",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0659,
      "input_sha256": "96ea11a6c06d593679663f16aaee600c57fc50d9cccdb6a68ff906023f4420ab",
      "output": "snippet-2/sample/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a",
        "reading order. A two-column report interleaves",
        "splice the left column's third paragraph into the",
        "output reads like a corrupted transcript rather t",
        "Tables fail differently. The visual grid you see o",
        "runs and line strokes, and the converter must r",
        "before it can even think about pipes and dashe",
        "most tools emit a flattened row that loses the g",
        "Scanned pages are the third failure mode. The",
        "pipeline has to hand the page to an OCR or vis",
        "and skewed margins come back as coherent s",
        "scattered across the middle of an otherwise cle",
        "",
        "a formatting chore, but the hard part is really",
        "s its text streams, so a naive extractor will",
        "e middle of the right column's heading, and the",
        "than a document.",
        "on the page is only a hint; the PDF stores text",
        "reconstruct which cells belong to which row",
        "es. When header cells span two columns,"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0748,
      "input_sha256": "1aba9812ef4e0f66bf981ff759c4b62ccc3c0794549b5a4db86fa550d72e3fb1",
      "output": "snippet-2/columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not",
        "the ledger. Teams that reconcile weekly pull the",
        "payment provider's settlement report first, match it",
        "against issued invoices by number, and only then",
        "open the accounting system. Skipping the export",
        "step leaves ghost receivables that nobody can trace",
        "back to a real transaction.",
        "Returns processing needs a cutoff rule before it",
        "needs software. A warehouse that accepts returns",
        "within thirty days must decide whether the clock",
        "starts at shipment, delivery, or carrier scan, because",
        "each choice shifts which orders qualify by several",
        "days. The rule has to be written down before the",
        "tooling question matters.",
        "Freight quotes age badly in volatile weeks. A",
        "forwarder quoting on Monday may honour the",
        "number for seventy-two hours or until fuel",
        "surcharges update, whichever comes first, and the",
        "difference shows up on the invoice. Buyers who",
        "screenshot the quote save themselves an argument"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "equation",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0552,
      "input_sha256": "f9c584e021b1c22b5314cca507d6e0aab8f4a43f75b714fab5f162917ff36dd3",
      "output": "snippet-2/equation/output.md",
      "first_20_lines": [
        "Most extraction tools treat a displayed equation",
        "the expression is short and linear, like the exam",
        "fraction, exponent stack, or integral needs two-",
        "E = mc^2",
        "a^2 + b^2 = c^2",
        "f(x) = 3x + 7",
        "sum_{i=1}^{n} x_i",
        "",
        "n as an ordinary text line. That works when",
        "mples below, but it breaks as soon as a",
        "-dimensional layout."
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "mixed",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0649,
      "input_sha256": "3af170d4912e557e032735dcae16c3ac48b406f51105f740a98dd8cfb58f696c",
      "output": "snippet-2/mixed/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a",
        "reading order. A two-column report interleaves",
        "splice the left column's third paragraph into the",
        "output reads like a corrupted transcript rather t",
        "Tables fail differently. The visual grid you see o",
        "runs and line strokes, and the converter must r",
        "before it can even think about pipes and dashe",
        "most tools emit a flattened row that loses the g",
        "Scanned pages are the third failure mode. The",
        "pipeline has to hand the page to an OCR or vis",
        "and skewed margins come back as coherent s",
        "scattered across the middle of an otherwise cle",
        "",
        "a formatting chore, but the hard part is really",
        "s its text streams, so a naive extractor will",
        "e middle of the right column's heading, and the",
        "than a document.",
        "on the page is only a hint; the PDF stores text",
        "reconstruct which cells belong to which row",
        "es. When header cells span two columns,"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "prose-single",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0624,
      "input_sha256": "d681d5fb140cec6f3908856c33a8b37c3ad99fc1b56f2e76bff3baea2a28b689",
      "output": "snippet-2/prose-single/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a",
        "reading order. A two-column report interleaves",
        "splice the left column's third paragraph into the",
        "output reads like a corrupted transcript rather t",
        "Tables fail differently. The visual grid you see o",
        "runs and line strokes, and the converter must r",
        "before it can even think about pipes and dashe",
        "most tools emit a flattened row that loses the g",
        "Scanned pages are the third failure mode. The",
        "pipeline has to hand the page to an OCR or vis",
        "and skewed margins come back as coherent s",
        "scattered across the middle of an otherwise cle",
        "",
        "a formatting chore, but the hard part is really",
        "s its text streams, so a naive extractor will",
        "e middle of the right column's heading, and the",
        "than a document.",
        "on the page is only a hint; the PDF stores text",
        "reconstruct which cells belong to which row",
        "es. When header cells span two columns,"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "rotated-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0557,
      "input_sha256": "d57b370eb86eb782713b372667cdc814b1c92b39229d07b3a104e3980b22b8d8",
      "output": "snippet-2/rotated-header/output.md",
      "first_20_lines": [
        "Rotated header invoice",
        "metI",
        "ytQ",
        "Consulting hours 12",
        "Data export fee 3",
        "Template license 1",
        "Support retainer 6",
        "",
        "ecirP",
        "tinU",
        "latoT",
        "85.00 1020.00",
        "40.00 120.00",
        "190.00 190.00",
        "55.00 330.00"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "scan-image",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0519,
      "input_sha256": "359717583b8ba393fd1bd56df12c75213ef33e19c36373ebf0faea0e4ef91f65",
      "output": "snippet-2/scan-image/output.md",
      "first_20_lines": [
        "",
        ""
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "table-merged-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0565,
      "input_sha256": "201c9455f5903f9e452c8f7be770050905fb174e2f79f489a2330c586d8d23b5",
      "output": "snippet-2/table-merged-header/output.md",
      "first_20_lines": [
        "Invoice with grouped price columns",
        "Item Qty",
        "Consulting hours 12",
        "Data export fee 3",
        "Template license 1",
        "Support retainer 6",
        "",
        "Price",
        "Unit Total",
        "85.00 1020.00",
        "40.00 120.00",
        "190.00 190.00",
        "55.00 330.00"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "table-simple",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0555,
      "input_sha256": "441ef69958a95269e6814abc0d1a97950545edebab609f24cd30af720922e603",
      "output": "snippet-2/table-simple/output.md",
      "first_20_lines": [
        "Quarterly invoice summary",
        "Item Qty",
        "Consulting hours 12",
        "Data export fee 3",
        "Template license 1",
        "Support retainer 6",
        "",
        "Unit Price Total",
        "85.00 1020.00",
        "40.00 120.00",
        "190.00 190.00",
        "55.00 330.00"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "two-column",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0725,
      "input_sha256": "f7036c37568100b578ce83b22e8b789b4068f5690cd9126b97a0b6c2331f3fae",
      "output": "snippet-2/two-column/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not",
        "the ledger. Teams that reconcile weekly pull the",
        "payment provider's settlement report first, match it",
        "against issued invoices by number, and only then",
        "open the accounting system. Skipping the export",
        "step leaves ghost receivables that nobody can trace",
        "back to a real transaction.",
        "Returns processing needs a cutoff rule before it",
        "needs software. A warehouse that accepts returns",
        "within thirty days must decide whether the clock",
        "starts at shipment, delivery, or carrier scan, because",
        "each choice shifts which orders qualify by several",
        "days. The rule has to be written down before the",
        "tooling question matters.",
        "Freight quotes age badly in volatile weeks. A",
        "forwarder quoting on Monday may honour the",
        "number for seventy-two hours or until fuel",
        "surcharges update, whichever comes first, and the",
        "difference shows up on the invoice. Buyers who",
        "screenshot the quote save themselves an argument"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "wide-columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.0769,
      "input_sha256": "065a020fbd2e546bebb55e52207af37e1a44ec76d6efa21d6ed6be86323fc551",
      "output": "snippet-2/wide-columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger.",
        "Teams that reconcile weekly pull the payment provider's",
        "settlement report first, match it against issued invoices by",
        "number, and only then open the accounting system. Skipping",
        "the export step leaves ghost receivables that nobody can trace",
        "back to a real transaction.",
        "Returns processing needs a cutoff rule before it needs software.",
        "A warehouse that accepts returns within thirty days must decide",
        "whether the clock starts at shipment, delivery, or carrier scan,",
        "because each choice shifts which orders qualify by several days.",
        "The rule has to be written down before the tooling question",
        "matters.",
        "Freight quotes age badly in volatile weeks. A forwarder quoting",
        "on Monday may honour the number for seventy-two hours or",
        "until fuel surcharges update, whichever comes first, and the",
        "difference shows up on the invoice. Buyers who screenshot the",
        "quote save themselves an argument about which number was",
        "actually agreed.",
        "",
        "Demand forecasts fail upward more often than they fail"
      ],
      "stderr": null
    },
    {
      "block": 2,
      "script": "snippet-2.py",
      "sample": "wide-columns",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.071,
      "input_sha256": "53eb5443742966574a4564ee1c8a367ad4b52337954e0a2cb71aea86fb021209",
      "output": "snippet-2/wide-columns/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger.",
        "Teams that reconcile weekly pull the payment provider's",
        "settlement report first, match it against issued invoices by",
        "number, and only then open the accounting system. Skipping",
        "the export step leaves ghost receivables that nobody can trace",
        "back to a real transaction.",
        "Returns processing needs a cutoff rule before it needs software.",
        "A warehouse that accepts returns within thirty days must decide",
        "whether the clock starts at shipment, delivery, or carrier scan,",
        "because each choice shifts which orders qualify by several days.",
        "The rule has to be written down before the tooling question",
        "matters.",
        "Freight quotes age badly in volatile weeks. A forwarder quoting",
        "on Monday may honour the number for seventy-two hours or",
        "until fuel surcharges update, whichever comes first, and the",
        "difference shows up on the invoice. Buyers who screenshot the",
        "quote save themselves an argument about which number was",
        "actually agreed.",
        "",
        "Demand forecasts fail upward more often than they fail"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "sample",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3762,
      "input_sha256": "96ea11a6c06d593679663f16aaee600c57fc50d9cccdb6a68ff906023f4420ab",
      "output": "snippet-3/sample/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really",
        "reading order. A two-column report interleaves its text streams, so a naive extractor will",
        "splice the left column's third paragraph into the middle of the right column's heading, and the",
        "output reads like a corrupted transcript rather than a document.",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text",
        "runs and line strokes, and the converter must reconstruct which cells belong to which row",
        "before it can even think about pipes and dashes. When header cells span two columns,",
        "most tools emit a flattened row that loses the grouping entirely.",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the",
        "pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps,",
        "and skewed margins come back as coherent sentences instead of confident nonsense",
        "scattered across the middle of an otherwise clean document.",
        "",
        "Quarterly invoice summary",
        "| Item             | Qty | Unit Price | Total   |",
        "| ---------------- | --- | ---------- | ------- |",
        "| Consulting hours | 12  | 85.00      | 1020.00 |",
        "| Data export fee  | 3   | 40.00      | 120.00  |",
        "| Template license | 1   | 190.00     | 190.00  |",
        "| Support retainer | 6   | 55.00      | 330.00  |"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3472,
      "input_sha256": "1aba9812ef4e0f66bf981ff759c4b62ccc3c0794549b5a4db86fa550d72e3fb1",
      "output": "snippet-3/columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not Demand forecasts fail upward more often than they",
        "the ledger. Teams that reconcile weekly pull the fail downward. Optimistic sales inputs push safety",
        "payment provider's settlement report first, match it stock up for slow movers, and the excess sits in the",
        "against issued invoices by number, and only then warehouse for two quarters before anyone reopens",
        "open the accounting system. Skipping the export the spreadsheet. A weekly report on stock cover by",
        "step leaves ghost receivables that nobody can trace SKU surfaces the overcorrection before the capital is",
        "back to a real transaction. committed.",
        "Returns processing needs a cutoff rule before it Vendor onboarding stalls on the bank details form.",
        "needs software. A warehouse that accepts returns Procurement collects the legal name and tax number",
        "within thirty days must decide whether the clock early, but the remittance address and bank letter",
        "starts at shipment, delivery, or carrier scan, because arrive weeks later because nobody owned that",
        "each choice shifts which orders qualify by several request. Routing the form through finance on day",
        "days. The rule has to be written down before the one removes the most common bottleneck in the",
        "tooling question matters. whole checklist.",
        "Freight quotes age badly in volatile weeks. A Cycle counts beat annual stocktakes for finding",
        "forwarder quoting on Monday may honour the errors early. Counting twenty high-value SKUs every",
        "number for seventy-two hours or until fuel Friday catches a misplaced pallet while the",
        "surcharges update, whichever comes first, and the movement is still in memory, where a December full",
        "difference shows up on the invoice. Buyers who count finds it months after the staff involved have",
        "screenshot the quote save themselves an argument rotated. Accuracy improves because the feedback"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "equation",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.337,
      "input_sha256": "f9c584e021b1c22b5314cca507d6e0aab8f4a43f75b714fab5f162917ff36dd3",
      "output": "snippet-3/equation/output.md",
      "first_20_lines": [
        "Most extraction tools treat a displayed equation as an ordinary text line. That works when",
        "",
        "the expression is short and linear, like the examples below, but it breaks as soon as a",
        "",
        "fraction, exponent stack, or integral needs two-dimensional layout.",
        "",
        "E = mc^2",
        "",
        "a^2 + b^2 = c^2",
        "",
        "f(x) = 3x + 7",
        "",
        "sum_{i=1}^{n} x_i",
        ""
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "mixed",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.344,
      "input_sha256": "3af170d4912e557e032735dcae16c3ac48b406f51105f740a98dd8cfb58f696c",
      "output": "snippet-3/mixed/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really",
        "reading order. A two-column report interleaves its text streams, so a naive extractor will",
        "splice the left column's third paragraph into the middle of the right column's heading, and the",
        "output reads like a corrupted transcript rather than a document.",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text",
        "runs and line strokes, and the converter must reconstruct which cells belong to which row",
        "before it can even think about pipes and dashes. When header cells span two columns,",
        "most tools emit a flattened row that loses the grouping entirely.",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the",
        "pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps,",
        "and skewed margins come back as coherent sentences instead of confident nonsense",
        "scattered across the middle of an otherwise clean document.",
        "",
        "Quarterly invoice summary",
        "| Item             | Qty | Unit Price | Total   |",
        "| ---------------- | --- | ---------- | ------- |",
        "| Consulting hours | 12  | 85.00      | 1020.00 |",
        "| Data export fee  | 3   | 40.00      | 120.00  |",
        "| Template license | 1   | 190.00     | 190.00  |",
        "| Support retainer | 6   | 55.00      | 330.00  |"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "prose-single",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3376,
      "input_sha256": "d681d5fb140cec6f3908856c33a8b37c3ad99fc1b56f2e76bff3baea2a28b689",
      "output": "snippet-3/prose-single/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really",
        "",
        "reading order. A two-column report interleaves its text streams, so a naive extractor will",
        "",
        "splice the left column's third paragraph into the middle of the right column's heading, and the",
        "",
        "output reads like a corrupted transcript rather than a document.",
        "",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text",
        "",
        "runs and line strokes, and the converter must reconstruct which cells belong to which row",
        "",
        "before it can even think about pipes and dashes. When header cells span two columns,",
        "",
        "most tools emit a flattened row that loses the grouping entirely.",
        "",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the",
        "",
        "pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps,",
        ""
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "rotated-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3303,
      "input_sha256": "d57b370eb86eb782713b372667cdc814b1c92b39229d07b3a104e3980b22b8d8",
      "output": "snippet-3/rotated-header/output.md",
      "first_20_lines": [
        "Rotated header invoice",
        "ecirP tinU",
        "latoT",
        "metI",
        "ytQ",
        "| Consulting hours | 12  | 85.00  | 1020.00 |",
        "| ---------------- | --- | ------ | ------- |",
        "| Data export fee  | 3   | 40.00  | 120.00  |",
        "| Template license | 1   | 190.00 | 190.00  |",
        "| Support retainer | 6   | 55.00  | 330.00  |"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "scan-image",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3258,
      "input_sha256": "359717583b8ba393fd1bd56df12c75213ef33e19c36373ebf0faea0e4ef91f65",
      "output": "snippet-3/scan-image/output.md",
      "first_20_lines": [],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "table-merged-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3338,
      "input_sha256": "201c9455f5903f9e452c8f7be770050905fb174e2f79f489a2330c586d8d23b5",
      "output": "snippet-3/table-merged-header/output.md",
      "first_20_lines": [
        "Invoice with grouped price columns",
        "| Item             | Qty | Price  |         |",
        "| ---------------- | --- | ------ | ------- |",
        "|                  |     | Unit   | Total   |",
        "| Consulting hours | 12  | 85.00  | 1020.00 |",
        "| Data export fee  | 3   | 40.00  | 120.00  |",
        "| Template license | 1   | 190.00 | 190.00  |",
        "| Support retainer | 6   | 55.00  | 330.00  |"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "table-simple",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3345,
      "input_sha256": "441ef69958a95269e6814abc0d1a97950545edebab609f24cd30af720922e603",
      "output": "snippet-3/table-simple/output.md",
      "first_20_lines": [
        "Quarterly invoice summary",
        "| Item             | Qty | Unit Price | Total   |",
        "| ---------------- | --- | ---------- | ------- |",
        "| Consulting hours | 12  | 85.00      | 1020.00 |",
        "| Data export fee  | 3   | 40.00      | 120.00  |",
        "| Template license | 1   | 190.00     | 190.00  |",
        "| Support retainer | 6   | 55.00      | 330.00  |"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "two-column",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3557,
      "input_sha256": "f7036c37568100b578ce83b22e8b789b4068f5690cd9126b97a0b6c2331f3fae",
      "output": "snippet-3/two-column/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not",
        "",
        "Demand forecasts fail upward more often than they",
        "",
        "the ledger. Teams that reconcile weekly pull the",
        "",
        "fail downward. Optimistic sales inputs push safety",
        "",
        "payment provider's settlement report first, match it",
        "",
        "stock up for slow movers, and the excess sits in the",
        "",
        "against issued invoices by number, and only then",
        "",
        "warehouse for two quarters before anyone reopens",
        "",
        "open the accounting system. Skipping the export",
        "",
        "the spreadsheet. A weekly report on stock cover by",
        ""
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "wide-columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.347,
      "input_sha256": "065a020fbd2e546bebb55e52207af37e1a44ec76d6efa21d6ed6be86323fc551",
      "output": "snippet-3/wide-columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Demand forecasts fail upward more often than they fail",
        "Teams that reconcile weekly pull the payment provider's downward. Optimistic sales inputs push safety stock up for slow",
        "settlement report first, match it against issued invoices by movers, and the excess sits in the warehouse for two quarters",
        "number, and only then open the accounting system. Skipping before anyone reopens the spreadsheet. A weekly report on",
        "the export step leaves ghost receivables that nobody can trace stock cover by SKU surfaces the overcorrection before the",
        "back to a real transaction. capital is committed.",
        "Returns processing needs a cutoff rule before it needs software. Vendor onboarding stalls on the bank details form. Procurement",
        "A warehouse that accepts returns within thirty days must decide collects the legal name and tax number early, but the remittance",
        "whether the clock starts at shipment, delivery, or carrier scan, address and bank letter arrive weeks later because nobody",
        "because each choice shifts which orders qualify by several days. owned that request. Routing the form through finance on day",
        "The rule has to be written down before the tooling question one removes the most common bottleneck in the whole",
        "matters. checklist.",
        "Freight quotes age badly in volatile weeks. A forwarder quoting Cycle counts beat annual stocktakes for finding errors early.",
        "on Monday may honour the number for seventy-two hours or Counting twenty high-value SKUs every Friday catches a",
        "until fuel surcharges update, whichever comes first, and the misplaced pallet while the movement is still in memory, where a",
        "difference shows up on the invoice. Buyers who screenshot the December full count finds it months after the staff involved have",
        "quote save themselves an argument about which number was rotated. Accuracy improves because the feedback loop is short.",
        "actually agreed.",
        "",
        "Quarterly invoice summary"
      ],
      "stderr": null
    },
    {
      "block": 3,
      "script": "snippet-3.py",
      "sample": "wide-columns",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3536,
      "input_sha256": "53eb5443742966574a4564ee1c8a367ad4b52337954e0a2cb71aea86fb021209",
      "output": "snippet-3/wide-columns/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger.",
        "Teams that reconcile weekly pull the payment provider's",
        "settlement report first, match it against issued invoices by",
        "number, and only then open the accounting system. Skipping",
        "the export step leaves ghost receivables that nobody can trace",
        "back to a real transaction.",
        "",
        "Returns processing needs a cutoff rule before it needs software.",
        "A warehouse that accepts returns within thirty days must decide",
        "whether the clock starts at shipment, delivery, or carrier scan,",
        "because each choice shifts which orders qualify by several days.",
        "The rule has to be written down before the tooling question",
        "matters.",
        "",
        "Freight quotes age badly in volatile weeks. A forwarder quoting",
        "on Monday may honour the number for seventy-two hours or",
        "until fuel surcharges update, whichever comes first, and the",
        "difference shows up on the invoice. Buyers who screenshot the",
        "quote save themselves an argument about which number was",
        "actually agreed."
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "sample",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.7357,
      "input_sha256": "96ea11a6c06d593679663f16aaee600c57fc50d9cccdb6a68ff906023f4420ab",
      "output": "snippet-4/sample/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really reading order. A two-column report interleaves its text streams, so a naive extractor will splice the left column's third paragraph into the middle of the right column's heading, and the output reads like a corrupted transcript rather than a document. ",
        "",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text runs and line strokes, and the converter must reconstruct which cells belong to which row before it can even think about pipes and dashes. When header cells span two columns, most tools emit a flattened row that loses the grouping entirely. ",
        "",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps, and skewed margins come back as coherent sentences instead of confident nonsense scattered across the middle of an otherwise clean document. ",
        "",
        "# **Quarterly invoice summary** ",
        "",
        "|**Item**|**Qty**|**Unit Price**|**Total**|",
        "|---|---|---|---|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|",
        "",
        "",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.4609,
      "input_sha256": "1aba9812ef4e0f66bf981ff759c4b62ccc3c0794549b5a4db86fa550d72e3fb1",
      "output": "snippet-4/columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Teams that reconcile weekly pull the payment provider's settlement report first, match it against issued invoices by number, and only then open the accounting system. Skipping the export step leaves ghost receivables that nobody can trace back to a real transaction. ",
        "",
        "Returns processing needs a cutoff rule before it needs software. A warehouse that accepts returns within thirty days must decide whether the clock starts at shipment, delivery, or carrier scan, because each choice shifts which orders qualify by several days. The rule has to be written down before the tooling question matters. ",
        "",
        "Freight quotes age badly in volatile weeks. A forwarder quoting on Monday may honour the number for seventy-two hours or until fuel surcharges update, whichever comes first, and the difference shows up on the invoice. Buyers who screenshot the quote save themselves an argument about which number was actually agreed. ",
        "",
        "Demand forecasts fail upward more often than they fail downward. Optimistic sales inputs push safety stock up for slow movers, and the excess sits in the warehouse for two quarters before anyone reopens the spreadsheet. A weekly report on stock cover by SKU surfaces the overcorrection before the capital is committed. ",
        "",
        "Vendor onboarding stalls on the bank details form. Procurement collects the legal name and tax number early, but the remittance address and bank letter arrive weeks later because nobody owned that request. Routing the form through finance on day one removes the most common bottleneck in the whole checklist. ",
        "",
        "Cycle counts beat annual stocktakes for finding errors early. Counting twenty high-value SKUs every Friday catches a misplaced pallet while the movement is still in memory, where a December full count finds it months after the staff involved have rotated. Accuracy improves because the feedback loop is short. ",
        "",
        "# **Quarterly invoice summary** ",
        "",
        "|**Item**|**Qty**|**Unit Price**|**Total**|",
        "|---|---|---|---|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|"
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "equation",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3791,
      "input_sha256": "f9c584e021b1c22b5314cca507d6e0aab8f4a43f75b714fab5f162917ff36dd3",
      "output": "snippet-4/equation/output.md",
      "first_20_lines": [
        "Most extraction tools treat a displayed equation as an ordinary text line. That works when the expression is short and linear, like the examples below, but it breaks as soon as a fraction, exponent stack, or integral needs two-dimensional layout. ",
        "",
        "",
        "",
        "a^2 + b^2 = c^2 f(x) = 3x + 7 sum_{i=1}^{n} x_i ",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "mixed",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.5433,
      "input_sha256": "3af170d4912e557e032735dcae16c3ac48b406f51105f740a98dd8cfb58f696c",
      "output": "snippet-4/mixed/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really reading order. A two-column report interleaves its text streams, so a naive extractor will splice the left column's third paragraph into the middle of the right column's heading, and the output reads like a corrupted transcript rather than a document. ",
        "",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text runs and line strokes, and the converter must reconstruct which cells belong to which row before it can even think about pipes and dashes. When header cells span two columns, most tools emit a flattened row that loses the grouping entirely. ",
        "",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps, and skewed margins come back as coherent sentences instead of confident nonsense scattered across the middle of an otherwise clean document. ",
        "",
        "# **Quarterly invoice summary** ",
        "",
        "|**Item**|**Qty**|**Unit Price**|**Total**|",
        "|---|---|---|---|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|",
        "",
        "",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "prose-single",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3828,
      "input_sha256": "d681d5fb140cec6f3908856c33a8b37c3ad99fc1b56f2e76bff3baea2a28b689",
      "output": "snippet-4/prose-single/output.md",
      "first_20_lines": [
        "Converting a PDF into Markdown sounds like a formatting chore, but the hard part is really reading order. A two-column report interleaves its text streams, so a naive extractor will splice the left column's third paragraph into the middle of the right column's heading, and the output reads like a corrupted transcript rather than a document. ",
        "",
        "Tables fail differently. The visual grid you see on the page is only a hint; the PDF stores text runs and line strokes, and the converter must reconstruct which cells belong to which row before it can even think about pipes and dashes. When header cells span two columns, most tools emit a flattened row that loses the grouping entirely. ",
        "",
        "Scanned pages are the third failure mode. There is no text to extract, only an image, so the pipeline has to hand the page to an OCR or vision model and hope the handwriting, stamps, and skewed margins come back as coherent sentences instead of confident nonsense scattered across the middle of an otherwise clean document. ",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "rotated-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3968,
      "input_sha256": "d57b370eb86eb782713b372667cdc814b1c92b39229d07b3a104e3980b22b8d8",
      "output": "snippet-4/rotated-header/output.md",
      "first_20_lines": [
        "# **Rotated header invoice** ",
        "",
        "|||**rice**||",
        "|---|---|---|---|",
        "|**Item**|**Qty**|**Unit P**|**Total**|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|",
        "",
        "",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "scan-image",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.433,
      "input_sha256": "359717583b8ba393fd1bd56df12c75213ef33e19c36373ebf0faea0e4ef91f65",
      "output": "snippet-4/scan-image/output.md",
      "first_20_lines": [],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "table-merged-header",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3914,
      "input_sha256": "201c9455f5903f9e452c8f7be770050905fb174e2f79f489a2330c586d8d23b5",
      "output": "snippet-4/table-merged-header/output.md",
      "first_20_lines": [
        "# **Invoice with grouped price columns** ",
        "",
        "|**Item**|**Qty**|**Price**||",
        "|---|---|---|---|",
        "|||**Unit**|**Total**|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|",
        "",
        "",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "table-simple",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3956,
      "input_sha256": "441ef69958a95269e6814abc0d1a97950545edebab609f24cd30af720922e603",
      "output": "snippet-4/table-simple/output.md",
      "first_20_lines": [
        "# **Quarterly invoice summary** ",
        "",
        "|**Item**|**Qty**|**Unit Price**|**Total**|",
        "|---|---|---|---|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|",
        "",
        "",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "two-column",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3918,
      "input_sha256": "f7036c37568100b578ce83b22e8b789b4068f5690cd9126b97a0b6c2331f3fae",
      "output": "snippet-4/two-column/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Teams that reconcile weekly pull the payment provider's settlement report first, match it against issued invoices by number, and only then open the accounting system. Skipping the export step leaves ghost receivables that nobody can trace back to a real transaction. ",
        "",
        "Returns processing needs a cutoff rule before it needs software. A warehouse that accepts returns within thirty days must decide whether the clock starts at shipment, delivery, or carrier scan, because each choice shifts which orders qualify by several days. The rule has to be written down before the tooling question matters. ",
        "",
        "Freight quotes age badly in volatile weeks. A forwarder quoting on Monday may honour the number for seventy-two hours or until fuel surcharges update, whichever comes first, and the difference shows up on the invoice. Buyers who screenshot the quote save themselves an argument about which number was actually agreed. ",
        "",
        "Demand forecasts fail upward more often than they fail downward. Optimistic sales inputs push safety stock up for slow movers, and the excess sits in the warehouse for two quarters before anyone reopens the spreadsheet. A weekly report on stock cover by SKU surfaces the overcorrection before the capital is committed. ",
        "",
        "Vendor onboarding stalls on the bank details form. Procurement collects the legal name and tax number early, but the remittance address and bank letter arrive weeks later because nobody owned that request. Routing the form through finance on day one removes the most common bottleneck in the whole checklist. ",
        "",
        "Cycle counts beat annual stocktakes for finding errors early. Counting twenty high-value SKUs every Friday catches a misplaced pallet while the movement is still in memory, where a December full count finds it months after the staff involved have rotated. Accuracy improves because the feedback loop is short. ",
        ""
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "wide-columns-with-table",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.4582,
      "input_sha256": "065a020fbd2e546bebb55e52207af37e1a44ec76d6efa21d6ed6be86323fc551",
      "output": "snippet-4/wide-columns-with-table/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Teams that reconcile weekly pull the payment provider's settlement report first, match it against issued invoices by number, and only then open the accounting system. Skipping the export step leaves ghost receivables that nobody can trace back to a real transaction. ",
        "",
        "Returns processing needs a cutoff rule before it needs software. A warehouse that accepts returns within thirty days must decide whether the clock starts at shipment, delivery, or carrier scan, because each choice shifts which orders qualify by several days. The rule has to be written down before the tooling question matters. ",
        "",
        "Freight quotes age badly in volatile weeks. A forwarder quoting on Monday may honour the number for seventy-two hours or until fuel surcharges update, whichever comes first, and the difference shows up on the invoice. Buyers who screenshot the quote save themselves an argument about which number was actually agreed. ",
        "",
        "Demand forecasts fail upward more often than they fail downward. Optimistic sales inputs push safety stock up for slow movers, and the excess sits in the warehouse for two quarters before anyone reopens the spreadsheet. A weekly report on stock cover by SKU surfaces the overcorrection before the capital is committed. ",
        "",
        "Vendor onboarding stalls on the bank details form. Procurement collects the legal name and tax number early, but the remittance address and bank letter arrive weeks later because nobody owned that request. Routing the form through finance on day one removes the most common bottleneck in the whole checklist. ",
        "",
        "Cycle counts beat annual stocktakes for finding errors early. Counting twenty high-value SKUs every Friday catches a misplaced pallet while the movement is still in memory, where a December full count finds it months after the staff involved have rotated. Accuracy improves because the feedback loop is short. ",
        "",
        "# **Quarterly invoice summary** ",
        "",
        "|**Item**|**Qty**|**Unit Price**|**Total**|",
        "|---|---|---|---|",
        "|Consulting hours|12|85.00|1020.00|",
        "|Data export fee|3|40.00|120.00|",
        "|Template license|1|190.00|190.00|",
        "|Support retainer|6|55.00|330.00|"
      ],
      "stderr": null
    },
    {
      "block": 4,
      "script": "snippet-4.py",
      "sample": "wide-columns",
      "returncode": 0,
      "success": true,
      "elapsed_s": 0.3966,
      "input_sha256": "53eb5443742966574a4564ee1c8a367ad4b52337954e0a2cb71aea86fb021209",
      "output": "snippet-4/wide-columns/output.md",
      "first_20_lines": [
        "Invoice reconciliation starts with the export file, not the ledger. Teams that reconcile weekly pull the payment provider's settlement report first, match it against issued invoices by number, and only then open the accounting system. Skipping the export step leaves ghost receivables that nobody can trace back to a real transaction. ",
        "",
        "Returns processing needs a cutoff rule before it needs software. A warehouse that accepts returns within thirty days must decide whether the clock starts at shipment, delivery, or carrier scan, because each choice shifts which orders qualify by several days. The rule has to be written down before the tooling question matters. ",
        "",
        "Freight quotes age badly in volatile weeks. A forwarder quoting on Monday may honour the number for seventy-two hours or until fuel surcharges update, whichever comes first, and the difference shows up on the invoice. Buyers who screenshot the quote save themselves an argument about which number was actually agreed. ",
        "",
        "Demand forecasts fail upward more often than they fail downward. Optimistic sales inputs push safety stock up for slow movers, and the excess sits in the warehouse for two quarters before anyone reopens the spreadsheet. A weekly report on stock cover by SKU surfaces the overcorrection before the capital is committed. ",
        "",
        "Vendor onboarding stalls on the bank details form. Procurement collects the legal name and tax number early, but the remittance address and bank letter arrive weeks later because nobody owned that request. Routing the form through finance on day one removes the most common bottleneck in the whole checklist. ",
        "",
        "Cycle counts beat annual stocktakes for finding errors early. Counting twenty high-value SKUs every Friday catches a misplaced pallet while the movement is still in memory, where a December full count finds it months after the staff involved have rotated. Accuracy improves because the feedback loop is short. ",
        ""
      ],
      "stderr": null
    }
  ]
}
