Skip to content

Review/decisions 66 67 - #52

Merged
ethos-pramaan merged 2 commits into
mainfrom
review/decisions-66-67
Oct 14, 2026
Merged

ethos-pramaan merged 2 commits into
mainfrom
review/decisions-66-67

Conversation

@ethos-pramaan

Copy link
Copy Markdown
Contributor

No description provided.

docushell-dev added 2 commits October 13, 2026 17:39
…sion #66 — point-labels-v1, bar-labels-v3

Told "Charts, round 3", the 846 chart points that print their value and
still failed were read for why: 284 on pages whose bars the bar rule never
found (lines, pies, charts drawn as images), 328 on pages whose bars it
refused, 234 on pages whose table missed them, each reason small. Shown
that each bar fix moved about a page, the owner chose "Build the
line-chart rule"; shown the prototype at a third of the estimate, "Port
what's measured"; shown the opendataloader-bench cost, "Ship, accept the
trade".

point-labels-v1 (new crate module lines.rs, docs/32 §9), under a new
profile field table_detection.lines (office profiles:
not-run-for-this-format):

- A series is a stroked line of three points or more rising left to
  right, not level, or a run of three small marks of one colour and size;
  a line drawn over a series already read (through its marks, or itself
  drawn twice) is that series.
- Each number goes to the one point it is set over, under or beside,
  over every series at once, and is no one's where another series' point
  stands nearly as near (1.5x and a third of a point). A year is never a
  value. A number set on a bar is the bar's.
- A series keeps its numbers where six points in ten carry one and a
  point higher on the page never carries a smaller number; its categories
  are the first row of labels under the plot (one label under eight points
  in ten, at most half numbers but years).
- Series sharing that row are one table, named by their legend swatches
  (a small mark or a short level stroke) or, alone, by the title over it;
  runs after bar-labels-v3 on runs no table holds, under the tracks rule's
  gate, kept only where it overlaps no table.

The interpreter carries the stroke colour (G, RG, K, SC, SCN, reset by CS,
saved by q) and records each stroked subpath's points and each small
filled mark with its colour; only the line rule reads them, and every
existing rectangle and segment reads as before. bar-labels-v2 -> -v3: the
title over a chart names the one series that prints numbers, whatever
else is drawn beside it (a progress bar's track). The bar rule's table
builder is shared, its id a parameter. profile_sha256 3e5e6b07... ->
3976f966....

Tests: ten for the line rule (a table; order and cover guards; two lines
with a legend; a number as near two lines is neither's; a line through
its marks; years at points; numbers on bars; a line turning back or
level; a number beside its point; a line drawn twice and a numeric row
under the plot), two for the interpreter (stroked lines with their
colour; small filled marks), one for bar-labels-v3. Nineteen mutations
over the rule's clauses, the interpreter's capture and -v3's title are
killed; a twentieth showed an explicit dedupe of identical lines
redundant with the already-read check, and it was removed (tables
identical on 1,226 pages).

Measured: ParseBench charts 0.1184 -> 0.1248, 7 pages up and none down
(She-figures p88 and E-Government_Survey p78 0 -> 1.0); tables, content,
formatting and visual grounding unchanged on every page; overall 46.29 ->
46.42. Seventeen line tables, none on a table or text page; the gate
documents' tables unchanged; every cell its runs' text. The trade:
opendataloader-bench 01030000000078's line reads right as a table, and
its ground truth's loose labels move that document's NID 0.8786 -> 0.8099
and TEDS 0.8667 -> 0.7086 (bench NID 0.8841 -> 0.8838, TEDS 0.5339 ->
0.5301), as decision #42's bar tables did. Not used: rounded bars,
panels merged across a shared category axis, a series named by a label
set on its line.

Signed-off-by: docushell-dev <hello@docushell.com>
…its words where the page set them apart, decision #67 — line-units-v5

Told "Grounding: text, round 2", the Text elements ParseBench's visual
grounding could not place were counted by how our items sit on them:
split across several of ours 811 (0.051 of the score), nothing of ours
over them 520 (0.032: pages drawn as images, figure regions, panels read
as ruled tables), one item of ours far bigger 483 (0.023), ours covering
under half 182 (0.015). The largest split was a page the reading order
did not divide: a line was every run on its baseline across the page,
read where its first run was, so a newspaper paragraph sharing its
baselines with a byline in the next column was read where the byline
was and fell into five units.

line-units-v5 (units::lines_read, units::spaced):

- Each line is cut into its pieces before any unit is read, and a line
  as the units read it is the pieces of one line that follow each other
  in reading order: a baseline the reading order reads in two places is
  two lines, each read where it is read.
- The text the list-marker clause and the first word are read from has a
  space wherever two runs' boxes stand a tenth of the line's height apart
  or more (SPACE_GAP_TENTHS): a page that sets its words by moving its pen
  draws no space, so a bullet set apart that way opened no list item, and
  the hard-break cut read a line's whole width as its first word.

Profile: layout_unit_rule line-units-v4 -> -v5, so profile_sha256 moves
(sha256:3976f966... -> sha256:e0ffb37d...), and LAYOUT_UNIT_RULE_V5 is
exported.

Tests: two unit tests (a line read in two places is two lines and its
paragraph one unit; a gap of a tenth of the line high reads as a space,
the boundary, an unboxed run, no height, and the first word it gives),
and one end to end on four pages built in the test that the reading
order does not divide (a paragraph beside a byline drawn first is one
unit; beside a bulleted aside drawn first it is one unit and each
bullet an item; bullets set apart by position each open an item; a
contents list set word by word is cut before the entry whose first word
fits twice). Ten mutations -- one line for all, every piece a line, a
baseline read whole as -v4 read it, a read line boxed over its whole
baseline, the marker and the first word read as written, a tenth
exactly read as no space, spaces read on a line with no height, the gap
read from the first box, a quarter for a tenth -- all killed; the
boxed-over-baseline one survived the first three pages, the short-line
and hard-break cuts covering for it there, until the aside's was added.

Measured on ParseBench, with the shipped build: visual grounding 0.5435
-> 0.5575, 119 pages up and 8 down; content one page up by 0.0003;
tables, charts and formatting unchanged on every page; overall 46.42 ->
46.70. opendataloader-bench, the fabrication check and the gate
documents' tables cell for cell unchanged.

The trade, taken by the owner: the across-columns line gave each unit a
far right edge, and that edge cut some units by accident -- a contents
list's entries (Marico_Annual_Report_FY24 p4, twice in the set), a
paragraph's last line, a label's -- which now join; basf p17's ground
truth keeps a bullet list as one block, now a unit per bullet; one
chart's labels join the text beside it, so its picture holds none.

Measured and not used: the lines alone (0.5546, 109 up and 12 down); with
the bullets but the first word as written (0.5561); the space at a
quarter of the line's height (0.5564) and at a twentieth (0.5577, 2 up
and 2 down against a tenth, so the tenth stands).

Signed-off-by: docushell-dev <hello@docushell.com>
@ethos-pramaan ethos-pramaan self-assigned this Oct 14, 2026
@ethos-pramaan
ethos-pramaan merged commit 550d073 into main Oct 14, 2026
33 checks passed
@ethos-pramaan
ethos-pramaan deleted the review/decisions-66-67 branch October 14, 2026 08:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant