Skip to content

Release gate: citation-roles, support ids reachable from the commit under check (#915) - #916

Merged
amaybaum merged 12 commits into
mainfrom
governance/a42-citation-check-20261024
Oct 26, 2026
Merged

amaybaum merged 12 commits into
mainfrom
governance/a42-citation-check-20261024

Conversation

@amaybaum

@amaybaum amaybaum commented Oct 24, 2026 •

Copy link
Copy Markdown
Owner

Implements #915.

Merge: authorized by the owner (2026-10-26), with the research freeze lifted. The authorization covers the reviewed head 0856dfba, subject to these conditions:

  • integration with current main is verified;
  • all required CI and mutation controls pass;
  • no frozen evidence is modified;
  • any reconciliation changes are reviewed.

Reviewed head: 0856dfba2235ce43e9da35af6dac956da61097c1, tree 0ca0b578. It has eleven commits on main e548b5e1. The final independent review is ACCEPT WITH NITS at 0856dfba.

Up-to-date head: a4c7db8d14551b1456d08b8b329eb13ef0e7a3b4, tree 854adac0. It is an ordinary merge commit, first parent 0856dfba and second parent main 83d1da1b, made because the ruleset requires branches to be up to date.

  • It resolved no conflicts, so there are no reconciliation changes to review.
  • git diff main a4c7db8d is byte-identical to the reviewed change set git diff e548b5e1 0856dfba: the same two files, tools/citation_roles_check.py (new) and tools/release_gate.py (+18).
  • It modifies no frozen evidence: no record, receipt, seal or legacy file changes.
  • Its tree equals the landing assessment's trial merge.

Checks at a4c7db8d:

  • Release gate: every step passes except lean-axioms, which needs lake and runs in CI. The passing steps include:
    • legacy-records: 303 intact;
    • v3-receipts: 52 hold;
    • citation-roles.
  • The checker's self-test passes. It covers:
    • 61 mutants;
    • 9 positives and 3 negative controls;
    • 6 landing and 3 submodule cases;
    • 332 downgrade cases and 4 main-ref cases.

What it adds

  • tools/citation_roles_check.py, new, standard library only.
  • A release-gate step citation-roles in tools/release_gate.py, after v3-receipts.

Opt-in scope. A record is covered when its directory carries a CITATIONS.json.

  • The manifest covers every file beneath it.
  • A manifest fails as frozen-scope if its tree would reach a frozen record:
    • legacy records;
    • verification/receipts/;
    • verification/seals/;
    • a native round's record directory.
  • A manifest nested inside another also fails (nested-manifest).
  • main has no manifest, so the step reports 0 manifest(s).

Manifest (schema version 2). Roles are declared, never inferred.

  • support names its claim (<path>:<line>) and claim_sha256, the hash of that line's normalized text.
  • provenance gives a reason the id is not load-bearing.
  • external names the other repository. Every occurrence of the id must be qualified with it.

Claim records and downgrades. Each support entry is a claim record, and main's records are the baseline, compared one by one.

  • A claim record of main that the commit no longer has needs a matching downgrade record giving from_claim, its hash and a reason.
  • This applies however the record went missing:
    • an entry relabelled, dropped, re-pointed or reworded;
    • its manifest renamed or split;
    • its id deleted from the text.
  • Without a downgrade record, it fails as support-downgrade.

Other failure codes: absent, support-unreachable, external-in-repository, external-unqualified, unlisted, unused, malformed.

  • Support ids must be reachable from the commit under check.
  • Provenance ids are checked for existence when they land.

Review

The review covers the chain 3e0c916d..0856dfba. Earlier rounds blocked on bypasses, which the commits from 5aace97a on close one by one.

The final round ran read-only against the real tree:

  • Downgrade bypasses all fail with support-downgrade:
    • an id dropped, abbreviated or uppercased;
    • a claim moved verbatim, out of scope or into another manifest;
    • a manifest renamed;
    • an entry relabelled in place.
  • Legitimate narrowings pass with a record. The documented exceptions fail closed instead.
  • Must-fail openers and negations all fail. The documented residuals are the exceptions.
  • Self-test:
    • 61 mutants;
    • 9 positives and 3 negative controls;
    • 6 landing cases and 3 submodule cases;
    • 332 downgrade cases and 4 main-ref cases.
  • Targeted mutants: all 11 applicable ones are caught.
  • Adversarial long inputs are all bounded:
    • 400,000 "[" in 0.09 s;
    • 5 MB of prose in 1.3 s;
    • 2,000 retired records in 2.7 s;
    • 300 support ids in 7.8 s;
    • the old quadratic link regex is caught by its bounded-time case.
  • A PR and main give identical results on five test commits. Among them:
    • a claim kept verbatim after a downgrade fails as support-downgrade both ways;
    • 300 legitimate downgrades pass both ways.
  • Release gate: every step passes locally except lean-axioms, which needs lake and runs in CI.

Human review is required by design, and the docstring says so. No syntactic checker can decide whether a rewritten claim keeps its meaning. The checker forces one reviewable record per id, and independent review decides whether a downgrade is justified.

Non-blocking nits:

  • Documented residuals pass with a record, for review to decide. Examples: "If n is anything,"; "It is not clear that" used as a hedge; "as shown by ".
  • Documented fail-closed false positives can be reworded. Examples: "In 3D,"; "On the lattice,"; "It is not known whether"; "For n <= 4:".
  • Self-test time: it takes about 55 s, against the 45 s the docstring states.
  • Follow-up: the per-id git calls could be batched.

Limitations

  • Opt-in only: review still has to require a manifest on a research record that lands.
  • Reachability assumes merge-commit landings, which main uses.
  • The step needs full history; CI uses fetch-depth: 0.
  • The checker cannot judge whether a declared role or reason is honest.

A proposed one-sentence addition to the enforcement paragraph of AGENTS.md §A.42 is not applied here. Its text was never recorded, so it awaits the owner.

🤖 Generated with Claude Code

https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb

claude added 12 commits October 24, 2026 15:24
…nder check (#915)

AGENTS §A.42 items 2-3 were enforced by review alone; no gate step read
reachability, so a research record could land with checkpoint rows supported
only by commits on an unmerged branch.

tools/citation_roles_check.py reads CITATIONS.json manifests (opt-in: a
manifest covers the files under its own directory). Each full 40-hex object id
a covered file cites is declared support, provenance or external. It fails when
a support id is not a commit reachable from the commit under check, a listed id
names no object (provenance ids checked when they land, so a later branch
deletion does not break main), a cited id is unlisted or a listed one unused,
the manifest is malformed, or a manifest would cover legacy records, receipts,
seals or a native round's record directory. 64-hex digests and abbreviated ids
are not read. Standard library only; reuses v3_verifier's Repo and Scratch.

Its self-test builds a synthetic repository and requires each of 21 mutants to
fail with its target code and no other, 5 positive fixtures to pass, landing
semantics to hold, and a negative control: an unrelated failure is not scored
as a kill. It runs before every check, as legacy_records_check's does.

Wired into tools/release_gate.py as step citation-roles after v3-receipts.
Current main carries no manifest and passes unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
…cases (#915)

Manifest schema version 2. Each entry is an object stating something a
reviewer can check: support {claim: "<path>:<line>", claim_sha256}, the
line of a covered file that carries the id and the SHA-256 of its
whitespace-normalized text; provenance {reason}; external {repository:
"owner/repo"}, every occurrence of the id qualified by that repository
(owner/repo@<id> or a github.com URL), and never this repository.
New codes: claim-outside, claim-file-absent, claim-line-mismatch,
claim-hash-mismatch, external-this-repository, external-unqualified.

Support downgrade control. When main's copy of a manifest lists an id as
support and the manifest under check lists it as provenance or external,
the entry must carry downgrade {from_claim, from_claim_sha256, reason}
matching main's support entry, or the check fails as support-downgrade.
Dropping such an id while a covered file still cites it fails too, and
so does removing a manifest whose support ids are still cited from its
directory, or whose claim line stands unchanged anywhere in the tree,
unless another manifest lists them. A downgrade record also fails while
a covered file still has a line with the old normalized hash, so a
claim kept or moved unchanged cannot be relabelled. The record, not the
hash, is what makes a reworded claim's downgrade reviewable; the hash
is an integrity aid and never identifies a claim on its own.

Review findings: main is resolved through real refs in a scratch
repository (origin/main preferred over a stale local main, local main
alone, neither, HEAD equal to main); frozen-scope cases for manifests in
verification/receipts/ and verification/seals/; a support id on the
branch under check but not on main passes; tag and tree ids as support
fail as support-not-commit without a crash; NUL-containing files are
scanned; submodule entries are skipped and are no claim file; negative
controls run on fixtures of their own. Limitations documented: uppercase
and abbreviated ids, compressed or UTF-16 files, symlinks, submodules,
external-in-repository drift on main, commits reaching main without
pull-request CI, no main ref, and records moved out of a manifest's
scope with their claim reworded.

Self-test: 54 mutants each failing with its target code alone, 9
positives, 3 negative controls, 6 landing, 2 submodule, 30 downgrade and
4 main-ref cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
…tions (#915)

Second review of 5aace97: support could be dropped with no record in
seven ways (id removed from text and manifest with the claim kept; id
abbreviated or uppercased on the claim; claim moved verbatim to a
directory without a manifest; claim moved into another manifest's
record as provenance; record kept with the claim moved verbatim out of
the covered tree; manifest renamed). Each is now a self-test case that
fails as support-downgrade alone.

The baseline is every support declaration of every manifest in main's
tree, whatever directory or manifest held it:

- a support id of main that no manifest of the commit lists as support
  needs a record matching that entry, whether or not the id is still
  cited: the downgrade of the entry now listing it, or a record under
  the manifest's new optional top-level "retired" map;
- an entry anywhere in the commit listing such an id as provenance or
  external needs a matching downgrade of its own, unless main's copy of
  that manifest already lists it so;
- such an id's claim must not stand anywhere in the tree, covered or
  not: no line may hash to its claim_sha256, or equal main's claimed
  line once every hex run of 7 or more characters is removed and the
  text case-folded, so abbreviating, uppercasing or deleting the id
  leaves the claim unchanged;
- an id still declared support somewhere needs no record, but main's
  claim of it may stand, in that loose sense, only on lines that still
  carry the id;
- independently of main, no record's claim may stand by its hash.

The whole tree is read once, by one git cat-file --batch, only when
main has a support entry or the commit a record; each distinct line is
hashed once and only lines hitting a target hash are kept (about 5 s on
this repository's tree).

Docstrings and the gate's step text are narrowed to what is enforced,
and state the limits: a genuine rewording with a matching record passes
by design; no syntactic checker can decide whether an arbitrarily
rewritten claim keeps its meaning, so independent review still decides
whether a downgrade is justified; line churn; THIS_REPOSITORY in forks
and renames; the ~10 s self-test.

Expectations changed, each stricter, each with a passing counterpart
added: "support entry dropped with its citations", "record removed with
its claim" and "record moved without a manifest, the claim reworded"
passed and now fail as support-downgrade without a record.

Self-test: 58 mutants, 9 positives, 3 negative controls, 6 landing, 2
submodule, 60 downgrade and 4 main-ref cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
Third review of 39c6b0c (BLOCK) and the owner's direction: a check that
passes a pull request must not fail on main after it lands, and claim
matching must be anchored to identifiable claim records.

Design. Each support entry is a claim record: manifest, id and claim,
identified by claim_sha256 (moving the same text to another line keeps
it). Main's records are the baseline, compared one by one with the
commit's. A record the commit no longer has, at the same manifest, id
and claim hash, needs a record matching it exactly (keyed under its id,
repeating its claim and hash): the downgrade of the entry now listing
the id, or one under "retired", which now maps an id to a list of
records and may overlap a support entry of the same id, so a reworded
claim can retire its old record. This covers relabels in place while
another manifest still declares the id support, drops, re-pointed or
reworded entries, records moved to another manifest, and manifests
removed, renamed or split. An entry relabelled in place needs its own
matching downgrade; another manifest newly listing a downgraded id as
provenance or external needs one too.

A downgraded record's claim must no longer stand: no line anywhere in
the tree may hash to its claim_sha256 (except lines a support record
of the same claim claims), and no paragraph of a file under the
record's own directory may state main's claimed line with the id's
slot empty or holding an id no record declares support. That anchored
comparison joins blank-line paragraphs, applies NFKC, drops format
characters, removes hex runs of 7+ characters and 4-6 character hex
words that mix digits and letters or begin a support id, case-folds,
treats the word or brackets next to the id as part of the reference,
and needs three words of claim besides it. Records also fail,
independently of main, while their claim stands verbatim.

Every test that compares with main finds nothing when main is the
commit, and the others read the commit's tree alone, so a green pull
request stays green once merged. The tree-wide loose search and its
claim-ambiguous code are removed.

Expectations changed, each stricter under the per-record baseline,
each with a passing counterpart that carries a record:
- "record moved, still support" now fails without a retired record:
  moving a record to another manifest retires the old one;
- "support kept, its claim moved and rehashed" (entry re-pointed to
  another line's claim) now fails without a record;
- "still support, the claim reworded with its reference" now fails
  without a retired record for the old claim;
- "retired, the id removed and the claim reworded" ("The bound holds."
  from "The bound holds at <id>.") now fails: deleting the reference
  phrase with the id leaves the claim standing (review case N10).
The retired format changed from one record to a list per id; the
fixtures were updated to it.

Self-test: 61 mutants, 9 positives, 3 negative controls, 6 landing, 2
submodule, 102 downgrade and 4 main-ref cases, including the review's
reformatted, multiline and shortened-reference claims, a relabel in
place while the id is support in another manifest, JSON-field and
list-item claims checked as main after landing, and one case per
previously surviving mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
…#915)

Fourth review of 5d7f302 (BLOCK).

A downgraded claim record's anchored comparison accepted, as the claim's
reference, any id declared support anywhere in the tree: a global
relationship between commit ids. A position that held the id now counts
as referenced only when it holds an id that a current support record
claims on a line of that same paragraph, in the same file. The "counts
as a re-pin" limitation is removed.

The claim's reference is one optional slot: a run of reference tokens
(brackets, quotes, backticks and @ # : =; the words at, in, per, see,
commit, cf and via; full ids; a -suffix). Sentence punctuation stays
part of the claim. Markdown links reduce to their text and the full ids
in their url. Line breaks inside a paragraph are kept, the claim's words
match across any whitespace, and the literal prefilter is the claim's
longest word. When main's claimed line is a full sentence, a match must
begin a line, a paragraph, a sentence or a quoted or bracketed text, so
a narrowing written as a leading condition, and a negation, are new
statements. The forms the slot reads are named in the docstring; any
other phrasing reads as a new statement and, without a record, still
fails as a missing record.

Docstring: the comparison is stated as enforced; the limitations add
references outside the slot's tokens, ids cut below 4 characters,
statements embedded after a comma, a landed record deleted later, two
changes failing together on main, and a self-test of about 15-20 s.

No expectation changed. New cases: an id supported only in another
manifest as replacement; a reflowed claim whose id is still support in
another manifest; a condition put first and a negation (pass, with a
record); a claim reflowed in a subdirectory; a word ending in a
non-sentence claim's first word; a support record claiming the old
line under another hash; a two-word claim, compared by its hash alone;
a replacement whose support record claims another paragraph, or that is
supported elsewhere beside another id's support; a re-pin through a
markdown link (pass); a claim restated as a list item; seven reference
forms of the slot.

Self-test: 61 mutants, 9 positives, 3 negative controls, 6 landing, 2
submodule, 122 downgrade and 4 main-ref cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
…dentifier references (#915)

Focused re-check of 1267c84 (narrow BLOCK).

Sentence anchoring regressed against 5d7f302: a downgraded claim kept
verbatim after a label colon, after a semicolon, or in a markdown table
cell passed with a record. A statement now also begins after ':', ';'
and '|'. A condition put first, "if ..., then ..." and a negation still
read as new statements.

The reference slot follows one rule instead of a word list: reference
punctuation, the connectives at, in, per, see, commit, cf and via, any
identifier-shaped token (one holding a digit or / # @: a url, a run or
pull-request number, a short id), optionally after one label word, a
hexadecimal word of 4 or more characters, and a -suffix. A reference
replaced by "run #12345", a pull-request url or a markdown link to a
pull request, or reworded to "from <id>", reads as the claim standing.

The slot is no longer a regex. Regexes locate only the claim's fixed
pieces; the text between two of them, where an id stood, is checked in
Python as at most 8 whitespace-separated chunks within 300 characters.
A first regex version of this rule backtracked catastrophically on long
identifier-shaped lines (a self-test of minutes, a probe that did not
finish); the chunk check is linear, and a self-test case now bounds a
check over such lines at 10 s. Claims that begin or end with their id,
and two ids side by side, are read as before. Stripping words that begin
a support id is removed: the slot reads short and letter-only ids by
itself. Ids inside a claim's own words are still not compared.

A re-pin's support record must claim a line of the matched statement
itself, not any line of its paragraph. Line breaks map exactly between a
file and its normalized text for this: emptied lines are no longer
collapsed, and the claim's words match across any run of whitespace. A
re-pin on a wrapped claim, its record claiming the statement's second
line, still passes.

Compared with 5d7f302 on the reviewer's scen5.py, only the intended
narrowings (L3, L4, "if ..., then ...") and statements opened by a word
and a comma or by a conjunction ("Indeed, ...", "Moreover ...") pass
where it failed; the latter are named in the Limitations, with a
condition introduced by a colon now read as a label.

No expectation changed. New cases: a label colon, a semicolon and a
table cell (fail); "if ..., then ..." (pass); a run number, a
pull-request url, a url without digits, a markdown link to a pull
request, a letter-only short id, an ellipsis and "from <id>" (fail); a
re-pin record claiming another line of the paragraph (fail) and the
statement's second line of a wrapped claim (pass); a claim split around
a line holding only a short id (fail); a reference moved to the next
paragraph and a word continuing a non-sentence claim's last word
(pass); re-pins of claims beginning or ending with their id and of two
side-by-side ids (pass); long identifier lines (fail, linear time); a
re-pin on a line after one holding only a short id (pass); an id
inside the claim's words changed, uppercase or short (fail); another
id's support record on the statement's own line (fail).

Self-test: 61 mutants, 9 positives, 3 negative controls, 6 landing, 2
submodule, 146 downgrade and 4 main-ref cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
)

Re-check of b303881 (BLOCK on two of the owner's acceptance criteria).

Introductory wording. A downgraded claim kept after an opener ("Indeed,",
"Moreover", "Thus,", "We find that", "It follows that", ...) passed with
a record. The claim now stands after any prefix within its statement
unless the prefix holds a restrictive operator: a conditional,
restriction, exception or negation from a closed set, a quantity written
as a word, a digit or comparator, or a parenthesized named condition
such as "(C2)". Full ids in the prefix are not counted as digits. The
prefix runs back to a paragraph break, a sentence end, a colon, a
semicolon or a table bar, or to a line break that begins a block, at
most 300 characters. The rule applies to every claim, fragments
included. All 20 openers the review tried fail with a record; all 14
narrowings pass, "In dimension three," included through the number
words. The residual risks are named in the Limitations.

Adversarial long inputs. The markdown-link regex rescanned from every
"["; it is now [^\[\]\n]* for the text and [^()\[\]\s]* for the url. A
statement's prefix is read backwards within 300 characters instead of
by a regex over everything before it. Line numbers come from bisection
over positions built once per file, where each candidate had counted
from the start of the file. The reviewer's dos.py and dos2.py probes
all finish in milliseconds; two self-test cases bound a 100,000-bracket
line, and a 40,000-character marker run before 200 narrowed statements,
at 10 s each. The docstring states the cost as it is.

The eight-chunk limit on a reference slot is removed: the 300-character
window bounds its cost, and the limit only let a reference padded with
nine or more chunks escape. A slot still ends at a paragraph break:
read past one, line numbers in the next paragraph would be off by the
blank line, and a claimed line there could be taken for the
statement's; two cases (a claim ending, and one beginning, with its id,
a three-line reference paragraph after or before it) pin this.

Limitations name the value-in-reference false positives ("at T=300",
"at n=4", "in 3D", "via Lemma 2", "For n <= 4: ...").

No expectation changed. New cases: the 20 openers (fail); the 14
narrowings and "In 3D,", "At T > T_c,", "With (EM)," (pass); openers
citing another commit, and negations in the paragraph or sentence
before, before a colon or semicolon, in the table cell before, and on
the line before a list item or in a heading (fail); a negation on the
line before in the same sentence and a fragment claim after a negation
(pass); a ten-marker reference slot (fail); a claim ending with its id
with the reference in the next paragraph (fail); a re-pin in a second
paragraph (pass); the two long-input bounds.

Self-test: 61 mutants, 9 positives, 3 negative controls, 6 landing, 2
submodule, 200 downgrade and 4 main-ref cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
…ass (#915)

A statement's prefix narrows it only by a closed rule: the word
"conditionally" or "conditional"; a comma clause that begins with a
conditional or restriction word (or "at"/"in" with a comparator) and
holds a bound (a comparator, a parenthesized named condition, a
one-letter variable other than "a"/"i", a labelled token such as "h1",
or a number word); or a prefix ending in "that" after a negation in
its last clause. A digit alone, "above"/"below" and operator words
used idiomatically no longer narrow. A leading enumerator ("(i)",
"a)") is skipped. "In 3D,", "In dimension three," and "On the
lattice," now fail closed; their self-test expectations change from
pass to support-downgrade, as documented in Limitations.

The verbatim test indexes the lines carrying any record's id by hash
in one pass over the tree, instead of scanning the tree per record;
rule A looks records up in a set; main's claimed blobs are read once.
The docstring states which tests are linear and which are not.

Self-test: the reviewer's 20 openers, the gaming case, "(a)", "(i)"
and others must fail; enumerated, quoted and listed narrowings must
pass; the 300-character prefix and slot bounds are pinned by a
semantic case and two 5,000-statement timing cases; 5,000 records of
one id are checked in bounded time; a line holding its id inside a
longer hexadecimal run, or after another record's id, still stands;
earlier sentences, questions, colons, semicolons and list lines that
open with a condition do not narrow the next statement; two claims
downgraded in two files are each compared; a record beside a
submodule entry is checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
A prefix ending in "that" narrows its statement only when its last
clause holds "false", or a negation followed within three words by an
assertion word from a closed set (shown, established, proved, proven,
known, true, case, claim, claimed, clear, demonstrated, supported,
confirmed, derived, settled, hold, holds, valid, correct). Negation
idioms that affirm the claim ("There is no doubt that", "It cannot be
denied that", "No one disputes that" and six more) now leave it
standing. "With" narrows only with a comparator or a named condition,
as "at" and "in" do with a comparator.

Self-test: the nine idioms, "Nobody doubts that", "With x in hand,",
"In (A1),", "Like the run for h1,", "It is not clear why" and others
must fail; "It is not established/true that", "It has not been proved
that", "It is not the case that" and "With n = 3," must pass. A bare
"Not that" before a fragment claim moves from pass to fail-closed
under the closed assertion set; "It is not true that" in its place
passes. Records of two ids with only one claim standing, in both
orders, pin that the verbatim index reads every record id. "In 3D,"
and "In dimension three," stay fail-closed and documented.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
)

The clause before a final "that" narrows its statement only when it is
exactly one template of NEGATED_ASSERTION: "it/this is/was not <A>" or
"... no longer <A>", "it/this has/had not been <P>", "it/this cannot be
<P>", "it/this is/was not the case", "it/this is/was false", "<S>
does/do/did not claim", "<S> no longer claims", "<S> cannot claim",
"<S> makes no claim", "<S> is not a claim", "no claim is made" and
"what is not <P> is", with A and P closed assertion words and S one of
it, this, we, or the/this paper, note, record, round, framework,
section, text, document, result. One negation, no limiter, nothing
added; anything else before "that" leaves the claim standing.

This replaces the open negation-plus-assertion-word clause, which read
"It is not only true that", "It is not merely the case that", "It is
never false that" and "It is not false that" as narrowings. Against
the reviewer's limiter-and-parity patch, the template list also fails
"It is not less true that" and "Not everyone has shown that", and
fails closed on "It is not yet shown that", "Thus it is not shown
that" and other subjects ("The referee does not claim that"), as the
docstring now states.

Self-test: the affirmative forms, "It is not only clear but also shown
that" and "It is not clear but certain that" must fail; the reviewer's
genuine negated assertions and the self-subject claim forms ("It does
not claim that", "No claim is made that", "What is not established is
that", "Indeed, it is not shown that") must pass. The docstring states
a self-test time of about 45 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
"It was not established that" joins the must-pass narrowings, so the
"was" alternatives of NEGATED_ASSERTION are exercised by the self-test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
…conflicts)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
@amaybaum
amaybaum marked this pull request as ready for review October 26, 2026 05:35
@amaybaum
amaybaum merged commit 61930e9 into main Oct 26, 2026
26 checks passed
@amaybaum
amaybaum deleted the governance/a42-citation-check-20261024 branch October 26, 2026 05:45
amaybaum pushed a commit that referenced this pull request Oct 26, 2026
…e2db4)

r4 re-bases the site references and fidelity notes to main 52e2db4
(after #925-#928, #916 and #930), records each fidelity note as fixed,
changed or open with its fixing commit, adds F28 (fixed by #930) and the
candidate F29, and applies first-hand full-text reading: the XOR example
is known (RHP 2014 Eq. 15), C3 has full-text support, the divisibility
credit is RHP 2014 Thm 2.4, C4 and C5 stay partly verified, and C8-R
stays a candidate with no priority sentence. Unread primary texts are
listed with the reason each was not read. Correctness and originality
are recorded separately.

Retained: AUDIT-r3.md (byte-identical to the committed r3),
AUDIT-r4-prerecheck.md (the object the re-check read) and
review/RECHECK-r4.md (ACCEPT WITH NITS; its R1, R2 and nits applied).
The parent README's carried-forward findings are updated to their
current status. No PDFs or extractions are committed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013T6pfKuv5mi3MXtKjH2tZb
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.

2 participants