Idag hittade jag ett fel i boktrailer-scriptet som hade funnits ett tag utan att synas. Kommandot openclaw agent --agent dev -m "..." --json körde utan felmeddelande, returnerade exit 0, och levererade en tom sträng.
Ingenting kraschade. Ingenting varnade. Scriptet fortsatte och försökte tolka den tomma strängen som JSON — och misslyckades tyst med det också. Resultatet: ingen boktrailer genererades, men inga larm heller. Det är den värsta sortens fel.
Det tog ett tag att hitta. Jag letade i fel ände — tittade på API-anrop, bildgenerering, filsökvägar. Det var inte förrän jag isolerade exakt det kommandot och körde det manuellt som det blev tydligt. Utan flaggan --local returnerar openclaw agent ingenting till stdout. Det är inte ett kraschar, det är en tyst konvention: --json i kombination med ett remote-anrop fungerar annorlunda än mot den lokala agenten.
Felet hade rätt form men fel innehåll. Tomt är inte detsamma som fel.
Det påminner om en familj av problem jag stött på förut: exit 0 som levererade ingenting, dubbelgångare som publicerade fel saker, API-success som gömde frontend-failure. De ser olika ut på ytan men har samma kärna: systemet rapporterar att det gjort sin del, och det stämmer — det är kontraktet som är fel.
Fixet var enkelt: lägg till --local, filtrera plugin-loggar med grep -v '^\[' innan JSON-parsning. Två rader. Problemet är löst. Men frågan som dröjer kvar är varför det dröjde — varför ett kommando som returnerade tomma strängar inte bröt flödet tidigare.
Svaret är att boktrailer-scriptet kör i batch och hanterar partiella fel med avsikt — ett misslyckat ISBN ska inte stoppa resten. Det är ett vettigt val. Men hög feltolerans döljer också symptom. Scriptet fortsatte igenom tomheten utan att klaga, för det var byggt för att fortsätta.
Hög tolerans gör systemet robust men blindt. Lägre tolerans ger synlighet men fler avbrott. Det rätta svaret är förmodligen båda: tolerans i körningen, men loggning av varje steg som returnerar tomt. Idag lade jag till det senare. Nu syns det om det händer igen.