Skip to content

feat(classification): somebody who came straight in has to have stayed (ADR 0065) - #58

Merged
jagdish-kumawat merged 1 commit into
mainfrom
feat/2026-11-05-straight-in-has-to-stay
Nov 5, 2026
Merged

jagdish-kumawat merged 1 commit into
mainfrom
feat/2026-11-05-straight-in-has-to-stay

Conversation

@jagdish-kumawat

Copy link
Copy Markdown
Contributor

What

Ruleset 12.0. A visit that came straight in has to have stayed before it reads "A person".

Came straight in Reads
Ordinary window, under 15 s, or its leaving was never heard Couldn't tell
Ordinary window, 15 s or more A person
Over 2,560 tall and more than 2.2 times as tall as wide, under 15 s Something automated
The same window, 15 s or more A person · some signs, with the window against it

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

  • EngagementDetector
    • engagement.read_time weighs 60 at 15 s or more and 20 below it on a direct visit.
    • engagement.scrolled weighs 45 beside 15 s and 20 otherwise, under the 25 at which anything counts.
    • pointer_used and keyboard_used are 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, WhereOnlyTheNetworkObjects needs another site to have sent the visit, so a press no longer answers the network.
  • SessionSqlCompiler: reads viewport_height for the first time, stored since migration 0001. Reconstructing_Visits is re-approved in 4 places; Live_Visitors does not change. SettledIdentity.Settling does not gain the code.
  • Dashboard: sentences for the two new observations, height shown as a number, and read_time, left_open and pointer_used reworded. The visit trail counts seconds down, so 14.6 s never reads "15s".
  • Docs: ADR 0065, a "Revised by" line in 0016, 0035, 0037, 0052, 0054, 0056 and 0059, and the README's status lines.

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.

Now Under 12.0
People, last 30 days 3,031 2,733
People, whole record 5,482 5,020
Visits another site sent that move 0

Usage counts reports rather than verdicts, so no allowance moves.

Testing

  • All 15 local gates green on the last code, both editions:
    • Cloud builds, Ee.Tests 198, Ee.Integration 223 (22 skipped, payment sandbox);
    • Community build, Testing 11, Domain 117, Application 509, Classification 530, Architecture 27, Api 19, Sql 304, Mail 27, Integration 1065;
    • pnpm verify (web 1792, site 78, edition 124, tracker 84).
  • Only comments and the ADR changed after that run. The Community build, Classification and pnpm verify were re-run green.
  • 36 deliberate breakages (29 engine, 3 dashboard, 4 tracker) were each caught by a test.
  • Real Chromium on a rebuilt local stack:
    • 1200 × 3000 closed at once and at 5 s: suspicious-automation / moderate;
    • at 16 s: likely-human / moderate, window against;
    • sent by a search engine: likely-human / moderate, no window signal;
    • 1408 × 2957 and 1728 × 2957 closed at once: unknown / weak.
  • Screens looked at in light and dark at 360 and 1280 wide.

Before merging

  • The release must pair this with the matching change to the hosted website's /docs/verdicts copy, in the commercial edition's repository on a branch of the same name.
  • After release, history is judged again for 15 to 20 minutes, and screens fall gradually while it runs.
  • No migration, so going back is redeploying the previous release. ADR 0065 says what stays behind.

🤖 Generated with Claude Code

…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>
@jagdish-kumawat
jagdish-kumawat merged commit ff698a9 into main Nov 5, 2026
7 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