← WRITING
Perception 2026-09 · 7 min read

The anchor that learned to take a second photograph

A recognition reference frozen once looked like it was hitting a hard limit on murky footage. It wasn't the descriptor's ceiling — it was the cost of never re-photographing the thing you're trying to recognise.

The guard read, almost apologetically, not self._anchor.has_reference — the anchor snapped its reference image once, the first time it saw the target, and never refreshed it again. Measured against archive clips, inliers against that one frozen reference told the whole story:

mirpur_torpedo held 189/65/134/24 inliers at +1/+3/+5/+8 seconds. mirpur_torpedo_1 — the murkier of the two — fell to 69/43/51/12, under the 15-inlier trust bar at the +8s mark. Every clip's minimum was its own +8s column; the murkiest one crossed the failure line entirely. Run the same frames against a fresh reference instead of the stale one, and they score what the +1s column scored. Nothing about the descriptor changed. What changed was refusing to take a second photograph.

Composing, not replacing

The fix, CheckpointBank, holds up to five references over one backend rather than one photo forever — and it composes Anchor instead of replacing it, so the ROI scaling, the homography, the pose estimate and the below-bar refusal all stay code that had already been measured on real footage. What the bank adds is only the part a single frozen photo structurally can't: which reference answered, which one to discard, and when the evidence says it's time to take a new one.

A table of inlier counts says a match is good. It never says good at what.

Shipping the bank surfaced three more defects that no table would have shown, because pipeline_visual_check.py draws what the ladder actually believes — matched quad, surviving correspondences, warped annotations, identity verdict and its reason — on real footage, and looking at it for a few minutes found them. The sharpest: on close-range frames with the target filling the screen, the system refused every one at 7–8 inliers, because CONF_FLOOR = 0.60 rejected candidate views the detector itself only scores at p50 0.49 on this footage. A fixed floor was also the wrong shape of rule — recall on this stack swings 29.2% / 72.7% / 68.3% across venues, so one constant can't be right in all three. Dropped to 0.25, and left the checks that actually discriminate — geometric agreement, eviction by yield, a 40-inlier recognition bar — to do the job a threshold was standing in for.