Rebuilding Attention Decay
In April I wrote about Attention Decay, which tracks how long news stories hold public attention. Two problems survived every patch I threw at them, so in July I deleted the pipeline and rebuilt it. Claude wrote the code; the two problems are the story.
Problem one: what size is a topic? Is it "Iran attacked a ship in the Strait of Hormuz" or "Iran War"? I spent months prompting GPT-4o toward the right altitude. The commits tell it: "Fix topic granularity: use gpt-4o and stricter prompt," then a filter for bad topic names, then "Fix aggressive topic filtering that was dropping real news stories." The question turned out to be ill-posed. Those aren't competing answers, they're correct answers at two levels, and a system forced to pick one level is wrong half the time by construction.
So v2 models both, with definitions mechanical enough that nothing has to judge size. An event is a cluster of near-duplicate headlines from three or more outlets within 72 hours; the data draws the boundary and the LLM only names the finished cluster. (I assumed 0.80 cosine similarity meant "same story." Cross-outlet phrasing is looser than intuition says: 0.62.) A storyline has to be synthesized, because no outlet prints a headline called "Iran War"; reporters write happenings, readers assemble the war. When a second event arrives as a development of a first, the system mints the container, gated by a can-end test: a storyline is something a future article could declare over. A war can end. "Middle East tensions" can't, so it's a beat, not a storyline.
The model cheats anyway. First run, fifteen unrelated events: it minted "Supreme Court Landmark Rulings," three rulings whose only connection is the court. I added that exact negative example, plus a rule that a description starting "A series of" means you're describing a beat. Next run: "Trump Administration Legal Battles," description beginning "A series of legal challenges against the Trump administration." What held was an adversarial second call whose only job is to refute each proposal, instructed to refute when uncertain. That plus a regex on "A series of," which is duct tape, and load-bearing.
Problem two: the French soccer team. v1 kept surfacing stories nobody around me had heard of. Cause: it counted mentions, and mentions measure publisher output, not reader attention. The NY Post news feed runs about 300 items a day; the Guardian world feed has a different lens than mine. Twelve articles from one outlet looked like twelve outlets.
v2 scores breadth: a story's daily attention is the count of distinct outlets covering it, weighted, with three distinct sources required before an event exists at all. Firehoses became harmless overnight, since 300 articles from one outlet count once. Probing 26 feeds surfaced a divide I didn't expect: left and center outlets publish curated top-stories feeds (NYT homepage, about 42 items a day of front-page judgment); the right-leaning outlets publish only firehoses. Every outlet carries a lean tag, so each story shows how much of its coverage came from left, center, and right.

Breadth admits Taylor Swift's wedding, which charted on day one because five outlets covered it, Reuters and the NYT included. I decided that's correct. The app measures attention, not importance, and the wedding had the country's attention. There's a category filter for the rest.

The embarrassing part: a site named Attention Decay never computed decay. Now every story gets a half-life, days from smoothed peak until attention stays below half, with re-spikes resetting the clock. And there's a Fading view, which is what the project was secretly for: stories that peaked recently, sorted by how fast they're falling. Its first render showed two Supreme Court rulings from two days earlier, one already at a one-day half-life.

Open question: I tuned the minter so hard against fake storylines that real ones may form late or never. No code review answers that. The bottleneck now is news happening, which is a strange place for a side project to sit.
Attention Decay, same URL as before.