On this page
01 / The finding
Averaging is the intuitive rule, and it is close to useless
The classifier reads 512 tokens at a time. Anything longer is cut into sections and scored section by section, which means something has to turn several numbers into one verdict. That combining step is the single most consequential design decision in the tool, and it is decided by the strongest section rather than the average of them.
On 700 documents that are half machine-written and half human-written, the document mean catches 29. The strongest section catches 638.
91.14% [88.81–93.03] on the original build of the synthetic half-AI corpus, fp32.
4.14% [2.90–5.89] at a matched 1.21% human false-positive budget.
What each extra section adds to a human document’s chance of being wrongly flagged. The same section takes AI detection from 81.12% to 91.81%.
| Combining rule | Detected | Rate | Wilson 95% | Human budget |
|---|---|---|---|---|
| Strongest section | 638 / 700 | 91.14% | 88.81 – 93.03 | 1.21% |
| Document mean | 29 / 700 | 4.14% | 2.90 – 5.89 | 1.21% |
AGGREGATION-AND-RHYTHM.md §2.4. Measured on the original 700-document build, under the segments-v2 pipeline, at a retired flag point. The rule that ships today is the minimum-evidence pair; its own figure on a rebuilt half-AI corpus is in section 07 and is not comparable with these.
Measured at a rule that no longer ships
- Corpus
- 700 synthetic half-AI documents across 7 registers: 50 AI and 50 human articles of matched word count spliced in both orders, 300–900 words a half.
- Retired flag point
- 0.984
- Detector
tier3-cycle2-e5small-fp32.onnx, SHA-256e313ab00de1fffd2…4d2788d- Runtime
- Python onnxruntime 1.29.0, CPU, fp32
- Measured
- 30 August 2026
- Also
- Pipeline segments-v2. Both candidate rules refitted to a 56/4,636 = 1.21% human false-positive budget on the 5,558-document long-form corpus before being run against the half-AI set.
The rule that ships today is 0.9855 / 0.9763. The figures under this stamp answer the same question at a flag point this tool no longer uses, and they are not a description of the tool as it runs now.
02 / Segmentation
Why a document is read in pieces at all
A 1,600-word article does not fit inside a 512-token window, so it is cut. Once a document is several readings rather than one, the combining step exists whether anyone designs it or not, and its consequences are measurable.
The obvious objection to taking the maximum is that a long document gets more chances to trip the flag, so long human documents should be flagged more often for no reason beyond their length. That objection is correct in principle. It was measured, and the rest of this page is what the measurement said.
- Section
- One token-bounded piece of a document under the
segments-v3segmentation contract. Each is scored independently and carries its own probability. - The shipped rule
- A document is flagged when a document is flagged when its strongest section reaches 0.9855, or its second-strongest reaches 0.9763. Two arms, one primary and one secondary, and the second exists because two sections agreeing at a lower confidence is better evidence than one section alone.
- Matched false-positive budget
- Each candidate rule carries its own refitted threshold, chosen so that every rule wrongly flags the same share of human documents. A fixed threshold across rules would have conflated a change of rule with a change of calibration.
Measurement conditions
- Corpus
- The 5,558-document long-form corpus of 28 August 2026: 922 AI documents across 13 models, 4,636 human. Not fully held out — 268 of the 922 AI documents sit in the cycle-2 dataset, 168 of those in the train split; the human side is effectively clean at 11 of 4,636.
- Operating point
- 0.9855 / 0.9763 · contract segments-v3 · T = 0.8324
- Detector
tier3-cycle2-e5small-fp32.onnx, SHA-256e313ab00de1fffd2…4d2788d- Runtime
- Python onnxruntime 1.29.0, CPU, fp32; browser rows are onnxruntime-web, int8 dynamic per-channel
- Measured
- 30 August 2026
- Also
- Detector trained 28 August 2026. Browser artefact tier3-cycle2-e5small-int8-perchannel.onnx, base model intfloat/e5-small. The two runtimes are different artefacts and their false-positive rates differ materially; both are printed on this page rather than the flattering one.
03 / Length bias
The bias is real, small, and lives where it was expected to
Take every document with at least six sections. Ask what the flag rate would be if the verdict were the maximum over a random subset of j of that document’s own sections, computed exactly over all C(k, j) subsets rather than sampled. Register, source, author and topic are held constant, because it is the same document throughout. Only the number of chances varies.
| Sections drawn | Human flag rate, n = 510 | AI detection, n = 315 |
|---|---|---|
| 1 | 0.145% | 81.12% |
| 2 | 0.288% | 91.81% |
| 3 | 0.428% | 94.91% |
| 4 | 0.566% | 96.37% |
| 5 | 0.701% | 97.25% |
| 6 | 0.834% | 97.79% |
AGGREGATION-AND-RHYTHM.md §1.4. Exact enumeration over all C(k, j) subsets of each document's own sections. fp32.
Each extra section adds 0.14 percentage points to a human document’s chance of being wrongly flagged. The relationship is almost perfectly linear, so going from a two-section document to a nine-section one costs roughly one point. In academic discussion, the register with the worst human false-positive rate, it is +0.74pp per section; in white papers over the same range it is zero.
The right-hand curve is the reason nothing was done about it. The same extra section that costs 0.14pp of human false positives takes AI detection from 81.12% to 91.81%. A section is evidence, not only opportunity, and a correction that removes the opportunity removes the evidence with it.
Two further readings from the same record
Across the whole corpus the human false-positive rate is not monotonic in section count. It peaks at 24/979 = 2.45% for three-section documents and falls to 8/887 = 0.90% at five or more. What dominates is register composition rather than length: human fiction runs at 29/260 = 11.15% and clusters in the three- and four-section buckets, while student essays run at 0/420 and make up a quarter of the two-section bucket.
The pooled per-section mean probability for human documents is also flat or falling with length within every register measured. White papers read 0.409, 0.354, 0.299, 0.176 and 0.208 from one section to five-plus. Longer human writing is not more machine-like section by section. The bias is in the combining step, it is worth 0.14pp per section, and it sits against a register spread of eleven points.
04 / Candidates
The intuitive fix is the worst option available
Correcting the threshold for section count is what a statistician reaches for first. It costs 8.46 points of detection and buys nothing back. Sweeping the correction strength makes the mechanism plain: at γ = 0.5 the five-plus-section bucket loses 15.8 points of detection to save 0.90pp of false positives on 887 documents, and at full Bonferroni the rule collapses to 388/922 = 42.08%. A multiple-comparisons correction assumes the extra tests are noise. Here they are mostly signal.
| Candidate | Refitted rule | AI detected | Human false positives |
|---|---|---|---|
| Minimum evidence | max ≥ 0.9845 or second ≥ 0.9765 | 887 / 922 = 96.20% | 56 / 4,636 = 1.21% |
| Plain maximum | max ≥ 0.9841 | 877 / 922 = 95.12% | 57 / 4,636 = 1.23% |
| Second-highest section | second ≥ 0.9712 | 868 / 922 = 94.14% | 56 / 4,636 = 1.21% |
| Highest adjacent pair | sustained over two adjacent sections ≥ 0.9658 | 855 / 922 = 92.73% | 56 / 4,636 = 1.21% |
| Document mean | mean ≥ 0.8476 | 811 / 922 = 87.96% | 56 / 4,636 = 1.21% |
| Šidák-shaped threshold | T(k) = 1 − 0.0284/√k | 799 / 922 = 86.66% | 57 / 4,636 = 1.23% |
| Full Bonferroni | correction at full strength | 388 / 922 = 42.08% | not reported at this budget |
AGGREGATION-AND-RHYTHM.md §2 and §2.1. 922 AI documents across 13 models, 4,636 human documents, fp32. The full Bonferroni row is the endpoint of the correction-strength sweep and is not reported at a matched budget.
Measured at a rule that no longer ships
- Corpus
- The 5,558-document long-form corpus of 28 August 2026: 922 AI documents across 13 models, 4,636 human. Not fully held out — 268 of the 922 AI documents sit in the cycle-2 dataset, 168 of those in the train split; the human side is effectively clean at 11 of 4,636.
- Retired flag point
- 0.984
- Detector
tier3-cycle2-e5small-fp32.onnx, SHA-256e313ab00de1fffd2…4d2788d- Runtime
- Python onnxruntime 1.29.0, CPU, fp32
- Measured
- 30 August 2026
- Also
- Pipeline segments-v2. Every candidate refitted to a 56/4,636 = 1.21% budget before evaluation. The minimum-evidence parameters in this table, 0.9845 / 0.9765, are the fitted candidate and not the shipped pair.
The rule that ships today is 0.9855 / 0.9763. The figures under this stamp answer the same question at a flag point this tool no longer uses, and they are not a description of the tool as it runs now.
Read the same table the other way, holding detection fixed at 877/922 and reading off the cost instead. Plain maximum spends 55/4,636 = 1.19% of human false positives, the mean of the top two spends 60/4,636, and the document mean spends 206/4,636 = 4.44%. The averaging rule is expensive at both ends.
05 / The second bar
Two sections agreeing is worth a lower bar
Minimum evidence is the rule that ships, in refitted form. It flags when one section is very confident, or when two sections agree at a lower confidence. Because it is a two-parameter rule fitted on the corpus it was evaluated on, it was cross-validated before it was believed: 200 random split-halves, both rules refitted on half A at a 1.208% false-positive budget and evaluated on half B.
| Arm | Flag point | What it reads |
|---|---|---|
| Primary | 0.9855 | The strongest section in the document, on its own. |
| Secondary | 0.9763 | The second-strongest section. Two sections agreeing at a lower confidence, which a one-section document cannot produce. |
Schematic drawn from the shipped rule's definition: a document is flagged when its strongest section reaches 0.9855, or its second-strongest reaches 0.9763. Contract segments-v3. It illustrates the rule and measures nothing.
| Rule | Held-out detection | Held-out human false positives |
|---|---|---|
| Plain maximum | 95.22% (sd 0.85) | 1.22% (sd 0.33) |
| Minimum evidence | 96.03% (sd 0.83) | 1.30% (sd 0.34) |
| Difference | +0.82pp, 95% of splits in [−0.22, +1.74] | +0.077pp |
200 random split-halves of the 5,558-document long-form corpus. Both rules refitted on half A at a 1.208% human false-positive budget and evaluated on half B. Source: AGGREGATION-AND-RHYTHM.md §2.
Minimum evidence wins on 178 of 200 splits, ties on 15 and loses on 7. It also spends slightly more false positives out of sample than it was fitted to, which the in-corpus table does not show and which is recorded here because it is the honest half of the result.
The gain lands where short documents live. At the matched budget the two-section bucket goes from 30/37 = 81.08% to 34/37 = 91.89% and the three-section bucket from 178/198 = 89.90% to 183/198 = 92.42%, while five-plus is unchanged at 477 against 478 of 487. The gap between short and long documents narrows from 16.9 points to 6.3.
06 / Refitting
What shipped is not what was fitted
The candidate’s parameters, 0.9845 / 0.9765, were fitted on fp32 section scores because those were the only full-corpus segmented scores that existed. The browser runtime was then measured over the same 5,558 documents and the rule did not hold there. It would have taken browser human false positives from 90/4,636 to 106/4,636, and browser academic discussion from 16/420 = 3.81% to 23/420 = 5.48%. The candidate had been accepted as detection gained at matched false positives. That is true on fp32 and false in the browser, so it is not the trade a browser visitor would have received.
Refitted against both runtimes at once, under the constraint that neither route may finish with more false positives than the rule it replaces, the shipped pair is 0.9855 / 0.9763.
| Rule | Runtime | AI detected | Human false positives | Two-section AI | Fiction | Academic discussion |
|---|---|---|---|---|---|---|
| Prior 0.984 | fp32 | 877/922 = 95.12% | 56/4,636 = 1.208% | 30/37 = 81.08% | 29/260 = 11.15% | 8/420 = 1.90% |
| Prior 0.984 | browser | 877/922 = 95.12% | 90/4,636 = 1.941% | 31/37 = 83.78% | 28/260 = 10.77% | 16/420 = 3.81% |
| Shipped 0.9855 / 0.9763 | fp32 | 883/922 = 95.77% | 45/4,636 = 0.971% | 34/37 = 91.89% | 23/260 = 8.85% | 8/420 = 1.90% |
| Shipped 0.9855 / 0.9763 | browser | 889/922 = 96.42% | 90/4,636 = 1.941% | 34/37 = 91.89% | 26/260 = 10.00% | 21/420 = 5.00% |
Server rows are fp32 Python onnxruntime; browser rows are int8 onnxruntime-web. The two are different artefacts and their false-positive rates differ materially. Both are printed rather than the flattering one. Source: AGGREGATION-AND-RHYTHM.md §6.
Measurement conditions
- Corpus
- The 5,558-document long-form corpus of 28 August 2026: 922 AI documents across 13 models, 4,636 human. Not fully held out — 268 of the 922 AI documents sit in the cycle-2 dataset, 168 of those in the train split; the human side is effectively clean at 11 of 4,636.
- Operating point
- 0.9855 / 0.9763 · contract segments-v3 · T = 0.8324
- Detector
tier3-cycle2-e5small-fp32.onnx, SHA-256e313ab00de1fffd2…4d2788d- Runtime
- Both routes: Python onnxruntime 1.29.0, CPU, fp32, and onnxruntime-web, int8 dynamic per-channel
- Measured
- 30 August 2026
- Also
- Detector tier3-cycle2-e5small-fp32.onnx for the fp32 rows and tier3-cycle2-e5small-int8-perchannel.onnx for the browser rows, both from cycle 2, base model intfloat/e5-small.
One arithmetic note, because it moves a digit. The stored per-section probabilities carry four decimal places, and the secondary bar is decided by 19 AI and 9 human documents on fp32 that sit close enough to it that rounding matters. At four decimals the shipped rule reads 884 detections; from a full-precision re-score of all 21,093 segments it reads 883. The unrounded run reproduces the canonical 56/4,636 for the prior rule exactly, which is what licenses the 883.
07 / The cost
The cost, published because it was accepted knowingly
Raising the primary bar from 0.9841 to 0.9855 opens a gap, and half-AI documents fall into it.
The 700-document half-AI corpus had to be rebuilt, because the original build script was not saved. On the rebuild, which has a median of three sections rather than five, plain maximum catches 612/700 = 87.43% and the shipped pair catches 604/700 = 86.29%, both fp32. Nine documents lost against one gained, McNemar p = 0.027.
The shipped pair 0.9855 / 0.9763 on the rebuild. Not comparable with the 638/700 in Figure 1, which is the original build under a different pipeline and a retired flag point.
Every lost document has its strongest section inside the gap the higher primary opened, and its second-highest section is the human half, at a median of 0.4365.
The regression is structural rather than statistical. The secondary arm cannot rescue those documents, because a second-section rule cannot save a half-AI document by definition of what makes it half-AI.
A purely additive rule — primary held at 0.984, secondary added — cannot regress this by construction, and was tested. It fails differently. To stay inside the browser’s false-positive budget the secondary has to rise to 0.9825, at which point the two-section gain disappears completely, back to 30/37 = 81.08%. There is no pair that holds two-section detection, browser false positives and mixed-content detection at once. Every candidate gives up one of them.
The alternative wrongly flags 16 more people in 4,636 and takes browser academic discussion to 5.48%.
Measurement conditions
- Corpus
- 700 synthetic half-AI documents across 7 registers: 50 AI and 50 human articles of matched word count spliced in both orders, 300–900 words a half. Rebuilt after the original build script was lost; the rebuild has a median of three sections rather than five.
- Operating point
- 0.9855 / 0.9763 · contract segments-v3 · T = 0.8324
- Detector
tier3-cycle2-e5small-fp32.onnx, SHA-256e313ab00de1fffd2…4d2788d- Runtime
- Python onnxruntime 1.29.0, CPU, fp32. The 604/700 figure is fp32 and stays fp32 until the mixed-content cost is re-measured on the browser runtime.
- Measured
- 30 August 2026
- Also
- McNemar p = 0.027 against plain maximum on the same rebuild, nine documents lost against one gained.
08 / Limits
What this does not prove
The half-AI corpus is synthetic. These are spliced halves, not documents a person actually half-wrote. The corpus tests the mechanism that maximum aggregation exists to protect. Its absolute rates must not be quoted as a detection figure for edited text.
Two builds, two numbers. The original 700-document build reads 638/700 for plain maximum; the rebuild reads 612/700 on the same specification. Both are true of their own corpus and neither is a correction of the other. Any comparison must stay inside one build.
Cross-validation is blind to the mixed-content axis. The 5,558-document corpus contains no mixed documents. The shipped pair wins 194 of 200 split-halves on fp32 and 200 of 200 in the browser, and both results are blind to the regression in section 07. That is a limitation of the validation method, and it applies to every future operating point fitted the same way. A mixed-content check belongs inside the fit rather than after it.
Of the 922 AI documents, 268 — 29.1% — appear in the cycle-2 dataset and 168 of those in the training split. The human side is effectively clean at 11 of 4,636. The independent subset reads 620/654 = 94.80% against 257/268 = 95.90% for the seen subset, measured at the superseded 0.984 single-threshold rule and not at the shipped pair. The seen-against-unseen split at 0.9855 / 0.9763 has never been measured.
Source: AGGREGATION-AND-RHYTHM.md §6 and corpus-reconciliation-2026-08-29/analysis.txt §2.
The fit did not include WebGPU. The pair was fitted from onnxruntime-web’s WASM provider under headless Node. WebGPU was measured afterwards and holds; that measurement is a separate paper.
Register labels are machine-assigned. Every per-register figure on this page inherits that.
Two figures quoted in the project’s handover notes for this argument — a detection count for averaging on the rebuild, and a pair of mean-against-maximum rates — appear in no measurement record found in this sweep. They are not used anywhere on this page, and they should not be repeated until a measurement file carries them.
Provenance
| Figure | File | Section |
|---|---|---|
| 638/700 and 29/700 on the original half-AI build, segments-v2, 0.984 era | AGGREGATION-AND-RHYTHM.md | §2.4 |
| Within-document curve, exact over all C(k, j) subsets; n = 510 human, 315 AI | AGGREGATION-AND-RHYTHM.md | §1.4 |
| Non-monotonic human false positives by section count; per-register per-section means | AGGREGATION-AND-RHYTHM.md | §1 |
| Seven candidate rules at a matched budget; correction-strength sweep to 388/922 | AGGREGATION-AND-RHYTHM.md | §2, §2.1 |
| 200 split-halves; 178 wins, 15 ties, 7 losses; per-bucket gains | AGGREGATION-AND-RHYTHM.md | §2 |
| Both runtimes at 0.984 and at 0.9855 / 0.9763; the 883 against 884 rounding note | AGGREGATION-AND-RHYTHM.md | §6 |
| Rebuilt half-AI corpus, 612/700 and 604/700, McNemar p = 0.027 | AGGREGATION-AND-RHYTHM.md | §6 |
| 268/922 and 168 train-split overlap; human 11/4,636 | corpus-reconciliation-2026-08-29/analysis.txt | §2 |
| Detector artefact, SHA-256 and temperature; shipped flag points | thresholds.json, via research-method.ts | whole file |
Every file named above ships with the open measurement repository, so any figure on this page can be re-run rather than taken on trust.