vibeapp.win

What brokeUpdated 3 October 2026

A badge that counted 55 bottles, and a 0–1 score shown as /5

On one day in June 2026, three fixes in the wine cellar app had the same cause: a number didn't mean what the label next to it said. A badge counted every drinkable bottle, a 0–1 score was shown "/5", and alcohol values compared as text produced 57 false conflicts.

The short version

What went wrongA badge counted all drinkable bottles (55), a 0–1 score was shown as "/5", and alcohol values compared as text gave 57 false conflicts.

How we found itEach number was read next to its label and contradicted it, and the commit messages state the contradictions.

The rule nowCheck that a number means what its label says, including scale and definition, and compare numeric values as numbers, not strings.

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 13 June 2026 we committed three fixes to the wine cellar app within about five hours. Each one fixed a different bug, but they all came down to the same thing. A number was on screen, a label sat next to it, and the two disagreed.

A note on attribution before we start. Henning writes no code himself, so the code behind all three bugs was Claude’s. The commit messages describe what was wrong and how it was fixed, but they don’t say who found each problem.

1. The badge that said 55

The app puts a badge on its icon for bottles you should drink now. The idea is a small number you can act on tonight.

The badge showed 55. The commit from 21:06 that evening explains why. The count included every bottle inside its drink window, even bottles marked “ready” that had only just entered it. The commit calls that meaningless as a signal.

The fix changed what the badge counts. It now counts only bottles at their peak or past it. It uses the same classification as the home screen’s “I kveld” (“Tonight”) list, so the badge and the list now agree. The fix also leaves out bottles flagged as external. The commit gives the result: 55 → 11, which it calls actually actionable.

The old count wasn’t wrong in a technical sense. It counted exactly what the query asked for. The problem was that the query answered a different question from the one the badge claimed to answer.

2. “Strong vintage (score 0.8/5)”

The bottle detail page has a section explaining the drink window, with an assessment of the vintage. The data stores that assessment as a rating from 0 to 1.

The page printed the raw value with “/5” after it. A strong vintage appeared as “(score 0,8/5)” right next to the label “Sterk årgang” (strong vintage). The commit from 19:08 puts it plainly: the number contradicted the label and read as weak.

So one line said “strong” and the number beside it said under 1 out of 5. The fix multiplies the score by five before displaying it. 0.85 now shows as “4,3 av 5” (4.3 out of 5). The commit says the goal was to make number and label agree.

The fix replaced one line of display code and added a comment. The bug sat in the step where a value went from one scale onto a screen that claimed a different scale.

3. 57 conflicts that weren’t

The third fix came earlier the same day, at 16:30, inside a larger commit about checking bottles against Vinmonopolet, Norway’s state wine retailer.

When a bottle is linked to a Vinmonopolet product, the app compares its own fields with the retailer’s and flags any that differ. Alcohol content was one of those fields, and it was compared as text. “13.50” and “13.5” are different strings, so they counted as a conflict.

The commit records the outcome: 57 false conflicts from the string comparison of alcohol values. The fix compares alcohol as a number. Other text fields are still compared as trimmed, case-insensitive text.

The same commit did some cleanup, all documented in its message:

  • It made a one-time pass over all 66 bottles linked to Vinmonopolet. The pass filled in 9 empty fields and made producer and name consistent for 2 duplicates linked to the same Vinmonopolet product.
  • It cleared noisy conflict flags from 80 bottles. The commit says these came from an old label audit and from flagging everything in bulk.
  • It made verification opt-in, one bottle at a time, with a new “Hent/verifiser på nytt” (fetch/verify again) button on the bottle page. The stated aim: only real discrepancies are shown.

The commit also notes a limitation it doesn’t fix. Vinmonopolet doesn’t expose a clean producer field, only a shortened combined title. So the producer comes from the app’s own best value, kept consistent across duplicates.

What the three have in common

The badge returned a valid count. The score was a valid float. The comparison correctly reported that two strings differed.

Each one only became visible next to something else: the badge next to what a person can actually drink tonight, the score next to the word “strong”, 57 conflicts next to the fact that 13.50 and 13.5 are the same alcohol content. The commit messages for the score and the badge state the contradiction directly. The alcohol fix names the string comparison as the bug.

That points to how this kind of bug gets caught. You read the screen with the data in hand and ask whether each number says what its label says. A count of 55 under “drink now” should raise a question. So should a “strong” vintage scoring under 1 out of 5. So should 57 conflicts on alcohol content.

The rule

Two rules came out of that day:

  1. Check that a number means what its label says. Before shipping a count, a score or a flag, read it next to its label and ask whether a person would draw the right conclusion. Check the scale (0–1 versus out of 5) and the definition (in the window versus urgent).
  2. Compare numbers as numbers. Never compare numeric values as strings. “13.50” and “13.5” are the same value. Convert both sides and compare with a tolerance suited to the field.

Corrections

  1. Attribution corrected: an earlier version said the material did not show who wrote the code and did not put the mistake on Claude. Henning writes no code himself; the code was written by Claude.