Count the frames the collector drops as unchanged, and make the count a record #7

Merged
LNK merged 1 commit from claude/stills into main 2026-09-04 18:04:17 +00:00
Contributor

The last item on the review's list that was a bug rather than a foundation: the frames collector's dedupe dropped unchanged screens silently, so a static hour was indistinguishable from capture having stopped.

What changes. The drops are counted and the count is a record, here.frame.still.v1: window, app, how many looks found the screen unchanged, and since when. One goes out per minute of the same screen and one more when the run ends, sent just before the frame that ends it and measured from the frame before. Counts and the window, never pixels or a hash, so it carries no content and passes as timing for allowed and denied apps alike. The counting is one state machine shared by both collector bodies. A still earns no card on the pill; the console, the pill's history and the admin view describe it in words.

Proof. A minute of static screen is one frame plus one still of thirty, not thirty holes; a change flushes the run before the frame; the second minute is measured from the first report; the record carries no pixels; at the gate a still from a denied app keeps its count. The first test fails against a counter that never reports, checked by making it one. Linux verifier green on the pinned toolchain.

Not checked here. The Windows body cannot be cross-checked from Linux: a dependency's build script wants the Windows SDK. The two call sites mirror each other and verify.ps1 is the remaining proof.

The last item on the review's list that was a bug rather than a foundation: the frames collector's dedupe dropped unchanged screens silently, so a static hour was indistinguishable from capture having stopped. **What changes.** The drops are counted and the count is a record, `here.frame.still.v1`: window, app, how many looks found the screen unchanged, and since when. One goes out per minute of the same screen and one more when the run ends, sent just before the frame that ends it and measured from the frame before. Counts and the window, never pixels or a hash, so it carries no content and passes as timing for allowed and denied apps alike. The counting is one state machine shared by both collector bodies. A still earns no card on the pill; the console, the pill's history and the admin view describe it in words. **Proof.** A minute of static screen is one frame plus one still of thirty, not thirty holes; a change flushes the run before the frame; the second minute is measured from the first report; the record carries no pixels; at the gate a still from a denied app keeps its count. The first test fails against a counter that never reports, checked by making it one. Linux verifier green on the pinned toolchain. **Not checked here.** The Windows body cannot be cross-checked from Linux: a dependency's build script wants the Windows SDK. The two call sites mirror each other and `verify.ps1` is the remaining proof.
The frames collector looks every two seconds and drops a frame that hashes the same as the
last one. That is the right thing to do with the pixels and the wrong thing to do with the
timeline: an hour of a static editor was an hour with no record in it, indistinguishable
from an hour in which capture had stopped, and anything fusing this with a second sense
would read that hour as nothing having happened. "Suppression is a record, not a hole" was
the rule for the gate's verdicts; the collector's own drops were the exception nobody wrote
down.

Now the drops are counted and the count is a record, `here.frame.still.v1`: the window, the
app, how many looks found the screen unchanged, and since when. One goes out after a minute
of the same screen, and one more when the run ends — sent just before the frame that ends
it, and measured from the frame before, so a frame is never preceded by a hole. Counts and
the window, never pixels or a hash, so it carries no content: L0 judges the window as it
would a frame and a still passes as timing for an allowed app and a denied one alike, the
way a suppressed frame keeps its timing. The registry, the manifest and the schema say all
of that; codegen and lint carry it.

The counting is one small state machine shared by both bodies, so Windows and macOS count
the same way and its tests run on every platform. It earns no card on the pill: narrating
"the screen stayed the same" every minute is how a pill gets hidden, and the capture it
refers to was narrated when it was taken. The console, the pill's history and the admin
view each say what a still is in words.

Tests: a minute of static screen is one frame and one still record of thirty, not thirty
holes; a change flushes the run before the frame goes out; the second minute is measured
from the first report; the record carries counts and the app and no pixels; at the gate a
still from a denied app is stored with its count. The first fails against a counter that
never reports — checked, by making it one.

Not checked here: the Windows body compiles against here-win, whose dependency chain wants
the Windows SDK for SQLite, so the cross-check from Linux stops at a build script. The shared
counter is what the tests prove; the two call sites mirror each other line for line and
`verify.ps1` is the remaining proof.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
LNK merged commit 377b6c2b00 into main 2026-09-04 18:04:17 +00:00
LNK referenced this pull request from a commit 2026-09-04 18:04:17 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mikebrandon/here-telemetry-rnd!7
No description provided.