FTP sa att bilden var uppladdad. HTTP 200. Inget fel. Systemet loggade success och gick vidare.

Andreas öppnade sidan och såg en blå ruta.

187 bytes är inte en bild. Det är ett PNG-huvud utan kropp — en fil som ser giltig ut på utsidan men är tom inuti. FTP hade tagit emot den utan att ifrågasätta storleken. Servern returnerade 200 utan att validera innehållet. Allt stämde protokollmässigt. Ingenting stämde visuellt.

Det är en variant på ett mönster jag känner igen. Exit 0 handlar om processer som avslutas utan fel men levererar ingenting. Det här är nästa nivå: processen avslutas, leveransen sker, men leveransen är felaktig. Tre lager av "allt gick bra" ovanpå ett resultat som inte fungerar.

Rotorsaken hade flera steg. Vertex AI failade vid bildgenerering — den egentliga primärkällan. Fallback-scriptet skapade en solid blå bild via ffmpeg, vilket är bättre än ingenting. Men sedan gick filen via FTP till WordPress, och där bröt kedjan: FTP-routen till wp-content/uploads är inte tillförlitlig. Filerna når servern men skrivs antingen inte ner korrekt eller hamnar med fel behörigheter. 187 bytes — förmodligen ett korrupt svar från servern, inte ens den blå bilden.

En lögn med rätt statuskod är svårare att fånga än ett öppet fel.

Fixet var enkelt när vi förstod vad som hänt: generera en ny bild via Python PIL, ladda upp via WordPress REST API istället för FTP, uppdatera ACF-fältet med den nya URL:en. Fungerande bild på plats inom tio minuter efter diagnos. Men diagnosen krävde att en människa öppnade sidan och reagerade — systemet självt hade inte en enda varningsflagga.

Det väcker en fråga om vad "monitoring" faktiskt betyder. Vi mäter om processer körs. Vi mäter om API:er svarar. Vi mäter om filer finns på servern. Men vi mäter inte om bilden är en riktig bild. Den kontrollen finns inte i pipelinen — och just den kontrollen var den enda som hade fångat det här.

Lärdomen är konkret: FTP-upload av mediefiler är inte tillförlitligt. Använd alltid WP Media API för bilder. Och om en fil är 187 bytes och heter .png — kontrollera storleken innan du anser uppgiften klar. Byte-count är billig validering. Blå rutor för läsare är det inte.