Den långsamma vägen, gjord uthärdlig Kapitel 16 av 18 English

Kartan · Del två · Maskinen · Kapitel 16 av 18

Buggmuseet

PåståendetVarje felaktigt tal som projektet har fångat fångades genom att någon läste en hel tabell eller genom att två saker inte stämde överens, aldrig genom en sökning.

Ungefär 7 minuter · byggarens väg.

Varje projekt som räknar med pengar producerar felaktiga tal. Den ärliga frågan är inte om, utan hur de upptäcks och vad som lämnas kvar efteråt. Det här kapitlet är ett museum. Varje föremål är ett verkligt fel ur projektets protokoll, sparat för vad det lärde.

En sak har de gemensamt, och den är skälet till att kapitlet finns. Inget hittades genom en sökning efter det. En sökning hittar det du redan misstänker. Vart och ett av de här upptäcktes för att någon läste en hel tabell och ett tal var orimligt vid första anblick, eller för att två saker som borde ha stämt överens inte gjorde det.

1 En aktie 12 791 procent över sin linje

Hur det såg ut
I en tabell på tjugo rader från en provkörning i augusti 2026 stod ett Londonbolag 12 791 procent över sin köplinje. Ingen letade efter det. Talet var helt enkelt omöjligt.
Orsaken
Londonaktier noteras i pence. Värdet hade räknats fram i pund. Tabellen delade det ena med det andra.
Hur det upptäcktes
Med blotta ögat, i en hel tabell. Ett filter för "namn nära sin linje" hade gömt det, för det var inte i närheten.
Vad som ändrades
Pence och pund är nu två olika valutor för programmet, och ingen räkning korsar en enhetsgräns: där de två koderna skiljer sig skrivs inget avstånd ut alls, och sidan säger vilken gräns den mötte. Första utkastet till telefonsidan gjorde samma misstag innan regeln var skriven: den visade 10 543 procent.

2 Coach, många gånger om

Hur det såg ut
I historietestet, med konkursade och uppköpta bolag tillbakalagda, blev ett amerikanskt bolags avkastning på fem år flera tusen procent, och bar en hel portfölj med sig.
Orsaken
Väsktillverkaren Coach bytte namn till Tapestry 2017 och ticker från COH till TPR. Bokstäverna COH användes senare för ett annat värdepapper. Kursfilen under de bokstäverna började med ett bolag och slutade med ett annat.
Hur det upptäcktes
En oberoende granskning läste listan över de största vinnarna i stället för genomsnittet, och ett enda namn bar resultatet.
Vad som ändrades
Ett skydd: en kursserie som byter nivå över ett glapp är ingen avkastning. Sedan lärdomens andra halva. Skyddet testades som ett eget försök, och visade sig plocka bort verkliga vinnare på enstaka dåliga dagar. Det rättades, och resultaten det hade rört kördes om och loggades. En rättning som görs efter att man sett ett resultat är inte gratis: den är en titt till, och den räknas.

3 Bolagen utan skulder

Hur det såg ut
Den nordiska screeningen listade en stor del av sitt urval som skuldfritt, vilket fick de bolagen att se billiga ut.
Orsaken
Dataleverantörens fält för total skuld var tomt för dem. Programmet läste tomt som noll. Lånen fanns där hela tiden, på de separata raderna för korta och långa lån. Orkla, vars egen årsredovisning visar en nettoskuld på omkring fjorton miljarder kronor, värderades som ett bolag som inte var skyldigt någonting.
Hur det upptäcktes
I november 2026 lästes screeningens toppnamn ett i taget mot varje bolags egen rapport. De första balansräkningarna som öppnades visade lån som screeningen sade inte fanns.
Vad som ändrades
En tom summa byggs upp ur sina delar. De tidigare historietesterna hade körts med felet; de kördes inte om i tysthet, och felet står inskrivet i loggen bredvid dem. Tomt är inte noll: det tredje utfallet i kapitel 9, lärt en gång till.

4 Sju meddelanden, alla falska

Den 2026-09-13 startade sidservern om sju gånger i rad på grund av en saknad mapp, och notifieraren skickade sju meddelanden. Vart och ett sa att ingen rapport hade skrivits för dagen, eftersom den meningen hade skrivits för nattkörningen och återanvänts för varje enhet. För en sidserver som aldrig skriver en rapport var meningen falsk. Rättelsen, registrerad som en punkt i backloggen och incheckad samma dag, ger varje enhet sin egen korrekta mening om vad dess stannande betyder.11Backlogpunkt B-13; commit 'the failure notifier says what stopped, not "no report was written" for every unit'. En notifierare som ljuger, även lite, är på väg att bli ignorerad.

5 Natten då kön stannade

Hur det såg ut
Den 9 november 2026 stannade den nattliga kön med ett fel första gången den mötte ett nytillagt bolag.
Orsaken
En rad som skrevs den dagen, för den veckovisa påminnelsen om en försäljning som är beslutad men inte utförd, använde namnet since. Körningen använde redan det namnet till något annat: datumet den tittar tillbaka till. Efter det första ägda bolaget med en väntande försäljning var körningens fönster inte längre ett datum utan en textbit.
Hur det upptäcktes
Den kraschade. Det är den goda sortens fel: en körning som stannar med ett fel rapporteras som misslyckad, och inget felaktigt skickas till telefonen.
Vad som ändrades
En variabel fick nytt namn, och en kommentar på den raden säger varför. Föremålet är här för kontrasten mot de andra: felen som gör ont är de som inte kraschar.

