You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 7af81c4
Browse filesBrowse the repository at this point in the historyBrowse files
The [single-witness: ...] mechanism caught its author three times in two
days, on three different projects. The guard was right every time. The
mechanism was the problem.
`citedIds` returns every E-## mention in a cell, and the reason a reviewer
writes lives in that same cell. So explaining why no second witness exists -
by pointing at a row that demonstrates it - silently turned that row into a
citation. The unknown then read as corroborated across two hosts while its
own note claimed it could not be, and `single-witness-stale` fired on a
corpus that was correct. The remedy each time was to reword the prose, which
is fixing the symptom.
`stripReviewNotes` removes `[single-witness: ...]` and `[render-reviewed:
...]` before citations are extracted, at both sites that extract them - the
unknowns' Evidence cell and the subtopics' Covered by cell.
The raw cell is untouched. `unknown.evidence` still carries the note,
because the check that reads the reason needs it; only the citation
extraction sees the stripped text.
Two tests, both behavioural: a row named inside a note is NOT cited, and a
row cited outside one still is - stripping must not swallow real citations
that happen to sit near a note. A unit test also pins that an ordinary
markdown link is left alone, since the pattern is bracket-shaped.
No corpus changes verdict. All eight still PASS --strict with zero warnings,
including the three whose prose was reworded to work around this.
864 -> 867 tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/ARCHITECTURE.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -423,6 +423,7 @@ each line — is in the ADR named beside it and in
423
423
| The collector's spend gate is a **protected environment whose existence is proven**, because GitHub silently creates an *unprotected* one when a workflow names a missing environment; a missing credential **refuses** rather than falling back to a keyless route | ADR-0033 |
424
424
| A claim's **support is weighed, not just checked**: `corroboration` reports whether a closed unknown rests on one reading, several readings of one source, a **republished copy of one document across hosts** (`mirror`, via `lib/similarity.mjs`), or genuinely distinct documents — it never fails a corpus on its own, because single-sourcing is often the right answer. Rows are **deduped by id first**: `citedIds` returns every `E-##` mention, so prose naming one row twice used to produce it twice, and once grouping folded the duplicate it reported a "republished copy" about a row that was merely mentioned twice |[ADR-0036](adr/0036-the-gate-can-see-single-sourcing.md)|
425
425
|`corroboration`**reports the closest pair it measured** on an `independent` verdict, and does not act on it. The threshold has two measured blind spots, and containment - the obvious repair for the second - ranks a genuinely different pair (0.506) ABOVE a real mirror (0.380) over 2404 pairs, so trying harder would report second sources as copies. The number informs a reviewer; the grade does not move | ADR-0036 |
426
+
| A reviewer note is **not a citation**: `stripReviewNotes` in lib/corpus.mjs removes `[single-witness: ...]` and `[render-reviewed: ...]` before `citedIds` runs. Those notes are prose written INSIDE the same cell the citations are read from, so explaining why no second witness exists - by pointing at a row that demonstrates it - turned that row into a citation, and the unknown read as corroborated while its own note denied it. It caught its author three times in two days across three projects; the guard was right every time and the mechanism was the problem. The raw cell is untouched, because the check that reads the reason needs it | ADR-0038 |
426
427
| A finding a reviewer has **considered and overruled** is recorded, not repeated forever: `[single-witness: …]` in an unknown's Evidence cell and `[render-reviewed: …]` in an evidence row's Finding cell turn a true-but-permanent warning into a pass **that prints the reason**. A reason under 30 characters is named (`single-witness-unreasoned`) rather than obeyed, and a note left on an unknown that has since been corroborated is reported (`single-witness-stale`) so the acknowledgement cannot rot. The render note lives on the ROW because `verifyLedger` hashes the whole capture file — a capture is evidence and stays byte-immutable, a judgement about it is corpus prose |[ADR-0038](adr/0038-a-judgement-the-gate-can-read.md)|
427
428
| The collector lock is exclusive **on a local filesystem, and not promised on a network one**: Node states "the exclusive flag might not work with network file systems", a condition ADR-0020 never carried. Measured 2026-09-22 - 24 racers, 1 winner, 23 EEXIST on win32 - so the guarantee holds where it was tested and nothing detects where it is standing. Evidence: `docs/decisions/2026-09-22-wx-lock/`| ADR-0020 |
428
429
| The SEARCH side is **selectable at dispatch**: collect.yml takes a search_transport input (auto | serpapi | firecrawl-cli) and collect-remote.mjs a matching --search-transport, passed as RESEARCH_KIT_SEARCH_TRANSPORT. ADR-0027 built the ladder and the collector never exposed it, so a dispatched run always took whatever auto-detect picked and two providers could not be compared on one topic through the kit at all. auto becomes the EMPTY STRING, falsy in the ladder, so the default is the previous behaviour exactly | ADR-0027 |
0 commit comments