Opens in a new tabSkip to content
Agent LighthouseAgent Lighthouse

    Searches the text of every published page. The evidence sources themselves are not in this index — search all of them on the trusted sources page.

    GitHub ↗
    Browse checks and page contents
    answer-readiness/table-markdown-round-trip-loss

    Tables survive conversion to markdown

    What it checks

    Converts every main-content table to GFM markdown — the exact representation answer-engine readers emit — re-parses it, and diffs cell-for-cell against the source DOM. Any cell lost, merged, or de-associated is reported by coordinate. Layered on top of the WHATWG header-association check (th, scope, headers) so the finding distinguishes ‘screen readers can’t parse this’ from ‘the LLM will read the wrong number’.

    Why it matters

    Production ingestion pipelines convert HTML to markdown before embedding (S10 Jina Reader, S11 Firecrawl). GFM tables cannot represent colspan/rowspan, cannot nest, cannot hold block content (‘Block-level elements cannot be inserted in a table’), and silently discard excess cells (‘the excess is ignored’) (S8). So a spanned header, a nested table, or a ragged row does not degrade gracefully — it produces a well-formed markdown table containing values shifted into the wrong columns, which the model then reads as fact. Meanwhile WHATWG leaves header association undefined for tables built purely from td (S7), so headerless numeric tables have no machine-recoverable meaning at all. Falsifiable: round-trip the table and compare; the loss is deterministic and reproducible, not a judgement.

    Evidence

    The proposal’s evidence block was mis-pasted: it carried MCP authorization and web-agent sources, none of which touch tables or markdown conversion. The sources the mechanism paragraph actually names are restated here, and each was re-fetched on 2026-08-24 except where a date is given.

    • GitHub Flavored Markdown Spec — tables extension (S8, verified 2026-08-24)
    • GFM tables have one header row, no column or row spans, and no nesting: “Block-level elements cannot be inserted in a table.” For a row carrying more cells than the header, “If there are greater, the excess is ignored.” Neither case is an error. The parser produces a well-formed table with the extra data gone, and that is why the loss is silent.
    • HTML Standard — tabular data (S7, verified 2026-08-24)
    • Header association is defined through th, scope and headers. A table built only from td has no header association at all, so nothing machine-readable names its columns.
    • Jina Reader (S10, verified 2026-08-21) and Firecrawl (S11, verified 2026-08-24)
    • Both convert main content to markdown before it reaches a model — Firecrawl’s own framing is “Turn any website into LLM-ready data”, with “Clean markdown” named as the output. That conversion is the step this audit reproduces: the markdown is what the model reads, not the table markup.

    Falsifiable by construction. The round trip is deterministic — serialize, re-parse, diff — so a disputed finding is settled by running it, not by argument.

    How it scores

    Tier per evidence policy: scored — grade B meets the A/B bar required for scored audits.

    Example failure

    A pricing comparison table uses a two-row header where ‘Monthly’ and ‘Annual’ sit under a colspan=2 th labelled ‘Price’. GFM has no colspan, so the serializer emits a single header row and every price column shifts left by one. The re-parsed grid associates the annual price with the feature-count column. A model asked ‘what is the annual price of the Pro plan’ answers with a seat count.

    Sources