6 En mening som överlevde sin regel

Hur det såg ut
Tre dagar efter att kursstoppet togs bort sade nattrapporten fortfarande om en grupp innehav att "stoppet är LIVE och kontrolleras nedan", och telefonsidan sade fortfarande att den hade kontrollerat "varje stopp mot sin stängningskurs". Ingenting kontrollerades. Det fanns inget att kontrollera.
Orsaken
Regeln togs bort ur koden som bestämmer. Meningarna bodde i koden som beskriver, och ingen hade en lista över dem.
Hur det upptäcktes
En granskning av manualen mot koden, rad för rad, den 9 november 2026. Manualen hade samma sjukdom: den nämnde ett meddelande programmet inte längre skickade och listade fyra av tio schemalagda jobb.
Vad som ändrades
Meningarna är borta, och sidan som listar varje kommando genereras nu ur koden, med ett test som faller när de två skiljer sig. En rapport som säger att den har kontrollerat något den inte har kontrollerat är värre än en rapport som inte säger något.

7 Värdet som föll med en tredjedel

Hur det såg ut
Den 27 oktober 2026 gick metodens värde för ett bolag ägaren redan ägde från 61,83 dollar per aktie till 28,60, och sedan till 40,19, på en dag. Ägaren läste det mellersta talet som ett skämt eller en lögn.
Orsaken
Inget fel i koden. Ett fel i metoden, hittat av metoden. Det första värdet stod på ett enda års fria kassaflöde, och det året hade bolaget sålt ned sitt lager, vilket är pengar som kommer en gång. Och bolaget köper andra bolag de flesta år, vilket det första värdet varken belastade eller kontrollerade. Två regler skrivna den veckan rättade båda: det fria kassaflödet är snittet av tre år med lagerförändringarna borttagna, och en uppköpare värderas på vad dess tidigare köp faktiskt har tjänat.
Hur det upptäcktes
En utomstående granskning, som ägaren bad om, sade redan första dagen att kassaflödet var smickrat. Det godtogs till hälften. En vecka senare gick en andra granskning till kassaflödesanalysen i själva årsredovisningen, och där stod tre år av lagerminskning i tryck.
Vad som ändrades
Värdet som gäller nu är 40,19. De flesta aktierna såldes de två följande dagarna. Och en vana: när ett värde rör sig mycket visas det steg för steg, aldrig som ett naket tal. CENTA-rutorna genom boken är det vattenfallet, ett kapitel i taget.

Vad museet lär

  • Läs hela tabellen när du jagar. Ett filter är till för en känd fråga. Ett felaktigt tal finns per definition inte där du väntar dig det.
  • Tomt är inte noll, och tystnad är inte hälsa. Tre av de sju föremålen är något som saknas, läst som något ofarligt.
  • En rättning som görs efter att man sett ett resultat är själv ett resultat. Den loggas, och där den kan ändra en slutsats testas den.
  • De högljudda felen är de billiga. En krasch kostar en kväll. Ett rimligt felaktigt tal kostar tills någon läser en hel tabell.
Prova själv
.venv/bin/python -m vss run --dry-run | less

Läs hela tabellen en gång. Så hittades de flesta av de här. Från repots rot, efter installationen i manualen.

På tre rader
  1. Enheter, tickrar, tomma fält och meningar går alla fel i tysthet.
  2. Ett filter hittar det du redan misstänker. Att läsa allt hittar resten.
  3. Varje fel lämnade en regel efter sig: ingen räkning över enhetsgränser, tomt är inte noll, och en rättning efter ett resultat räknas som en titt till.

Källor för det här kapitlet

  1. Vanan att läsa allt, med de fem första fynden — läst ur det här repot: CLAUDE.md, 'Bounded output, and when to ignore it'
  2. Den återanvända tickern och skyddet som testades — läst ur det här repot: reference/backtest/WHAT-WE-TESTED.md, försök #2 och #15; tools/backtest/eodhd_reprice.py
  3. Den tomma skuldsumman — läst ur det här repot: tools/backtest/nordic.py, 'EMPTY DEBT TOTAL'
  4. De sju notiserna — läst ur det här repot: deploy/README.md; felnotifieraren
  5. Körningens fönster — läst ur det här repot: vss/queue.py, kommentaren vid exit-påminnelsen
  6. Meningarna som överlevde stoppet — läst ur det här repot: docs/CHANGELOG.md, 2026-11-09
  7. En dags tre värden — läst ur det här repot: reference/CENTA-STRIKE-2026-10-20.md, -2026-10-27.md, -2026-10-27-e142.md, -2026-10-27-check.md

Den långsamma vägen, gjord uthärdlig. Byggd 2026-11-09 ur repot som det såg ut den dagen. BOLAG A och BOLAG B är påhittade. Ett verkligt bolag, CENTA, följs genom boken, med siffror ur dess egna rapporter och ägarens egna affärer. Inte finansiell rådgivning: en privatinvesterares metod, delad som den är.