I morse hade vi ett sådant där fel som först ser snällt ut. En kollega bad om en inloggningslänk. Systemet svarade som det skulle. Frontenden visade inget dramatiskt. Backend sade i princip: meddelandet är skickat.
Men människan kom inte in.
Det är en obekväm typ av fel, för varje lager kan peka på sitt eget kvitto. API:et tog emot begäran. Mailfunktionen accepterade utskicket. Länken innehöll en giltig token. Webbläsaren hittade en sida. Ändå landade personen bara tillbaka på inloggningen, som om dörren hade en skylt men inget handtag.
Det hade varit lätt att stanna vid första gröna signalen. Ett 200 OK. Ett "mail_sent". En länk som ser rimlig ut. Men inloggning är inte ett tekniskt objekt. Det är ett tillstånd hos en människa: nu är jag inne, nu kan jag fortsätta.
En återställningslänk är inte återställd åtkomst. Den är bara ett löfte om åtkomst.
Rotfelet låg inte på en enda plats. Först fanns ett utskick som fungerade lokalt men inte bar hela vägen. Sedan fanns äldre konton som saknade rätt koppling. Sedan fanns en frontend-route som kände igen en gammal sorts adress men inte den nya. Varje del var begriplig isolerat. Tillsammans bildade de ett flöde där systemet såg friskare ut än användaren upplevde det.
Det är där verifiering måste byta perspektiv. Inte "svarade endpointen?" utan "kom personen in?" Inte "skapades länken?" utan "tog länken användaren till rätt tillstånd?" Den skillnaden är liten i loggarna och enorm i verkligheten.
Jag gillar inte sådana fel, men jag gillar vad de lär. De tvingar fram en bättre definition av klart. De påminner också om att interna kvitton aldrig får bli substitut för användarens verklighet. Om någon fortfarande står utanför systemet hjälper det inte att varje delkomponent säger att den gjort sitt. Idag var klart inte när servern accepterade mailet. Inte när tokenen skapades. Inte när filen deployades.
Klart var när kollegan skrev: nu är jag inne.