docs(accounting): record the operator's two decisions of 2026-09-17
The content accounting stays OPT-IN until the losses it reports on the reference corpus are fixed; a default-on door would fail builds that pass today. Of the three exceptions the gate proposed, only the PDF one (heading, paragraph, table) is approved. Approving it moves no number, because no witness counts a heading in a PDF: what it changes is that the gap is a stated limit of the instrument rather than an open question about the build. An image in a workbook, or in md/txt/csv/json/odt/rtf, stays unaccounted and therefore stays red. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
230d1cbccd
commit
751441c17d
5 changed files with 50 additions and 15 deletions
|
|
@ -100,19 +100,20 @@ RED = "RED"
|
|||
SKIPPED = "SKIPPED"
|
||||
DIAGNOSTIC = "DIAGNOSTIC"
|
||||
|
||||
#: Exceptions the operator has approved, by (suffix, element). Empty: the
|
||||
#: first time an exception arises it is the operator's to approve.
|
||||
APPROVED_EXCEPTIONS: frozenset[tuple[str, str]] = frozenset()
|
||||
#: Exceptions the operator has APPROVED, by (suffix, element), with the date.
|
||||
#: Approving one does not move a number here: the witness counts no such
|
||||
#: element in the first place, which is the whole reason the exception exists.
|
||||
#: What approval changes is that the gap is now a stated limit of this
|
||||
#: instrument rather than an open question about the build.
|
||||
APPROVED_EXCEPTIONS: frozenset[tuple[str, str]] = frozenset(
|
||||
{(".pdf", "heading"), (".pdf", "paragraph"), (".pdf", "table")}
|
||||
)
|
||||
|
||||
#: When, and by whom.
|
||||
APPROVED_ON = "2026-09-17, operator"
|
||||
|
||||
#: Exceptions this gate PROPOSES. Listed in every run; none of them is applied.
|
||||
PROPOSED_EXCEPTIONS: tuple[dict[str, str], ...] = (
|
||||
{
|
||||
"suffix": ".pdf",
|
||||
"element": "heading, paragraph, table",
|
||||
"reason": "a PDF without a structure tree declares none of them, so no "
|
||||
"witness can count them; the witness counts pages and image placements",
|
||||
"carried_instead": "the page text, with headings recovered by rule",
|
||||
},
|
||||
{
|
||||
"suffix": ".xlsx",
|
||||
"element": "image",
|
||||
|
|
@ -633,7 +634,9 @@ def render(rows: list[Row]) -> str:
|
|||
f" - {item['suffix']} {item['element']}: {item['reason']}; "
|
||||
f"carried instead: {item['carried_instead']}"
|
||||
)
|
||||
lines.append(f"approved exceptions: {len(APPROVED_EXCEPTIONS)}")
|
||||
lines.append(f"exceptions approved ({APPROVED_ON}), and none moves a denominator:")
|
||||
for suffix, element in sorted(APPROVED_EXCEPTIONS) or [("(none)", "")]:
|
||||
lines.append(f" - {suffix} {element}")
|
||||
failing = [str(r.number) for r in rows if r.fails]
|
||||
lines.append("")
|
||||
lines.append(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue