vibeapp.win

What brokeUpdated 3 October 2026

The exam was poisoned by the same wrong boxes as the training set

In the monitoring app, 16 of the 195 answer boxes in the detector's exam were a static object labelled "person". All 16 sat in the part of the exam that fails candidate models, so the gate penalised the exact behaviour it was meant to reward. We rebuilt the exam from corrected rows, and older scores on two of its parts can no longer be compared with newer ones.

The short version

What went wrongThe detector's exam was built from the same false "person" labels as the training set. 16 of 195 answer boxes were a static object, all in the regression part, so the gate penalised the right behaviour.

How we found itAfter the training data problem was found, the exam was rebuilt from the corrected database, and the same object turned up in its answer key.

The rule nowWhen a labelling error is found in training data, check the exam for it and rebuild the exam from corrected rows. Mark the score break, since older regression and background scores no longer compare.

This post documents something Claude got wrong. The claim rests on a commit or a file, not on memory. All of Claude's mistakes

On 22 August 2026 we found that the monitoring app had been teaching its object detector something false. Fixing that turned up a second problem: the exam we used to decide whether a new detector model could be deployed had been built from the same false labels.

This post is about the exam. The training data problem comes first, because it explains how the exam went wrong.

The training data problem

The monitoring app retrains its detector from its own images. A boxing job lets the current detector draw boxes around objects, and a Claude verdict on the image decides which boxes to trust. The design decision log describes the weakness plainly: the verdict says what is in the image, not where. If the verdict said “person”, it vouched for every person box the detector had drawn.

One of those boxes was always wrong. The detector called a static object “person”, with scores between 0.7 and 0.85. The log counts the damage: 78 training samples carried 80 such boxes. In the log’s words (translated from Norwegian), the model got “its own mistake back as the answer key, night after night”.

The question that led to the find came from Henning: why couldn’t the model learn this object? The log’s answer: “we taught it the opposite.” Adding more background images could not help. While those images said the object was nothing, the positive images were teaching it that the object was a person.

The exam was built from the same rows

The exam is the gate for candidate models. It has several parts. One of them, the regression part, is the axis that fails candidates.

The commit that rebuilt the exam from the corrected database says:

16 of 195 ground truth boxes were [the object] labelled person, all of them in the regression part, which is the axis that fails candidates. A model that stopped calling [the object] a person would have lost on it. The gate was punishing the exact behaviour it exists to produce.

So the gate pointed the wrong way. A candidate that had learned the right lesson would have scored worse on regression than one that kept the mistake. The training set and the exam agreed with each other, because both came from the same wrong rows.

Who got it wrong

The decision log entry is titled “We taught the model that [the object] is a human”, with “we”, not “Claude”. Henning writes no code himself, so the pipeline code was Claude’s. It used a Claude verdict, running as part of the app, to vouch for box positions, although the verdict speaks to what is in the image, not where. A class-level judgment stood in for a position-level one, and the exam was then built from that pipeline’s output.

The fix

The training side and the exam side are fixed in the same decision log entry, dated 22 August.

Training data. Hand-drawn masks are now read by the boxing job. A box is thrown out if its bottom point falls inside a mask. All 80 existing bad boxes were stripped. 37 samples had no other box, so they became background images, which is the correct label for an image whose only “person” was not a person.

The exam. The commit rebuilt it from the corrected database:

  • Same 213 images, same rows, true labels.
  • Eight images lost every box and moved to the background part.
  • Regression went from 149 to 133 boxes. Background went from 69 to 77 images.
  • The failure-image part was not touched.

Re-measurement. On the corrected exam, the deployed model still clearly beat the stock COCO model. It found clearly more than the stock model, both on whole frames and on crops. The log’s conclusion: the deployment decision held, “now against an answer key that doesn’t lie”.

The boxing job now logs how many boxes the mask had to throw away each night. If that number falls toward zero, the model has stopped seeing the object as a person on its own. That signal costs the operator nothing.

The rule

When a labelling error is found in training data, check the exam for the same error, and if it is there, rebuild the exam from the corrected rows instead of patching it by hand. A gate built from the same source as the training set will share that source’s mistakes, and it will penalise the model that learns to avoid them.

Then mark the break. Scores from before 08:40 on 22 August 2026 are not comparable with later scores on the regression and background parts. The failure-image part was unchanged, so its numbers still compare.

Corrections

  1. Attribution corrected: an earlier version did not attribute the pipeline design to Claude. Henning writes no code himself; the pipeline code was written by Claude.