Skip to content

The committee's findings, which arrived after #52 was merged - #53

Merged
peopleworks merged 4 commits into
mainfrom
report-evidence-committee-fixes
Aug 10, 2026
Merged

The committee's findings, which arrived after #52 was merged#53
peopleworks merged 4 commits into
mainfrom
report-evidence-committee-fixes

Conversation

@peopleworks

@peopleworks peopleworks commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Read this first. PR #52 was merged at 11:39 with only its first commit. The two adversarial reviews reported afterwards, and everything they found is in the four commits here. main today carries a sentence I proved false and three defects the reviewers demonstrated, so this is not a follow-up — it is the rest of #52.

Verified rather than assumed: git merge-base --is-ancestor says 07c82f6 is in main and 78b8fb6 is not. CI never ran on any of these four commits; the checks showing green on #52 are from the first push.

What main is shipping right now

"Ordered by how much each one moved the score" False for stat.burstiness, which the scorer excludes from the weighted sum — and which sorts to the top of a real report. The claim sits directly above the one row it does not describe.
The citations list is still cut by position The same defect #52 fixed for signals. Forty uncited entries early in a bibliography print; the repeated DOI in the last one does not.
![img](url) in a document survives into the Markdown The page's last line says nothing here was uploaded anywhere. An image node fetches from someone else's host the moment a teacher pastes the report into the LMS.
One * in a document eats the report's own prose Emphasis opens at the document's asterisk and closes at the report's *→ suggestion* marker. The matched character disappears.

The four commits

  1. ace9e9b — say weight, not score. Found by checking Scorer.cs instead of trusting my own comment.
  2. 4ecdac2 — Fable's lens (claims). The headline counted Issues.Count where ContradictionCount exists, so a tidy bibliography listing further reading was announced as "1 source contradiction" over a note saying the document "disagrees with itself" — an accusation CitationIssue explicitly declines to make. Reproduced before fixing. This one predates Sort the evidence before cutting it, and stop the Markdown carrying live HTML #52. (Correction, verified after the PR was written: it shipped for five days, not months. The miscounting headline entered on 2026-08-05 in 1b2b1b8 and went out in v0.4.0 the same day. I wrote "months" without checking, which is the overclaim this project exists to argue against, so recording it rather than quietly editing it out.) Plus: citations sorted, MaxRows clamped (it is public and unvalidated — a negative value printed "… and 12 more" for two findings), the character table now says why it is not in file order, and Finding.Weight's own doc corrected.
  3. feb7e2b — Codex's lens (attack). Returned DO NOT SHIP with five reproducible findings; all five were written as failing tests before being fixed. Escaping < does nothing to Markdown's own image and link syntax. Fixing the asterisk needed the escape resolution and the HTML escaping merged into one pass, because resolving first puts a live marker back before the emphasis pass runs; an escaped asterisk returns as &#42;. Three more values reached the page unescaped: the analysed language (free text from a model, via MCP), GeneratedOn and EngineVersion. And Cell trimmed the matched text, which contradicts the one thing this page promises.
  4. 78b8fb6 — the CLI and the web interface still said "reads mostly human", the claim The verdict bands were chosen by hand; the calibration is measured. Reconcile them. #32 removed from the report because it is about the writer and not ours to make. The guard now lives in the locale files, where community translations arrive, and names the file and key when it fires — verified by putting the old sentence back and watching it fail.

Verification

  • 362 tests green across the solution; every fix has a test that fails without it, checked one at a time.
  • The two reviewers were given different lenses and told not to read each other. Their findings were disjoint: Fable found no escaping defect, Codex found no overclaim. One shared brief would have bought two reviews and returned one.
  • Read the generated report and the generated HTML, not only the assertions. The escaping costs exactly one backslash in a real report (cites \[3]), which the HTML resolves back to [3].

Note on process

Nothing here is a criticism of merging #52 — I said the code was ready and the checks were running. It is a note that "merged" is a snapshot, not a promise about the branch, which is the third form this trap has taken in this repository.

🤖 Generated with Claude Code

peopleworks and others added 4 commits August 10, 2026 11:52
The line added one commit ago read "Ordered by how much each one moved the
score". That is true of every finding except one, and the exception sorted to
the top of the first report generated from this code.

Every non-statistical finding pools into a single weighted density that Map
turns into the pattern score, and Map is monotone, so among those the order by
weight is exactly the order by contribution. Scorer excludes the Statistical
category from that sum and derives its share from the sentence-length
distribution instead, so stat.burstiness carries a weight that ranks it on the
page without being what moved the number.

The ordering is unchanged and defensible — in that document burstiness did
contribute most. What was not defensible was a sentence claiming a measured
quantity the model does not hold, on the page this project built to argue that
a number without its provenance is not evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Everything here came out of the committee review, either as a finding or as
something found while checking one.

