Skip to content

v0.36.2

Choose a tag to compare

@skymanbp skymanbp released this 05 Sep 02:27
· 5 commits to main since this release

An external review of v0.36.0/v0.36.1 (Codex gpt-6-astra at maximum
reasoning), every finding verified first-party before it was acted on; the
record is docs/audits/codex-review-2026-09-04.md.
Fifteen defects, six root causes, and one measurement the fixes reopened.

The manuscript side never let a subsection inherit its section

deai_metrics carried a second section parser beside extract_sections: no
whitespace before the brace, no optional argument, and a subsection whose title
matched no bucket fell to unknown and was silently unmeasured — 344 of the
540 paragraphs of one held-out Planck paper — while the corpus side has
inherited since v0.28.0. section_units now derives from
extract_sections.RE_SECTION with the same inheritance; a document with no
heading is one unit, the preamble is none. Measured on the same 203 held-out
papers in one process: salience 2,753 → 4,473 findings, 0.2776 → 0.4542
per scorable paragraph against the 0.2710 design rate (§17.5 records the
excess as open; the reference banks were bucketed the same way); cohesion
10.87% → 10.81% and hedging in intro 7.89% → 7.80%, unchanged; the mentor
population's salience 0.2781 → 0.3984.

One paragraph sweep, one line-preserving blanker

Four tools projected the manuscript line by line where the corpus side
projects a passage in one pass. extract_sections.blank_preserving is the one
blanker (a match becomes same-length spaces, newlines kept) and
deai_reference.paragraphs the one paragraph sweep; structure, oracle, voice,
register, residue, metrics and the labeller read them, so a heading, a float
or a citation split across lines is blanked on both sides.

Rates per body prose word, and no AUC from two documents

eval_findings divided by text.split() over raw source — bibliography and
preamble included, which a single-file machine draft has none of — and an
axis whose novelty was NaN on all but two documents still reported an AUC.
The denominator is prose_words(body_only(text)), placeholders dropped; fewer
than 20 scorable documents is unmeasured. The same findings re-read:
register 57 findings 0.0247 → 0.0371 per 1,000 (AUC 0.392 → 0.391),
zero-hit 2.212 → 3.374 (AUC 0.246 → 0.174), collocation AUC 0.691 →
0.704, salience AUC 0.774 → 0.572 (with the bucketing fix above).

Assembly is one module, and the gate counts prose

tex_assembly.py: an \input mid-line keeps the words around it, a second
call splices again (only a child in the current include stack is a cycle), and
a --git-ref baseline is the document assembled at the reflength_gate
had compared an assembled draft against a bare root. The gate counts prose
words (no [math]/[FIGURE-OR-TABLE] placeholders) and reads
--require-shrink as a percentage, a fraction or a word count, rejecting
100%, 0%, inf and 30%% and rounding a fraction up to one word.

The removal map counts each unit once

A sentence that was both a restatement and zero-gain, or that sat inside a
removed paragraph, was budgeted twice; a canonical home may no longer drop a
negation, a comparative or a number its copy carries; an opener is a
whole-sentence removal only when at most three of its own content words would
go. Held-out default target median 3.08% → 1.59% of prose (§23.5).

Residue: marks across lines, and the procedural we have added

Edit-meta marks are scanned over the visible body as one text, so a phrase
wrapped at a line break is one mark; once visible, we have added fired
fourteen times on refereed prose, every one a procedure (we have added uniform Gaussian noise) or another paper's history, so it is a mark only with
a document object. The diff rule compares whole negated objects and skips a
negation the old version already carried. Strong residue 34 → 27 of 203
papers (16.7% → 13.3%; §23.4).

Register, collocation, labelling, validator

Citations are blanked across lines and macro definitions matched at line
start; a defined term's scope is its sentence. Collocation pairs break at /,
. and digits, the weights are named for what they are (expected_copresent_passages,
p_copresence_absent), scope and calibration unit are sentence, and the
bank is rebuilt (541,309 → 530,677 pairs). The labeller's control sample
excludes any passage a finding touches by line span. validate_plugin gains an
eleventh check: no tracked file past the 750-line budget. Standard and skill
text corrected where they had drifted from the code (zero-hit exemptions,
the paper-agent example, the modifier-stack definition, the restatement
rule). 491 tests in 24 files; §23, §17.5, §19.4, §21 and both README
limitation tables re-taken.