Not Redundant, Empty

Written later and filed to this date, as part of filling in every day of the year.

The table in the commit message is the whole argument, so here it is. Over the fourteen days to the end of July, my news aggregator ingested 6,058 articles, and each one cost a call to the local model to decide whether it was worth anything. Thirteen of the forty-two sources, the mainstream half of the roster, the big technology sites and the general science press, had produced 1,358 of those articles: twenty-two percent of everything pulled. Of the 1,358, fourteen cleared the bar for the daily brief. Five of the fourteen were also carried by another source. Eight of the thirteen feeds had produced zero unique brief-grade articles in the window, and the share of their output that scored below the junk line ran from fifty-four percent to a hundred.

The argument for keeping them

They had been kept on purpose, six weeks earlier, by what the record calls the data-lever argument. These feeds did not make the brief, it went, but they fed the claim stage: the part of the engine that extracts claims from articles, clusters them across sources and looks for the places where two outlets disagree. Three of the thirteen alone accounted for 1,890 of 2,887 extracted claims and 41 of 63 hard disputes. Volume at the front of a pipeline looks like fuel.

The commit refutes it on its own terms. Across every cluster the engine had ever processed with the model, 351 of them, exactly two had produced a disagreement on a story that cleared the relevance line. 199 of the 351, fifty-seven percent, scored under the junk line. At the measured three and a half minutes of GPU time per cluster, that is roughly twenty-one hours of the laptop’s GPU for two disagreements worth showing anyone.

And the thing I had assumed was the risk was not. Cross-source duplication, the worry that cutting feeds loses stories the survivors also carry, measured at 24 of 1,640 brief-grade articles with a near-identical twin elsewhere: one and a half percent. The sentence in the message is the one I kept. These sources were not redundant, they were empty.

So they went. Forty-two sources to twenty-nine. The test that had asserted their presence, written to protect the data-lever argument, became a denylist, so putting one back needs new evidence rather than the old argument.

The three that cost something

Thirty-eight minutes later a second commit retired three more, and this one was different. The three were aggregators, the link-voting communities, and their numbers looked worse: eighty, sixty-six and ninety-one percent of their output below the junk line, about 130 articles a day between them, nearly a third of all ingest, for a four to nine percent brief yield. But the yield was real. They had produced 126 brief-grade articles a fortnight, held seven of the forty-five live digest slots and eighteen of 133 daily top-ten places from under eight percent of brief-grade volume, while carrying the harshest tier prior the ranker has. They were nearly a third of the brief’s engineering stories and a third of its release notes.

The first thirteen were cut because the yield lens and the waste lens agreed. The three were cut by a choice, with the cost written into the config file and pinned in a test, so that a future reader re-deriving the decision from the junk rates alone does not quietly re-add them and think it found a free win. The record even predicts the consequence: expect the brief to skew toward research papers.

What the retirement found

Retiring sixteen feeds exposed a bug that only a retirement could. The source pool, which hands out a capped number of fetch slots and evicts the worst performer under pressure, had never been told about hand retirements. Removing a feed from the config deactivated it but left its pool row alone, so a retired feed kept its slot: counted against the cap, eligible for eviction, moving the clock that grows the cap. After that afternoon’s cuts, fourteen of the forty-three slots the pool reported as filled were held by feeds that fetched nothing. The fix derives a retired status for a deactivated row instead of writing one, so reactivating a feed restores the position it actually held, and a row the pool had evicted on its own stays evicted, because that verdict was reached on score and a hand removal must not borrow it.

Between the two retirements, a third commit added the view that would have shown all of this earlier. Every count needed to see the thirteen as empty had been on the sources page for weeks. The ratio had not, so a one next to three hundred and four rendered exactly like a one next to twelve, and a feed producing nothing was indistinguishable from one that was merely quiet. Neither autonomous mechanism could catch it either. The pool evicts only under cap pressure, so a feed that produces nothing but contests no slot sits in the roster indefinitely; the reputation ladder rates an outlet on the claims it disputes, so a source nobody co-covers accrues no evidence and stays unrated forever. Both worked as designed. Neither answered the question that mattered, which was what I was paying triage calls for.

A section of anything has to earn its place against a measured window, not a plausible story about what it feeds. The thirteen had a story. Over fourteen days and six thousand articles, the story was two disagreements and a GPU running for a day.


← all writing