vibeapp.win

What broke

The previewed Reel was not the Reel that shipped

On 2026-10-12 a test run on a real story turned up four bugs in the newsroom engine's Reel pipeline. The worst: if the draft was edited after its Reel had been made, the Reel that would go out was a different film from the one Henning had previewed. A quote card also showed indirect speech as a quote. Claude wrote all the code involved, and all four bugs were fixed the same evening.

The short version

What went wrongIf a draft was edited after its Reel was made, publishing reset the director's script, so a different fallback film would be sent than the one Henning previewed.

How we found itA real-story test run on 2026-10-12 turned up four Reel bugs. The worker had assumed an edited draft was updated at publish time, and that assumption was wrong.

The rule nowWhat gets approved must be what gets sent: rebuild the Reel when the draft changes, hold a Reel with no script for a human, and allow quote cards only for text the story marks as a quote.

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

The newsroom engine writes the news for kokkekunst.no, and each story now gets an Instagram Reel before it is published. Henning sees that Reel on the story page and under Deling, the engine’s sharing screen. The Reel goes out on Instagram about eight minutes after the story. There is no separate approval step for the Reel. Publishing the story counts as approving it.

That only works if the film Henning watched is the film that gets sent. On 2026-10-12 we found that the code did not guarantee it. Claude wrote all the code involved. Henning writes no code, so these are Claude’s bugs.

How we found it

The test was not planned. Henning asked why so few stories were coming through. The answer was that nothing was broken. The sources had delivered little of interest since the national championship on 2 October, and Henning had rejected the two drafts that were good enough. He then asked to publish one story anyway, with a Reel, to try out the new Reel engine. It was a story from 7 October about state support for a trade organisation. According to the session notes, the story was reopened and revised to version 5, with all six gates passing. A government budget document was added as a second source.

That one real run turned up four bugs. The fix commit lists them in order. Below, the two that matter most come first.

Bug 1: the edited draft

The Reel engine uses a director: a model call that writes a script for each Reel (mood, light, scenes). The worker checks the queue every minute and makes a Reel for any story that doesn’t have one. It skips stories that already have a Reel, because preparing a Reel fetches championship data, and doing that every minute for every story would be wasteful.

The old code comment explained the reasoning (translated from Norwegian):

“An edited draft is updated when it is published.”

That assumption was wrong. If someone edited the draft after the Reel was made, the stored article was only updated at publish time. That update reset the director’s script. The commit describes what the code did next (translated):

“The direction was reset and the Reel released drawn by the rules — a different film from the one previewed.”

“Drawn by the rules” means the fallback version, built from fixed rules without the director’s script. So with the old code, Henning would have approved one film by publishing, and Instagram would have received another. No mismatched Reel went out: according to the session notes, the story was still waiting for Henning to publish it. This is the same promise the changelog had already made to him: “The preview and the Reel that is sent build on the same script.” The session notes call this one “the most serious”.

The fix has two parts:

  • The worker now checks whether the draft has changed since the article and its Reel were made. A new function, utkastEndret (“draft changed”), compares the draft text with the stored article row. It needs no network call. If the text differs, the worker prepares the Reel again, even though the story already has one.
  • The release step, slippSakReels, now holds any Reel that has no script and waits for a human. The comment on it says (translated): “Without a script there is no previewed film to release: the person who published has not seen what would be sent.” The message in Deling reads (translated): “The Reel was not finished when the story was published. Watch the film under Deling before it goes out.”

Bug 2: indirect speech shown as a quote

The Reel’s quote card showed a sentence in quotation marks with a person’s name under it. The person never said that sentence. The story only reported it as indirect speech, along the lines of “says the organisation greatly appreciates the proposal”.

Every scene already had to pass a check that its text appears word for word in the story. This sentence passed, because the words were there. A word-for-word check can’t tell whether those words are a quote. We had hit a similar limit before: the task notes from 2026-10-08 record a Reel where a number that stood word for word in the story was placed next to the wrong person, and note that the verbatim check does not catch such things.

The new check, erSitert (“is quoted”), requires the text to appear inside Norwegian quotation marks «…» or in a paragraph that starts with a dash, which is how Norwegian news writing marks spoken lines. Anything else is dropped from the script, and the reason is logged as “is not a quote in the story”. The code comment says why this matters (translated): putting indirect speech on a quote card “is putting words in someone’s mouth”.

Bug 3: the real quotes never arrived

The third bug explains why the director picked indirect speech in the first place. Stories keep their real quotes in blockquotes. Both ways of reading a story into paragraphs skipped blockquotes. When reading from the site’s feed, only paragraphs outside list items and blockquotes were kept. When reading from the markdown draft, blocks starting with > were filtered out. So the director never saw a real quote and used the closest thing it could find. Both readers now keep blockquotes.

Bug 4: a drawing through the title

For stories with no place on the map, the Reel draws a kitchen sketch under the title. The drawing was moved down by a fixed amount, which works for one or two lines of title. This title ran to three lines, and one of the sketch’s strokes cut straight through it. The drawing now starts below where the title actually ends.

What we changed in tests

The commit adds tests for the first three bugs. One test checks that indirect speech is rejected and that a dash line and a «…» quote are accepted. One checks that a Reel without a script is held for approval with the “not finished” message. One checks that the worker notices an edited draft before publishing. Existing release tests now set a script explicitly, because a Reel without one no longer goes out by itself.

What this does and doesn’t show

All four bugs were found when the Reel-before-story setup ran on a real story chosen for the purpose. That’s one story and one evening, so we draw no wider conclusion from it. The edited-draft bug only appears when someone edits a draft after the Reel exists.

The rule

What gets approved must be what gets sent. If the draft changes after the Reel was made, the Reel is rebuilt. If a Reel has no script when its story is published, it waits for a human instead of falling back to a version nobody has seen. And a quote card is only allowed for text the story itself presents as a quote: inside «…» or in a line that starts with a dash. Matching the words is not enough.