docs: replace the fabricated NC State affiliation with URI, and gate the class - #297
Conversation
…the class README.md's academic acknowledgement asserted "bioinformatics coursework at NC State". SESTRAV has no connection of any kind to NC State. The institution was fabricated rather than mis-copied: the line it replaced named no institution at all, so a documentation-hygiene pass titled "de-course-ify the docs layer" invented a proper noun that had never appeared in this repository. It reached main as ee780a5 (PR #147, 2026-07-23) and stood in the public README for roughly five weeks. Every affiliation record in the repo already said University of Rhode Island and all of them predate the fabrication: CITATION.cff (all six author entries), MAINTAINERS.md, LICENSE, SECURITY.md, docs/zenodo_deposition.md, and README's own foundation-team heading seven lines above the false line. Second independent instrument, per .claude/rules/git-instruments.md: the unmapped git log --no-use-mailmap --format='%ae' --all returns 12 commits authored from @uri.edu and zero from any NC State domain. Recorded as D35 in docs/claims_register.md. This is instance #7 of the class in .claude/rules/third-party-claims.md and extends it twice over: it is a claim about SESTRAV's OWN affiliation, so a sweep for competitor names could never have found it, and it is a fabricated proper noun rather than a distortion of something real. It also repeats the class's most durable pattern for the third time - the false claim was authored BY a correction pass. Closed by a gate rather than by vigilance. scripts/check_affiliation_claims.py fails on any US-style institution name in a tracked file that is not on an explicit allowlist, wired into CI (.github/workflows/affiliation_claims.yml) and pre-push Check 3. An allowlist, not a denylist: a denylist only catches fabrications someone already thought of. Retracted names are permitted per-FILE rather than per-line, so "NC State" is a record in the claims register and a failure in README.md. Three defects were fixed in the gate before shipping it. 1. Its docstring claimed it fails on any unallowlisted institution. Probing it directly showed "Universite de Geneve", "Universitat Heidelberg", "institut pasteur" (lowercase) and "Rutgers-Newark" all pass silently. The scope is now stated honestly as US-style forms, with the measured misses named, rather than reading as coverage it does not provide. 2. It cited a4543bf, which is the authoring commit and is NOT an ancestor of main. Corrected to ee780a5, matching the D35 row. 3. Its own test suite was not exempt, so the gate blocked the very commit introducing it - 17 findings, every one a fixture. Undiscoverable before the file was tracked, since untracked files are not scanned by default. The gate's source and its suite are now both exempt, and the narrowness is pinned by a test: a DIFFERENT test file must still be scanned, so a later "simplify to a test_ prefix" cannot silently blind all of tests/. Verified: the gate catches the exact original string when reintroduced in a scratch copy; README.md is still caught while the register is not; 12 tests pass; ruff clean; the exemption's narrowness mutation-tested. Integrity harness restored to 151 PASS / 0 WARN / 2 FAIL / 7 SKIP - the third FAIL was this script being cited by a tracked register row while itself untracked; the remaining two are the standing C1/D20 and C2/D21 owner rulings. Signed-off-by: Gavin Borges <gavinmborges1104@gmail.com>
…c-state-affiliation # Conflicts: # docs/claims_register.md
…e-cite D35 Two defects found by an independent audit of the affiliation branch, both in the supporting evidence rather than in the correction itself. 1. The "12 commits authored from @uri.edu" figure overstated the corroboration threefold, and it was measured with the wrong instrument. `--all` counts pre-v1-archive and release/2.0-rc1, which mirror main's early history under different SHAs, so four distinct commits by a single collaborator were counted three times each. `git log --no-use-mailmap --format='%ae' origin/main` returns 4. Both the script docstring and the D35 row now state the INVARIANT instead of an absolute, per .claude/rules/git-instruments.md rule 7: every commit in this repository authored from an institutional address is from @uri.edu, and none is from any NC State domain, wherever it is measured. The conclusion is unaffected - zero NC State commits exist at any count - but the error direction is the flattering one, and it was made inside the row documenting a flattering-direction fabrication. 2. D35 and the gate's docstring broke a REQUIRED status check. Between them they added four line-number citations (MAINTAINERS.md:15, LICENSE:3, SECURITY.md:6, and the authorship-analysis note), taking the exempt ledgers' ratchet from 63 to 66 against a ceiling of 63, and two of them were UNPINNED with no baseline entry. All four are now prose or heading references - the MAINTAINERS.md maintainer table, the LICENSE copyright line, SECURITY.md's opening paragraph - which is what the gate asks for and what does not rot. The ratchet is back at exactly 63; no ceiling was raised. Verified: line-citation gate and commit-ref gate both clean, affiliation gate clean, 12 tests pass, integrity harness 151 PASS / 0 WARN / 2 FAIL / 7 SKIP. Signed-off-by: Gavin Borges <gavinmborges1104@gmail.com>
Post-review corrections (pushed as
|
…thmetic again Two register-integrity defects found by an independent audit, both in the table these affiliation rows live in. 1. D34 and D35 rendered as raw pipe-delimited text, not as table rows. A stray blank / --- / blank sequence sat between D11 and D34, which ends a markdown table, so every row after it fell out of the table entirely. On main that orphaned D34 alone; adding D35 would have orphaned it too. Removing the three separator lines rejoins them. The Section 1 table is now 35 contiguous rows, D27 through D35, with zero arity mismatches against its 9-column header - which also matches the heading's "(D1-D35)" range for the first time. 2. D34's disposition arithmetic was wrong a second time, and the first correction is what left it wrong. PR #294 moved "twenty-nine confirmed" to twenty-seven but left "seven cells were corrected" standing, when the row's own "-> corrected" enumeration lists EIGHT changed cells: PredIG x2 (open-source/pip, pan-allele), PRIME x3 (open-source/pip, antigen-processing, pan-allele), NetMHCpan x1 (end-to-end), pVACtools x2 (end-to-end qualifier, antigen-processing). The corrected split is 8 + 26 + 1 unresolved + 1 excluded = 36. The row now records that it was corrected twice and names the check that catches this class - count the enumeration, which is one grep. A correction pass is itself a claim-making pass (.claude/rules/third-party-claims.md rule 2), and this is the third time in this repository that the fix for a false claim carried a fresh one. Verified: table contiguity and per-row arity re-measured escape-aware (35 rows, 0 mismatches); line-citation gate 63/63 at ceiling; commit-ref gate 205 citations resolve; affiliation gate clean; integrity harness 151 PASS / 0 WARN / 2 FAIL / 7 SKIP. Signed-off-by: Gavin Borges <gavinmborges1104@gmail.com>
Section 4's monitored-claim row read "12 viruses trained". Every other
surface says nine: README.md ("nine viral pathogens", and "9 viruses
(v5 active)" in its field-comparison table) and this file's own Section 2.
Twelve is a v4-era figure.
This column holds the claim to be MONITORED going forward, not a historical
record, so a stale figure aims the next re-verification at the wrong target.
It also puts the register three viruses out of step with the README while
that README's "Start here" table directs readers here as the scope
authority - a reader checking the evidence scope finds the two documents
disagreeing.
Corrected to the nine v5-active viruses, named explicitly so the next drift
is visible rather than a bare count, with the correction and its reasoning
recorded in the row.
Signed-off-by: Gavin Borges <gavinmborges1104@gmail.com>
Register-integrity repairs folded in (
|
| Tool | Corrected cells |
|---|---|
| PredIG | open-source/pip, pan-allele |
| PRIME | open-source/pip, antigen-processing, pan-allele |
| NetMHCpan | end-to-end |
| pVACtools | end-to-end qualifier, antigen-processing |
8 corrected + 26 confirmed + 1 unresolved + 1 excluded = 36. The row now records that it was corrected twice and names the check that catches this class - count the enumeration, which is one grep -c.
Worth stating plainly: this is the third time in this repository that the fix for a false claim carried a fresh one (.claude/rules/third-party-claims.md rule 2), and the previous instance was mine, one PR ago.
3. Section 4 monitored a v4-era virus count
The row read "12 viruses trained". Every other surface says nine - README.md ("nine viral pathogens", and "9 viruses (v5 active)" in the field-comparison table) and this file's own Section 2.
That column holds the claim to be monitored going forward, so a stale figure aims the next re-verification at the wrong target - and it left the register three viruses out of step with the README while README's "Start here" table directs readers here as the scope authority. Corrected to the nine v5-active viruses, named explicitly so the next drift is visible rather than hiding in a bare count.
Verification
Section 1 contiguity and per-row arity re-measured escape-aware (35 rows, 0 mismatches) · line-citation gate 63/63 at ceiling, no raise · commit-ref gate 205 citations resolve · affiliation gate clean · 12 tests pass · integrity harness 151 PASS / 0 WARN / 2 FAIL / 7 SKIP · zero failing checks on this PR.
README.md's academic acknowledgement, the last line of the file, asserted "bioinformatics coursework at NC State". SESTRAV has no connection of any kind to NC State.The institution was fabricated, not mis-copied. The line it replaced named no institution at all:
A documentation-hygiene pass titled "de-course-ify the docs layer" invented a proper noun that had never appeared in this repository. It reached
mainasee780a5(PR #147, 2026-07-23) and stood in the public README for roughly five weeks.Evidence, from two independent instruments
Every affiliation record in the repo already said University of Rhode Island, and all of them predate the fabrication:
CITATION.cff(all six author entries),MAINTAINERS.md,LICENSE,SECURITY.md,docs/zenodo_deposition.md, and README's own "Original SESTRAV 1.0 Foundation Team (University of Rhode Island)" heading seven lines above the false line.Second instrument, per
.claude/rules/git-instruments.md("is there a second, independent instrument that should agree?") — using the unmapped form, sincegit shortlogsilently applies.mailmap:Why no existing gate could see it
It carried no number and no retracted token, so the retracted-token sweep, the reconcile check and the citation gate were all blind by construction. Recorded as D35, and as instance #7 in
.claude/rules/third-party-claims.md, which it extends twice over:It also repeats the class's most durable pattern for the third time (after #4 and #6): the false claim was authored by a correction pass. And the direction-of-error test holds — NC State is a larger, better-known institution, so the fabrication flattered the project.
The failure was one of detection, not knowledge:
_local/notes/authorship_analysis_2026-08-21.mdrecorded the contradiction explicitly five days before the fix, but filed it as a question to ask rather than a live false claim, and_local/is gitignored so no gate or reader could see it.Closed by a gate, not by vigilance
scripts/check_affiliation_claims.pyfails on any US-style institution name in a tracked file that is not on an explicit allowlist. Wired into CI (.github/workflows/affiliation_claims.yml) and pre-push Check 3 — which ran and passed live on this very push.An allowlist, not a denylist: a denylist only catches fabrications someone already thought of. This class is gateable where a false number is not, because an institution is a proper noun from a closed set — the check is "has this name been reviewed once", which needs only a list, not "is this number right", which needs a source.
Retracted names are permitted per-file, not per-line:
NC Stateis a record in the claims register and a failure inREADME.md. A line suppression would have blinded that row to any other name added to it.Three defects fixed in the gate before shipping it
Universite de Geneve,Universitat Heidelberg,institut pasteur(lowercase) andRutgers-Newarkall pass silently. Scope is now stated honestly as US-style forms with the measured misses named — an unexercised gate that reads as broader than it is becomes a false all-clear (GOV-1).a4543bf, which is the authoring commit and is not an ancestor of main. Corrected toee780a5, matching D35.test_prefix" cannot silently blind all oftests/. Mutation-verified — that exact over-broad rewrite fails the test.Verification
README.mdstill caught while the register is not — both directions checked.MIT License,Current State,finite State machineall correctly suppressed.ruff checkclean; no non-ASCII introduced.