Repository navigation
A table is the stretch of page that every row of it leaves empty - #18
Merged
Merged
Conversation
Tables reports the grids a page's text lines up into: the capability behind
BentoPDF's extract-tables and pdf-to-csv, which nothing in the fleet had.
A column boundary is a stretch every row leaves empty. The first line of a
block proposes its own gaps, each line after it subtracts whatever it draws in
them, and a line that leaves nothing closes the block.
Subtraction and not the intersection of the lines' gaps, which is where this
started: a cell whose text wraps leaves a line with one piece of text on it and
so with no gaps of its own, so intersecting ended the table there. A four-row
table with one wrapped cell came back as two tables of two rows.
Three things are not columns, each found by running this over real documents
rather than over a fixture, and measured on one 213-page document as each went
in: 588 tables, then 213, then 83, then 40.
a bullet a bulleted list IS a two-column grid; what tells
them apart is a column that says the same thing
wherever it says anything
a column nothing was that is a stretch of page nothing was drawn in,
drawn in which is what a boundary already is
a line far below a page number draws nothing in any boundary, which
is exactly what a row of a table does
The forty are that document's Code/Intitule pairs. A 3-page prose report in
the same run reports none, which is the control.
100% of statements with no uncovered blocks, 31 mutations caught, and the new
entry point added to the fuzz target: 7.2M executions, no crash. Said in the
README: ruled lines are not read, so this is the text strategy only, and a page
in two columns of prose is a grid too.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Oct 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tablesreports the grids a page's text lines up into — the capability behindBentoPDF's
extract-tablesandpdf-to-csv, which nothing in the fleet's 2033repositories had.
A page holds no table. It holds text put at places, and a table is what a
reader sees when those places line up, so this reports an inference and
there is nothing in the file to check it against.
The one decision
A column boundary is a stretch of the page that every row of the table leaves
empty. The first line of a block proposes its own gaps, each line after it
takes away whatever it draws in them, and a line that leaves nothing closes the
block and begins the next.
⛔ Subtraction, not the intersection of the lines' gaps — which is where
this started. A cell whose text wraps leaves a line with one piece of text on
it and therefore no gaps of its own; intersecting with nothing ends the table,
and a four-row table with one wrapped cell came back as two tables of two
rows. Subtracting asks the question that was meant all along — is anything
drawn there — and a wrapped line sitting inside a column draws nothing in the
boundary beside it.
Three things that are not columns
Each was found by running this over real documents, not over a fixture.
CNRSrepeated down a column is data and is kept.Measured on one 213-page document as each went in:
The forty are that document's
Code/Intitulépairs, one per jobdescription, second cells wrapped. A 3-page prose report in the same run
reports none, which is the control: a detector that cannot say no to a
paragraph says yes to every page there is.
⛔ What it does not do, said in the README
Ruled lines are not read. This is the text strategy — the one a bordered
table does not need — so a table whose columns are held apart by rules rather
than by whitespace is not found. And a page laid out in two columns of prose is
a grid too; what saves the ordinary case is that prose does not stay out of its
gutter for long, since one full-width line closes the block.
How it is checked
100% of statements with zero uncovered blocks in the profile, and 31
mutations run against it — every one caught except two that are equivalent
rather than uncovered, and the code says which and why. The new entry point
went into the fuzz target, since it compares coordinates the document chose and
a comparison is the one operation that will not complain about an infinity:
7.2M executions, no crash.
Two instrument failures on the way here, both worth naming: a uniform result
across heterogeneous mutations is a broken instrument, and I got the opposite
uniform answer twice — once because the binary path was a directory, once
because zsh does not word-split an unquoted variable, so
mutatereceived oneunexecutable argument. The run that counts is calibrated against a mutation
that must be caught and one that must survive.
🤖 Generated with Claude Code