Repository navigation
feat(classification): somebody who came straight in has to have stayed (ADR 0065) - #58
Merged
Merged
Conversation
…d (ADR 0065) One browser shape, a 1200 x 3000 window on Chrome 148 on Linux, en-US, with a clock eight hours ahead of UTC, reached the hosted installation as 246 page views from 138 networks with no referring address. It stayed 483 ms at the median and read "A person": depth counts the first screen, and a window that tall shows a third of a page without anybody scrolling, so the tracker and a page seen were two things agreeing. Ruleset 12.0 changes what a visit nothing named a sender for can be called. A visit another site sent is judged exactly as under 11.0, in category, band and signals. On a visit that came straight in (SessionEvidence.SentByAnotherSite false): - engagement.read_time weighs 60 at 15 s or more and 20 below it. engagement.scrolled weighs 45 beside 15 s and 20 otherwise, under the 25 at which anything counts. Time is still Read(session), engaged less left open (ADR 0059). - engagement.pointer_used and keyboard_used are Neutral at weight 0. A press can stop a visit being called silent and never makes one a person, and it no longer answers a rented network: EvidenceScorecard.WhereOnlyTheNetworkObjects needs another site to have sent the visit. - engagement.brief_stay (new, Neutral, 0) says why a short stay did not count, beside an open answer only, and never of a visitor still on the site. - browser.oversized_window (new, 55 toward automation): over 2,560 tall, more than 2.2 times as tall as wide, and no `Mobi` in the user agent. Under 15 s it reads SuspiciousAutomation/Moderate, or Strong over a rented network. At 15 s or more it reads LikelyHuman/Moderate with the window against it. A named crawler keeps its category and Verified stays Verified. 2.2 spares a browser filling a screen held upright at any zoom (1.78 at most) with a side panel open (2.10 on upright 4K at 125%); every window measured from the fleet is 2.34 or more. SessionSqlCompiler reads viewport_height for the first time, stored since migration 0001. The live reading's statement does not change and leaves the height null, and SettledIdentity.Settling does not gain the code, because a window is weighed and can be outweighed (ADR 0036). Dashboard: sentences for the two new observations, `height` among the values shown as numbers, and read_time, left_open and pointer_used reworded to say only what was seen. The visit trail counts seconds down, so 14.6 s never reads "15s" above "under 15 seconds". Simulated read-only over the newest stored verdict of every visit as of 2026-11-05 11:30 UTC, with a control that reproduces every stored category and band: people over thirty days 3,031 -> 2,733, the whole record 5,482 -> 5,020, and no visit another site sent moves. A major ruleset walks history again, 15 to 20 minutes on the hosted installation, during which screens fall gradually. Usage counts reports rather than verdicts, so no allowance moves. No migration, no tracker change and nothing new collected or retained; a page read as automated now has its address looked up while it is kept, as ADR 0065 records. Revises ADRs 0016, 0035, 0037, 0052, 0054, 0056 and 0059. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Ruleset 12.0. A visit that came straight in has to have stayed before it reads "A person".
A click or key press counts for nothing toward "A person" on such a visit. A visit another site sent is judged exactly as under 11.0, in category, band and signals, and a test pins that.
The decision, its figures and what it leaves open are in ADR 0065.
Why
The hosted installation's operator reported a great deal of direct traffic marked as people, most of it on Linux, staying no time at all and yet having scrolled.
Measured read-only as of 2026-11-05 11:30 UTC, it is one browser shape: a 1200 × 3000 window, Chrome 148 on Linux, en-US, a clock eight hours ahead of UTC. It made 246 page views from 138 networks with no referring address, and stayed 483 ms at the median.
It read "A person" because depth counts the first screen. A window that tall shows a third of a page without anybody scrolling, so the tracker and a page seen were two things agreeing. ADRs 0056 and 0059 both recorded this gap.
How
EngagementDetectorengagement.read_timeweighs 60 at 15 s or more and 20 below it on a direct visit.engagement.scrolledweighs 45 beside 15 s and 20 otherwise, under the 25 at which anything counts.pointer_usedandkeyboard_usedare Neutral at weight 0. They stay on the record and still stop a visit being called silent.engagement.brief_stay(new, Neutral) says why a short stay did not count, beside an open answer only.ClientDeclarationDetector:browser.oversized_window(new, 55 toward automation), with a phone (Mobi) and any sent visit exempt.EvidenceScorecard: on a rented network,WhereOnlyTheNetworkObjectsneeds another site to have sent the visit, so a press no longer answers the network.SessionSqlCompiler: readsviewport_heightfor the first time, stored since migration 0001.Reconstructing_Visitsis re-approved in 4 places;Live_Visitorsdoes not change.SettledIdentity.Settlingdoes not gain the code.heightshown as a number, andread_time,left_openandpointer_usedreworded. The visit trail counts seconds down, so 14.6 s never reads "15s".The approved shape line was 1.8. It moved to 2.2 in review: 320 px of side panel on an upright 4K screen at 125% is 2.10, and every fleet window measured is 2.34 or more, so no figure moves.
What it does to the figures
Simulated read-only over the newest stored verdict of every visit, as of 2026-11-05 11:30 UTC. A control replay of the 11.0 rules reproduces every stored category and band, with 0 differences.
Usage counts reports rather than verdicts, so no allowance moves.
Testing
Ee.Tests198,Ee.Integration223 (22 skipped, payment sandbox);pnpm verify(web 1792, site 78, edition 124, tracker 84).pnpm verifywere re-run green.suspicious-automation / moderate;likely-human / moderate, window against;likely-human / moderate, no window signal;unknown / weak.Before merging
/docs/verdictscopy, in the commercial edition's repository on a branch of the same name.🤖 Generated with Claude Code