The slow way, made survivable Chapter 16 of 18 Svenska

The map · Part Two · The machine · Chapter 16 of 18

The bug museum

The claimEvery wrong number this project caught was caught by reading a whole table or by two things failing to agree, never by searching for it.

About 7 minutes · the builder's route.

Every project that computes with money produces wrong numbers. The honest question is not whether, but how they are caught, and what is left behind afterwards. This chapter is a museum. Each exhibit is a real fault from this project's records, kept because of what it taught.

One thing is common to all of them, and it is the reason the chapter exists. None was found by a search for it. A search finds what you already suspect. Each of these was caught because somebody read a whole table and one number was absurd on sight, or because two things that should have agreed did not.

1 A share 12,791 percent above its line

What it looked like
In a twenty-row table printed by a trial run in August 2026, one London company stood 12,791 percent above its buy line. Nobody was looking for it. The number was simply impossible.
The cause
London shares are quoted in pence. The value had been worked out in pounds. The table divided one by the other.
How it was caught
By eye, in a full table. A filter for "names near their line" would have hidden it, because it was nowhere near.
What changed
Pence and pounds are now two different currencies to the program, and no arithmetic crosses a unit seam: where the two codes differ, no distance is printed at all, and the page says which seam it met. The first draft of the phone page made the same mistake before the rule was written: it showed 10,543 percent.

2 Coach, many times over

What it looked like
In the history test, with bankrupt and bought companies put back in, one American company's five-year return came out at several thousand percent, and carried a whole portfolio with it.
The cause
The handbag maker Coach renamed itself Tapestry in 2017 and changed its ticker from COH to TPR. The letters COH were later used for a different security. The price file under those letters began with one company and ended with another.
How it was caught
An independent review read the list of the largest winners instead of the average, and one name was carrying the result.
What changed
A guard: a price series that breaks level across a gap is not a return. Then the lesson's second half. The guard itself was tested as an attempt of its own, and it turned out to be removing real winners on single bad days. It was fixed, and the results it had touched were run again and logged. A fix made after seeing a result is not free: it is one more look, and it is counted.

3 The companies with no debt

What it looked like
The Nordic screen listed a large part of its universe as free of debt, which made those companies look cheap.
The cause
The data vendor's field for total debt was empty for them. The program read empty as zero. The borrowings were there all along, in the separate lines for short and long loans. Orkla, whose own annual report shows a net debt of about fourteen billion kronor, was being valued as a company that owed nothing.
How it was caught
In November 2026 the screen's top names were read one by one against each company's own report. The first balance sheets opened showed loans the screen said did not exist.
What changed
An empty total is rebuilt from its parts. The earlier history tests had run with the fault; they were not quietly re-run, and the fault is written into the log beside them. Empty is not zero: the third outcome of chapter 9, learned again.

4 Seven messages, all false

On 2026-09-13 the page server restarted seven times in a row because of a missing directory, and the notifier sent seven messages. Each one said that no report had been written for the day, because that sentence had been written for the nightly run and reused for every unit. For a page server that never writes a report, the sentence was false. The fix, recorded as a backlog item and committed the same day, gives each unit its own accurate sentence about what its stopping means.11Backlog item B-13; commit 'the failure notifier says what stopped, not "no report was written" for every unit'. A notifier that lies, even slightly, is on its way to being ignored.

5 The night the queue stopped

What it looked like
On 2026-11-09 the nightly queue stopped with an error the first time it met a newly added company.
The cause
A line written that day, for the weekly reminder about a sale decided but not yet carried out, used the name since. The run already used that name for something else: the date it looks back to. After the first held company with a sale pending, the run's window was no longer a date but a piece of text.
How it was caught
It crashed. That is the good kind of failure: a run that stops with an error is reported as failed, and nothing wrong is sent to the phone.
What changed
One variable renamed, and a comment on that line saying why. The exhibit is here for the contrast with the others: the faults that hurt are the ones that do not crash.

6 A sentence that outlived its rule

What it looked like
Three days after the price stop was removed, the nightly report still said of one group of holdings that "the stop is LIVE and is checked below", and the phone page still said it had checked "every stop against its close". Nothing was checked. There was nothing to check.
The cause
The rule was removed from the code that decides. The sentences lived in the code that describes, and nobody had a list of them.
How it was caught
An audit of the manual against the code, line by line, on 2026-11-09. The manual had the same disease: it named a message the program no longer sent and listed four of ten scheduled jobs.
What changed
The sentences are gone, and the page that lists every command is now generated from the code, with a test that fails when the two differ. A report that says it checked something it did not check is worse than a report that says nothing.

7 The value that fell by a third

What it looked like
On 2026-10-27 the method's value for a company the owner already held went from 61.83 dollars a share to 28.60, and then to 40.19, in one day. The owner read the middle number as a joke or a lie.
The cause
Not a fault in the code. A fault in the method, found by the method. The first value stood on one year's spare cash, and that year the company had been selling down its stock, which is cash that comes once. And the company buys other companies most years, which the first value neither charged nor checked. Two rules written that week fixed both: spare cash is the average of three years with the stock changes taken out, and a buyer of companies is valued on what its past purchases have actually earned.
How it was caught
An outside review, asked for by the owner, said on the very first day that the cash figure was flattered. It was half accepted. A week later a second review went to the cash flow statement in the annual report itself, and three years of stock being sold down were there in print.
What changed
The value now in force is 40.19. Most of the shares were sold over the next two days. And a habit: when a value moves a lot, it is shown step by step, never as a bare number. The CENTA boxes through this book are that waterfall, a chapter at a time.

What the museum teaches

  • Read the whole table when you are hunting. A filter is for a known question. A wrong figure is by definition not where you expect it.
  • Empty is not zero, and silence is not health. Three of the seven exhibits are a missing thing read as a harmless one.
  • A fix made after seeing a result is itself a result. It is logged, and where it could change a conclusion it is tested.
  • The loud failures are the cheap ones. A crash costs an evening. A plausible wrong number costs until somebody reads a full table.
Try it
.venv/bin/python -m vss run --dry-run | less

Read the whole table once. That is how most of these were found. From the repository's root, after the install in the manual.

In three lines
  1. Units, tickers, empty fields and sentences all go wrong quietly.
  2. A filter finds what you already suspect. Reading everything finds the rest.
  3. Each fault left a rule behind: no arithmetic across units, empty is not zero, and a fix made after a result is counted as one more look.

Sources for this chapter

  1. The habit of full reading, with the first five finds — read from this repository: CLAUDE.md, 'Bounded output, and when to ignore it'
  2. The reused ticker and the guard that was tested — read from this repository: reference/backtest/WHAT-WE-TESTED.md, attempts #2 and #15; tools/backtest/eodhd_reprice.py
  3. The empty debt total — read from this repository: tools/backtest/nordic.py, 'EMPTY DEBT TOTAL'
  4. The seven notifications — read from this repository: deploy/README.md; the failure notifier
  5. The run's window — read from this repository: vss/queue.py, the comment beside the exit reminder
  6. The sentences that outlived the stop — read from this repository: docs/CHANGELOG.md, 2026-11-09
  7. The three values of one day — read from this repository: reference/CENTA-STRIKE-2026-10-20.md, -2026-10-27.md, -2026-10-27-e142.md, -2026-10-27-check.md

The slow way, made survivable. Built 2026-11-09 from the repository as it stood that day. NAME A and NAME B are fictional. One real company, CENTA, is followed through the book, with figures from its own filings and the owner's own trades. Not financial advice: one private investor's method, shared as it is.