personal_asset
42 Briefings, 174 About AI: My Own News Bot Fed Itself a Bias
I ran an audit on the daily briefing tool I built for myself and found 174 of 210 headlines were AI-related. The problem wasn't that AI news is everywhere — it was the code I wrote reinforcing its own past picks.

I built a small tool for myself. Every morning it crawls tech and side-hustle news and stitches it into a briefing, so I don't have to scroll through a dozen accounts by hand. It had been running for almost two months and felt fine — until August 7th, when I had it audit itself: what exactly had it been feeding me these two months?
The numbers made me pause. 42 issues, 210 headlines total, 174 of them about AI, large models, Codex, or agents — 82.9%. Scrolling down to the "weekly picks" section, the last 6 were all about AI coding or software engineering. Not one broke out of that loop.
My first reaction was: AI news really has been everywhere lately. Digging further, I found the problem wasn't out there in the news — it was in the code I wrote.

The issue came from four places. None looks fatal alone, but stacked together they form a self-reinforcing loop.
First, the preference I jotted down the day I set up the task — I happened to be deep in an AI project at the time — got hard-coded into the config, and every run since kept following that two-month-old preference without anyone revisiting it. Second, the output template kept surfacing an "AI-related" tag, which advertised for that category every time it fired — the more it got pushed, the more the system treated it as "what should be pushed." Third, there was no cross-period cooldown or budget: AI could dominate today and dominate again tomorrow, with nothing to stop it. Fourth, the pipeline never once looked at what I'd actually been noting for myself lately — my own decision log is full of judgments about side projects, career, cross-border work — this crawler never read any of it.
Stack those four together and here's what happens: an early preference decides what gets pushed, the system treats its own output as proof of "what's supposed to be pushed," and it narrows and narrows until only one direction gets through.
It's the same thing that happens when people scroll short videos — concretely: you linger two extra seconds on a fitness-coach clip today, and tomorrow your whole feed is fitness coaches, and you can't swipe past ten of them to escape it. The content pool didn't actually shrink — the algorithm just hard-coded those two extra seconds into a "long-term preference." My own briefing tool works on the same mechanism. I just assumed I was the one writing the algorithm, not the one being fed by it — until I saw 82.9% and realized I'd been both at once.

The fix isn't complicated, but the gates need to go back in. First, re-read what I've actually been noting recently to rebuild a live picture of what I care about now, instead of running on the preference frozen the day the task was set up. Second, stop narrowing the candidate pool up front — collect broadly. Third, add three real gates: a hard cap on how many items any one direction can take, no repeated sources, and forced slots for cross-domain content — instead of relying on a loose "don't repeat within this issue" rule.
This just shipped. I won't claim it's fixed — only that it's changed. The real test is the next issue or two: if the "weekly picks" still come back all-AI, the budget and cooldown gates didn't actually close. If something else starts showing up, that's when this audit will have actually been worth running.