These are the raw, unedited notes I wrote while shaping this article. They are closer to a brain dump than a prompt library: my thinking, philosophy, corrections, and direction. The ideas are mine. AI helped turn them into a smoother, more readable essay.
Research footprint
Open the evidence artifacts ↗These sessions cover the original research, implementation, later investigations, and publication. They also include shared analytics and follow-up work, so this is not an exclusive total for writing this article. Codex accounting sums the final cumulative counter before each reset and at the session cutoff. Claude Code accounting counts usage once per API message, removing repeated log records. The artifact count covers committed Markdown files in the linked research directory.
The included sessions span 96h 56m of elapsed wall-clock time, from to . The measured token total includes 192.1M input tokens (186.3M served from cache) and 875K output tokens. Reasoning tokens (259K) are already included in output. Elapsed time includes gaps between sessions and does not measure human hands-on work.
This is a provenance measure, not a quality score, cost estimate, or environmental-impact estimate. Token counts come from the private agent sessions identified in the public manifest, which records the log format, included session IDs, selected usage boundaries, and SHA-256 prefix commitments. The author can audit the totals against those logs; readers cannot independently reconstruct them without the private logs. The committed artifacts show the resulting work.
Browser-like
Bots
AI UAs
All
You need to ground yourself better
95-versus-14 discrepancy through controlled experiments.
The new [reproducible snapshot](/tmp/blog-analytics-evidence-20260906/report.md) gives us a firmer baseline for September 4–5:
- **372 requests had browser User-Agents; 95 remained in Browsers.** The rules reclassified 74.5%. That measures their effect, not their accuracy.
- **Cloudflare recorded 14 comparable script page loads**, leaving a 6.79× discrepancy.
- **22 Browser events belong to the investigated polling cluster.** Setting those aside still leaves a 5.21× discrepancy.
- **60 cloud-classified requests passed the navigation-header checks.** Network evidence adds information that those headers alone miss.
The remaining disagreement needs explanation. Script blocking, delivery loss, caching, different eligibility rules, owner traffic, and unidentified automation can all contribute. Cloudflare documents several of these collection limitations. [RUM FAQ](https://developers.cloudflare.com/web-analytics/faq/).
**These claims need correction now.**
| Current claim or implication | What the evidence supports |
|---|---|
| The two rules fix the reader count or close the problem | They remove substantial traffic from the Browser classification. The remaining population is uncalibrated. |
| A ratio below two validates the counter; above two diagnoses automation | Those thresholds were unsupported expectations. Counter agreement alone does not establish accuracy, and disagreement does not identify its cause. |
| Browsers is a lower bound on readership | It admits some automation and excludes some legitimate access. **Its error can run in both directions**, so it is not a defensible lower bound. |
| Signed requests establish software fetching because a person asked | Signatures establish an identity association under the verifier’s checks. Purpose requires separate evidence. |
| No signed requests have arrived | The recorded cohort contains **nine verified requests: five Ahrefs, two Exa, and two deliberate DuckAssist tests**. |
| Every row records its network provenance | All **1,797 recent rows inspected had null `asn_source`**. The ingestion INSERT omits it. |
| The production AI-agent classification checks vendor IP lists | The probe study performed those checks. Routine ingestion uses UA rules and signature verification; it does not perform that vendor-IP validation. |
These appear in the [current post 024 file](/Users/goga/Documents/goga/blog/packages/blog/posts/024-how-i-separate-readers-from-bots-without-javascript.md), README, or earlier research. They deserve factual correction without waiting for another implementation.
The signature distinction is especially important: Exa documents its signed client as a **search crawler**. The Web Bot Auth draft explicitly separates identity from human authentication, authorization, and delegation. [Exa documentation](https://crawler.exa.ai/), [protocol draft](https://datatracker.ietf.org/doc/html/draft-meunier-webbotauth-httpsig-protocol-01).
**Some of our earlier interpretations also need tightening—including mine.**
The estimate of approximately 21 people was too strong. It was a manual assessment of plausible reader-like **requests**, not a verified count of distinct people. Likewise, saying no additional people arrived after launch went beyond what the remaining rows could establish.
The original eleven-to-one comparison also mixed **daily client identifiers with visits**. That was a useful alarm, but those units differ. Our new comparison uses page events versus page loads with explicit exclusions.
And routine ChatGPT-UA requests should not become a count of reads. A declared fetcher, a verified provider request, a user-directed retrieval, and someone consuming the content are different observations.
**What remains strong is more useful than the overclaims.**
We now have concrete examples of browser-shaped automation on both hosting and consumer networks. We have working signature verification producing real observations. We found a reproducible `Accept` parsing defect and missing provenance. We also learned that the existing repair was only partly released: migration completion had been mistaken for implementation completion.
My recommendation is:
1. **Correct the factual and semantic claims first**, including metadata that promises a resolved count.
2. **Finish provenance, identity/purpose separation, and the existing deployment repair.**
3. **Run the controlled-client experiments** to distinguish classification errors from collection differences.
The larger change in expectation is this: analytics can give us increasingly specific evidence about access and distribution. Establishing how many people—or agents acting for people—actually used the writing requires additional evidence that our counters do not currently provide.
They now distinguish:
- Completed: research plan, extractor, production capture, validation.
- Pending: article corrections, classification wording, deployment verification.
- Ongoing: discrepancy investigation and longer calibration.
Retired unsupported accuracy thresholds while preserving historical evidence. All 23 local links resolve; whitespace checks pass. No article or production changes.
1. **Correct the claims because the evidence already contradicts them.**
Our September 4–5 capture shows the rules reduced 372 browser-UA observations to 95 Browser HTML observations—a 74.5% reduction. That establishes how much the rules change the count. Establishing accuracy would also require knowing which excluded requests were human and which remaining requests were automated. We don’t have those labels. Calling the result an accurate reader count, or a lower bound on people, therefore goes beyond our evidence. [Saved findings and correction ledger](/Users/goga/Documents/goga/blog/packages/blog/drafts/research/readers-vs-bots/16-claims-and-work-status-2026-09-06.md)
The signature claim has an especially clear counterexample: Exa documents that its **search crawler signs requests**. A valid signature can support attribution to a signer under the verifier’s trust rules; it does not independently establish a human trigger. That follows from the mechanism in RFC 9421 and Exa’s documented use of it. Keeping signature verification is useful; changing what we infer from it is necessary. [RFC 9421](https://www.rfc-editor.org/rfc/rfc9421.html#section-3.2), [Exa’s crawler documentation](https://crawler.exa.ai/)
**Why do this now?** Further experiments may explain traffic, but they cannot justify retaining claims we already know are unsupported.
2. **Investigate the 95-versus-14 gap because either measurement can miss or include different things.**
D1 records server observations; Cloudflare RUM depends on browser-side collection. Cloudflare explicitly documents beacon blocking and delivery loss. Our returned RUM groups were unsampled, which removes one explanation for this particular query; it does not establish complete collection. [Cloudflare FAQ](https://developers.cloudflare.com/web-analytics/faq/)
Consequently, subtracting 14 from 95 does **not** establish 81 bots or 81 lost beacons. We have not established that the two counts represent matching events. Our existing-data investigation found candidate correlations for 77 D1 rows, but no shared request identifier that makes those joins conclusive. [Diagnostic evidence and limitations](/Users/goga/Documents/goga/blog/packages/blog/drafts/research/readers-vs-bots/15-existing-cloudflare-evidence-2026-09-06.md)
**Why controlled visits?** Knowing what generated a request lets us test the mechanism. For example, repeat the same browser navigation with the beacon allowed and blocked, observing the network and stored results. That can demonstrate a cause of disagreement. It still cannot establish how common that cause was in historical traffic.
3. **Fix known defects because they have independently checkable expected behavior.**
Our local reproduction treats `Accept: text/html;q=0` as accepting HTML. HTTP specifies that zero quality means unacceptable. This gives us a concrete correctness test; we don’t need to infer the visitor’s identity to establish the defect. Its historical contribution remains unknown because we retained only a boolean. [RFC 9110, quality values and Accept](https://www.rfc-editor.org/rfc/rfc9110.html#section-12.4.2), [reproduction record](/Users/goga/Documents/goga/blog/packages/blog/drafts/research/readers-vs-bots/15-existing-cloudflare-evidence-2026-09-06.md)
Missing network provenance and uncertain deployment state similarly undermine interpretation: we need to know what evidence and code produced a classification before evaluating it. Those gaps are recorded in the ledger above.
4. **Choose additional data by the question it resolves.**
The most useful additions may be collection outcomes, classification reasons, and build versions. They answer whether an observation was attempted, excluded, failed, or processed under different code. There is concrete prior art: Plausible’s ingestion code records buffered/dropped outcomes, drop reasons, parser timeouts, pipeline timings, and tracker versions. That supports the design direction; it does not prove we need every field. [Plausible source at the reviewed revision](https://github.com/plausible/analytics/blob/543b30185c104ce17900d03c95d95429180acc0b/lib/plausible/ingestion/event.ex#L82-L154)
I would adjust my earlier ordering slightly: **preserve the time-sensitive evidence first**, then make the compact corrections and run the controlled checks. Cloudflare retains unsampled beacon data for seven days before longer-term aggregation, so waiting until September 17 to collect would weaken the comparison. [Cloudflare retention and sampling](https://developers.cloudflare.com/web-analytics/faq/#is-the-data-sampled)
The engineering objective is to explain specific counting failures and correct them. A smaller Browser total—or closer agreement with RUM—would not, by itself, demonstrate improvement.