Look at the Pixels Before You Trust the Number
The plate locator returned the full search-band width on nearly every frame. It was not finding the chip. It was saturating the whole band and reporting a clean number for garbage.
View companion repoThe number that never changed
I was debugging a video detector when a plate-locator routine started looking like a success. The numbers were stable. They were also wrong.
On nearly every frame the locator printed plateW=891, x0=0, x1=891. A width that did not move. A left edge pinned at the origin. A right edge that landed on the same 891. I read the repeated output as a warning.
The session file is 2036d46d-e42c-45b8-be2a-1781547959f6.jsonl, line 651. The operator's verdict was not that the locator was confident. It was that the plate locator was broken. Those three numbers were the confession.
Repeatability is not validity. plateW=891, x0=0, x1=891 on nearly every frame is a stable triple. Stability is what a lock looks like in a log. It is also what a rail looks like. The first session did not treat the repeat as a found chip. Line 651 of 2036d46d-e42c-45b8-be2a-1781547959f6.jsonl called the plate locator broken and named those three numbers as the evidence.
Unpack the three values as one interval. x0=0 is the left boundary of the reported box, sitting on the origin of the search. x1=891 is the right boundary. plateW=891 is the distance between them. Left at 0, right at 891, width 891: the box and the window share the same span. A located chip would occupy some interior of the 62%-width band. This interval is the band.
What a saturated locator looks like in numbers
Saturation is easy to miss if you only read the log. The printout is tidy. The keys are the keys you asked for. plateW, x0, x1.
Look at the geometry those three values describe. x0=0 means the box starts at the left of the search region. x1=891 means it ends at 891. plateW=891 means the width is the distance between those two edges. The box is the region. There is no inset. There is no chip.
Line 651 of 2036d46d-e42c-45b8-be2a-1781547959f6.jsonl named the region: the locator was saturating the whole 62%-width band, not finding the chip. The band was the search window. The locator returned the window and called it a plate.
Saturating the whole 62%-width band is the same fact written in English. The search band is 62% of the frame width. The locator's job is to find a chip inside that band. Returning x0=0 and x1=891 means the reported edges are the band edges. Returning plateW=891 on nearly every frame means the width did not shrink to a chip. Full-band equality is the saturation test: if the printed interval equals the search interval, you did not locate an object. You reprinted the crop.
The log can be reproduced. Reproducing a full-band box does not make it a plate. Validity would require the box to sit inside the band, not on it. Repeatability here is the warning, not the proof. A locator that returns the same interval on nearly every frame has stopped responding to its input, and a measurement that cannot vary with what it measures is not reporting on the frame at all.
Zero is not a neutral left edge. x0=0 says the reported box begins where the search begins. 891 is not a lucky chip width. x1=891 says the reported box ends where a 891-wide window ends, and plateW=891 restates that span. Three fields, one interval, the interval of the crop. That is what a saturated locator looks like in numbers.
Why a stable signal is not a correct signal
Agents love a number that does not move. Stability looks like a lock. In a detector, a lock that never updates is often a sensor pressed against its maximum.
A numeric signal that looks stable can be a saturated sensor. Opening the actual frames is what separates a measurement from a coincidence. That sentence is the thesis of this post, and it is also the next action the session recorded after the diagnosis. Stop treating the log as vision. Open frames.
Frame inspection is the required falsification step. plateW=891 does not say whether the box is a chip or the band. Only a frame can. Line 651 already states the method after the numbers: look at the pixels before trusting a number. Opening actual frames is the next action in that line. If the drawn box fills the 62%-width band, the scalar is saturated. If the drawn box is a chip inside the band, the scalar is a location. Until that check runs, 891 is a width, not a detection.
The diagram below is that distinction, not a new measurement. Left: a chip box inside the violet search band. Right: a crimson box that is the band, labeled x0=0, x1=891, plateW=891. Both pictures can sit under the same kind of log line. Only the pixels separate them.
The left box is what a locator is for. The right box is what the first session described. Both pictures can sit under a log line that looks like a measurement. Only one of them is a plate.
A coincidence can print copiously. plateW, x0, and x1 are the fields a working locator would print. The names do not certify the geometry. Full-band equality is the check the names cannot perform. Visual inspection is the check that can fail.
The threshold that was catching the wrong dark thing
The locator used a darkness cut: g<95. The intent was to pick up the plate chip. Dark pixels in a small region. A chip, not a scene.
The threshold g<95 was catching dark video content rather than the intended plate chip, so the locator saturated the band and reported x0=0, x1=891, plateW=891.
The operator's words in that same line: "Measuring garbage." The iron rule from the project: look at the pixels before trusting a number. The next action was not a new threshold. It was opening actual frames.
g<95 is the darkness cut named in the same line as the three numbers. Catching dark video content rather than the plate is the failure mode named there. Measuring garbage is the operator's verdict there. The threshold, the full-band box, and the garbage label are one event: a cut that fired on the scene, a locator that filled the 62%-width band, and a clean triple that is not a chip.
Retuning g<95 without a frame would still be trusting a number. The first session did not take that path. The next action was opening actual frames.
A darkness cut is a predicate over pixels. If the pixels in the search band are dark because the video is dark, g<95 is true of the scene. The plate chip is the intended dark thing. Video content is the actual dark thing named in line 651 of 2036d46d-e42c-45b8-be2a-1781547959f6.jsonl. The locator then reported the band. The scalar did not become more true by repeating.
The second case: checking a docstring against actual rows
A different lane in the same investigation hit a cousin of this, and it was a prior claim in the same codebase.
The session is agent-afa-w2-02bd3e3efc984d5d.jsonl, line 20. The algorithm had been read. The docstring claimed a settled label at 0.6854 continuously from decode 1663. Tail median 0.6812 as scroll-out at 1923-24. Frame height 3236, so 0.6854 is about y=2218 px. The next sentence was not that the docstring is ground truth. It was: "Let me look at the pixels."
That is the same discipline applied inward. A ratio in a docstring is still a number. Converting it to a pixel row is the minimum translation that makes the claim inspectable. y=2218 is a place on a frame. 0.6854 is a story about a place. Until someone opens the frame at that row, the settled-label claim is an unverified caption.
The first citation is a locator saturating a band. The second is a documented ratio waiting to be checked against rows. Both fail the same way if you stop at the number. Both recover the same way if you open the frame.
The second session applies the same falsification step to a prior claim. agent-afa-w2-02bd3e3efc984d5d.jsonl, line 20, did not accept 0.6854 because it lived in a docstring. It converted the ratio against frame height 3236, named y=2218, and then said: Let me look at the pixels. Decode 1663 is where the docstring said the settled label ran continuously from. Tail median 0.6812 is named as scroll-out at 1923-24. Those figures are as checkable as plateW=891. They become a row. The row has to be opened.
Externally produced locator output and an internally produced docstring fail in the same way if you stop at the printout. They recover in the same way if you inspect the referent. For plateW=891, x0=0, x1=891 the referent is the search band on the frame. For 0.6854 the referent is row 2218 on a 3236-tall frame. The iron rule does not care which file produced the number.
0.6854 times 3236 is a row. The row is either a settled label or it is not. The docstring cannot vote. The pixels can.
Four decimal places do not add a frame. A decode index does not add a frame. A unit conversion in prose, 0.6854 to y=2218, is the start of inspection, not the end. Line 20 of agent-afa-w2-02bd3e3efc984d5d.jsonl stops at the same place the first session stops: look at the pixels.
The rule: open the frame before tuning the constant
I read the constant, stable locator output as a reason to stop and inspect the frames.
If plateW equals the search band, the locator did not locate. If x0 is 0 and x1 is the band width on nearly every frame, you are reading the window, not the object. If a docstring hands you 0.6854, convert it to a row and look. Do not retune g<95 until the pixels have voted.
The session at 2036d46d-e42c-45b8-be2a-1781547959f6.jsonl, line 651, already had the sequence. Name the saturation. Name the wrong dark thing. Call the measurement garbage. Then open actual frames. The iron rule is the last clause, not a caption added after a successful retune.
Do not retune g<95 until the pixels have voted is the same sentence as look at the pixels before trusting a number. The first session named g<95 as the threshold catching the wrong dark thing. Changing that constant without opening frames would leave the measurement unfalsified. The second session named 0.6854 as a settled-label ratio and converted it to a row. Both lanes stop at the frame.
A stable scalar is not an invitation to edit a constant. It is an invitation to render the referent of the scalar. For a plate locator, the referent is a box on a frame. For a settled-label ratio, the referent is a pixel row. If you cannot point at the pixels, you do not have a measurement. You have a coincidence that printed cleanly.
The two sessions agree on the method. One object is a plate chip that became a full-band box: plateW=891, x0=0, x1=891 on nearly every frame, saturating the 62%-width band, g<95 catching dark video content, measuring garbage. The other object is a settled-label ratio, 0.6854 from decode 1663, frame height 3236, y about 2218. In both cases the next honest step is the frame, not a new constant.
The diagram above is the whole method. Two boxes. Two logs that can look equally official. One box is a chip inside a band. The other is the band reporting plateW=891, x0=0, x1=891. Look at the pixels before you trust the number.
Continue the series
- 58SeriesThe Truthy Type: How One `or` Silently Dropped Half the Corpusrole = r.get("type") or m.get("role") reads "message", which is truthy, so the inner "user" is never seen. One session format parsed. The other silently yielded nothing.
- 60SeriesThe Vacuous Pass: Three of Four Green Checks Proved NothingThe harness was worse than the note claimed. Three of the four passing checks were vacuous — they could not fail. A check that cannot fail is a caption, not a gate.
- 57SeriesThe Poisoned Corpus: When Agent Chatter Becomes What the User Asked ForTurn 1 of the corpus was a teammate-message orchestrator dispatch, not a human-typed turn. The is_human filter did not exclude it, so every downstream agent would read lane dispatch as user intent.
- 61SeriesThe Tool That Was Never There: Two Ways an Agent Misses a Tool, Only One Emits an ErrorSixteen unavailable-tool events in 30 days, every one a structured tool error an orchestrator can catch. Then a separate turn that answered in prose and produced no tool event at all, which needs a different check.