fix(extraction): a log naming writing with no verb is a contradiction, not a blank page (#438)
`contentAffirmed` finds an affirmation by handing a name for text the verb that
predicates over it, and `affirmingReach` returns -1 when the statement has no
verb — so `Page is blank. handwriting smudges only.` delivered a page with
writing on it as empty, and seven of the thirteen wordings #435 measured were
fragments of that shape. `PREDICATED` existed for exactly this construction and
was reachable only from the denial reads, so nothing in the affirmation path
consulted it.
`verblessAffirmation` reads the fragment on its own, bounded three ways because
the risk here runs OPPOSITE to every other read in that section — 94 of the 204
blank declarations on record contain a verbless statement, and every one of them
is a denial:
- the noun phrase must OPEN its statement, which is what keeps `Devoid of text.`,
`Lacking text.`, `Free of text.` and `Empty of text.` blank (`devoid` and
`lacks` are deliberately outside `NEGATIVE_COMPLEMENT`);
- a comma on either side of the noun is a boundary — and that bound caught a real
regression mid-change: `vetoScope` strips the marks phrase and the `not legible
text` phrase out of the scope this reads, so the corpus log `A few specks, not
legible text, figures, captions visible.` arrives as `A few figures, captions
visible` with its negators already gone;
- forward, only a `PREDICATED` word or the end of the statement, optionally past
a closer.
Measured: all 4,153 distinct page replies on record replayed through
`blankDeclaration` before and after, each with its own `html` and `log` — 204
blank declarations, 0 moved on `asserted`, `blank` or `affirmed`. Constructed,
7 of 7 wordings now refuse the declaration, 6 of 6 blank fragments still declare,
20 more blank wordings hold, and 10 corpus-verbatim fragments hold.
Four review rounds. Round 2's finding was a regression I introduced in round 1: a
`tokens.length === 1` guard for a bare label also refuses #435's own noun phrase,
because after the marks strip one token is not one word (`Handwriting smudges.`
arrives as `handwriting`). Reverted, with both halves of the trade pinned beside
each other. Left standing and pinned rather than silently accepted: the locative
tail, a denial standing behind its noun, `Blank apart from a caption.`, bare
`marks`, and the one-token statement — the last two filed as #439 and #440 with
their measurements.
Co-authored-by: bbertucc <46652+bbertucc@users.noreply.github.com>