
The predecessor
The news perception on this site replaced a system of fifty-seven containers and eight tool servers in one move. What was learned from retiring it, and from the two mistakes the replacement made in its first months.
- The question
- What does it cost to throw away a working system and rebuild it as one service with one job, and how much of what the replacement claims to do is actually measured?
- The verdict
- The retirement held: the successor has run since 26 March and holds 578,732 articles. Two of its own claims did not: entity links by vector proximity ran at 2.4 percent precision until 18 July, and the filter figure on this site was an extrapolation until this page was written.
The question
The first news system in this lab grew the way first systems do. By March 2026 it was fifty-seven containers on one machine and eight tool servers exposing more than two hundred tools; the note written when it was deleted lists a machine-learning pipeline, a knowledge graph, entity canonicalisation and an open-source intelligence module. Its own inventory gives the tool count with a plus sign.
The question was not whether it worked. Parts of it did. The question was whether one service with one job could replace it without losing the archive, and what would have to be true for the replacement to earn its numbers.
What was built
Retina: one service, one database, one job. Read the feeds, embed every article before anything else happens, classify, extract the entities, keep the derived data. On the day the old system was switched off, the successor was already running: a first classifier at 82 percent accuracy over seven categories, 105,000 of 120,000 articles categorised.
The old machine was kept for a month as a safety net, deletion set for 26 April at the earliest. It was deleted on 5 April, three weeks before the date the lab had set itself. The code was published as open source. The last two reading paths into the old interface were removed on 2 April.
Since then the service has grown by measurement rather than by feature: a source catalogue of 120 feeds, a Telegram intake, a small web scraper, and a chain of guards in front of the parser.
What was measured
- 26 March: 57 containers stopped, the daemon disabled. The three inventories of the old system that survive give three numbers for what it was: 57 containers, “50 plus” containers, 34 microservices. None of the three explains the others. The 57 is the only one attached to the act of switching off, so it is the one this site uses.
- 18 July: the way articles are linked to entities changed in one commit. Until then, an article was linked to an entity when its vector fell near the entity’s centroid. A language model was extracting entities from the articles as well; its output was not what the links were built from.
- 27 July: the centroid links measured across the corpus. 66.5 percent of 1.89 million edges came from the centroid method, at 2.4 percent precision, and no reading path used them. The model’s extractions, now the only source of links, measured 95.7 percent. Coverage of about 70 percent of articles is by design: the model links what it finds, not what is near.
- 26 August, 01:20: the host ran out of memory in nineteen seconds. A short link in a feed pointed at a video on a content delivery network; the fetcher downloaded it in full, 3.47 gigabytes, and the article parser tried to read the bytes as HTML. Two guards were built the same day, a memory cap and a content-type check with a size limit, and verified against the original link: 5 megabytes instead of 3.47 gigabytes. In the days after, 185 fetches, none wrongly refused.
- 1 September: a filter for pages that carry no article, placed before the model so they are dropped without a request. Its share of the inflow was put at 5.1 percent. The handover of that afternoon says in so many words that this is an extrapolation and not a measured saving, and that the seven-day window had only started at 14:23. A check of 78 cases gave 4.9 percent. The window is full on 8 September.
- 3 September, live: 578,732 articles, 99.9 percent of them embedded, 9,658 entities, 120 active feeds, 6,211 articles a day over the last seven days, of which 3,873 from feeds and 1,847 from Telegram.
What fell
- Linking by vector proximity. In production until 18 July, 2.4 percent precision, replaced in one commit. The extraction that replaced it was already running.
- A similarity threshold as the judge of duplicate reports. At 0.99 a genuine duplicate and a corrected casualty count sit side by side. No threshold separates them.
- Source trust tier as a relevance gate. The tier with the highest trust and the most volume had the highest rate of junk. Kept as a signal, rejected as a gate.
- Raising a request limit to make a flood go away. On 11 August a neighbouring service hit Retina with 12,274 requests a minute. The quick fix would have been a higher limit; the code comment at that spot warns that a partial answer would mark quiet entities as dead. Paginated instead.
- The number on this site. Until this page was written, the Retina sheet said the filter removed 5.1 percent of the inflow “in a seven-day measurement”. The measurement had not happened. The sheet now says what the source says.
What stands
A news perception that has run since 26 March, with its numbers read from the running system at build time and dated on the page. A guard chain in front of the parser that was built from an outage and verified against it. An entity layer whose precision is a measured 95.7 percent, and whose bad links are on record rather than quietly overwritten.
And a habit that the predecessor did not have: every figure has a date and a window, and when the window has not closed, the page says so.