**A false accusation, and it is not from this branch.** The headline counted
`Citations.Issues.Count` where `ContradictionCount` exists. CitationIssue draws
the line itself — a cited source missing from the list is a contradiction, an
uncited entry in the list is not, "because people legitimately list further
reading" — so a document whose only fault was further reading was announced as
"Checkable facts found: 1 source contradiction", over a note asserting in the
report's own voice that it "disagrees with itself". Reproduced with a tidy
bibliography before fixing it. The CLI and the UI panel both use
ContradictionCount correctly, so the report was the only surface that said it.

**The citations list was cut in document order.** Left in place one commit ago
while the same defect was fixed for signals: forty uncited entries early in a
long bibliography would print and the repeated DOI in the last entry would not.
Contradictions first now, then position — the checker's own distinction, not a
new judgement.

**MaxRows is public, settable and unvalidated, and this library is on NuGet.**
A negative value printed "… and 12 more" for two findings, because the omission
count is Count minus the limit. At zero rows the page claimed nothing omitted
outweighed what was shown, with nothing shown. Clamped once at the top, and the
strong clause is used only when there is something above for the rest to weigh
less than.

**The character table now says why it is not in file order.** It prints line and
column so the reader can find each occurrence in an editor, which makes it the
one table they are invited to verify; a Line column reading 6, 1, 2, 3 with no
explanation looks like a defect. The signals list already carried its own line —
this applies the same standard to the table it reordered.

**Finding.Weight's own doc claimed what the report was corrected for claiming.**
"Contribution of this finding to the overall score" is false for stat.burstiness,
whose weight the scorer never reads. Harmless until the report began sorting by
it and telling the reader what the order meant.

Four new tests, 356 green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The second reviewer returned DO NOT SHIP with five reproducible findings. All
five were confirmed by test before being fixed, and all five failed first.

**An image is a request.** Escaping the angle bracket blocks raw HTML and does
nothing to `![alt](url)`. The page's own last line says nothing here was
uploaded anywhere; a report that fetches a pixel from somebody else's host the
moment a teacher pastes it into the LMS has broken that sentence, and the fetch
carries the moment they opened it. Escaping the opening bracket covers images
and links both.

**An asterisk captured the report's own prose.** The signal row is the matched
text followed by the report's `*→ suggestion*`, so one asterisk from the
document paired with the report's marker: emphasis opened at the document's
character and closed at the report's, swallowing the explanation into the
document's content, and the matched character vanished. That is issue #37's
third item, deferred as cosmetic two commits ago and demonstrably not cosmetic.

Fixing it needed the order reversed. Resolving the escapes and then escaping for
HTML puts a live asterisk back before the emphasis pass runs, so the two are now
one pass, and an escaped asterisk returns as `&#42;` — a literal asterisk to
every renderer, exactly as `&lt;` is a literal bracket, and not a character the
emphasis pass can see.

`_` and `` ` `` are deliberately left alone: neither can pair with a marker this
report writes on the same line, so the worst they do is italicise a document's
own text, and escaping them would put a backslash in front of the underscore in
every filename a teacher reads.

**Three more values reaching the page unescaped.** The analysed language, which
`Analyze` takes from its caller and the MCP server takes as free text from a
model; `GeneratedOn` and `EngineVersion`, public settable strings on the same
record whose `DocumentName` was already routed. A newline in either forged a
second heading in the report's own voice.

**`Cell` trimmed the evidence.** A rule whose regex includes the surrounding
spaces matches them, and they are part of the span in the document. Dropped, on
the page whose claim is that it reproduces what the document said.

The cost is one backslash in the raw Markdown of a real report — `cites \[3]` —
which the HTML resolves back to `[3]`, with no stray backslash anywhere on the
page. Checked by reading the generated report, not only the assertions.

The reviewer also confirmed the ordering against every edge asked for, and
100,000 findings sorted and truncated in 41 ms.

Five new tests, 361 green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…till did

#32 removed "Reads mostly human" from the report and "Minimal signs of AI
writing" from the score card, because they are the same state described two
ways and the first is a claim about the writer that this project cannot make: a
detector that detects nothing also returns a low score, and how much machine
writing this catches has deliberately never been measured.

It survived in two places, found while checking a reviewer's aside about a
third:

- The CLI, on the line printed when nothing is found: "✓ No strong AI tells
  found — reads mostly human", in green. The tick and the colour were the same
  claim in another form, so both go with it.
- The web interface, which is the surface most people see: the empty state read
  "This reads mostly human — nice work", and the rhythm caption "reads human".
  The caption for the opposite case describes the cadence rather than the
  author — "a machine-like, metronomic cadence" — so the varied one now does the
  same.

Both say what was measured instead: nothing above the measured boundary, and
that this is not evidence a person wrote it.

The reason it survived is worth more than the fix. The test that guards this
wording reads AnalysisResult.Verdict, and neither of these is that: one is a
literal in a Console.WriteLine, the other is locale data that arrives as
community pull requests. So the guard now lives where the data does, and names
the file and the key when it fires. Verified by putting the old sentence back
and watching it fail.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@peopleworks
peopleworks merged commit 8a0b984 into main Aug 10, 2026
4 checks passed
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.

1 participant