Earlier this year I built an AI and technology news digest. It pulled from newsletters, Hacker News, and Reddit, filtered for AI terms, and sent the results to Telegram every few days.
It was useful. It was also a list generator.
The system knew that an article matched a keyword and that a link was popular. It did not know whether I had seen the same underlying story three times, whether a consequential claim had a primary source, whether the item connected to anything I was working on, or whether I had rejected the same kind of recommendation last week.
Adding more feeds would have produced a larger version of the same problem. So I replaced the digest with a research desk built around durable judgement rather than collection.
The unit of research is not a link
News systems usually de-duplicate URLs. That catches exact repeats and misses almost everything interesting.
A product release can appear in a company blog, a newsletter redirect, a Hacker News discussion, and three articles. Those are different URLs describing one event. Conversely, the same canonical page can acquire a meaningful update later.
The new ledger therefore keeps two identities:
- a URL fingerprint, after removing tracking parameters, fragments, redirect wrappers, and cosmetic variants;
- an event fingerprint, derived from the entities, action or finding, and relevant version or date.
DOIs, arXiv IDs, software release tags, repository issues, mission event IDs, ISBNs, and canonical publisher pages provide stronger identifiers when available.
Repeated coverage becomes additional evidence for one candidate rather than another notification. A previously delivered candidate stays quiet unless there is a named material change. “Another article exists” is not a material change.
This is the central shift: the desk tracks claims and events over time. Links are supporting evidence.
Collection and judgement are separate jobs
The old digest could collect and publish in one run. The research desk refuses to do that.
Its pipeline is:
collect → canonicalise → cluster → verify → score → decide → deliver → learn
Raw candidates enter SQLite as unreviewed. Collection alone cannot turn them into an alert. Before selection, the system must record an attributable source, a specific reason I should care, a significance score, and whether the item is new or a material update.
The desk covers six areas rather than only AI:
- AI and software;
- astrophysics and astrophotography;
- science fiction;
- AI-related London careers;
- London property;
- personal-finance organisation and evidence.
Each area has its own watchlist and evidence rules. A property asking price is not treated as a completed sale. A job title containing “AI” is not automatically a plausible career move. A popular science-fiction release is not automatically a good recommendation for me.
One generic prompt cannot make those distinctions reliably without a durable model of what each topic requires.
Relevance needs an explicit argument
Each reviewed candidate receives a score out of ten:
- relevance to an active question, setup, or demonstrated interest: 0–3;
- genuine novelty: 0–2;
- consequence for a decision, capability, risk, or understanding: 0–2;
- timeliness: 0–2;
- evidence quality: 0–1.
An exceptional alert needs at least 8/10. A normal synthesis item needs at least 6/10. But arithmetic is not enough: a candidate with no attributable evidence, no identifiable change, or no non-generic “why care” is rejected regardless of its total.
Discovery sources can surface a lead. They cannot, by themselves, promote a consequential claim to an exceptional alert. The system must first attach primary or authoritative evidence.
This makes the score an audit trail rather than a confidence costume. I can inspect why something appeared, and a later correction can change future ranking without rewriting the historical decision.
Delivery has state too
Many automated digests keep a “seen links” file and mark items as processed before sending. If delivery fails, the news is lost. If a rehearsal consumes the same state as production, a test can suppress the real message.
The research desk separates those events.
Shadow observations are stored independently and never create delivery records. A production run first produces an exact delivery plan containing the candidate IDs. Only after Telegram confirms the message does the system record those IDs as delivered.
An unchanged candidate is then ineligible on the next run. A candidate with a named material delta can reopen once; after that delta is delivered, it becomes quiet again.
The first production cycle exercised the entire path. All 9 configured sources were healthy, every new candidate was reviewed, one message was capped at three useful items, the exact three IDs were recorded only after confirmed delivery, no candidates remained unreviewed, and SQLite integrity was clean.
The deterministic suite had 14 passing tests, including the sequence that matters most:
first report → unchanged replay suppressed → material change reopened → same change suppressed
That is a much stronger outcome than “the cron job exited zero”.
A reading list became part of the model
The science-fiction topic exposed another weakness in ordinary recommendation systems: possession, reading status, and preference are not the same fact.
An order confirmation can suggest that a household probably acquired a book. It cannot prove who it belonged to, whether I read it, or whether I liked it. Finishing a book does not imply a positive rating either.
The reading tracker now stores those dimensions separately. Acquisition evidence has its own source strength. Reading status can be unknown, reading, finished, or abandoned. Grades and qualitative feedback are separate append-only events. Household purchases can remain in provenance without contaminating my personal recommendations.
This matters because feedback contains both subject and style. “Interesting, but too stretched” should not become a generic positive signal for the author or topic. A positive title should boost only the themes I explicitly liked; a criticism of pacing or density should remain a constraint.
The conversational loop asks about one finished book at a time, records only what I say, and uses that evidence in later ranking. It does not ask me to maintain taxonomy in a spreadsheet, and it does not silently reinterpret “finished” as “recommended”.
A desk is quieter than a digest
The new system collects more broadly than the old AI digest and sends less.
That is intentional. A digest optimises the flow of links. A research desk maintains a memory of claims, evidence, decisions, delivery, and feedback. It can tell the difference between a new event, another version of an old story, a weak lead that needs verification, and something that genuinely changes a decision.
The upgrade was not finding more information. The internet had already handled that with almost comic enthusiasm. The upgrade was giving the assistant enough state to decide when information was worth interrupting me again.
This is part of a short series on recent improvements to my personal AI system. Previous: teaching Quick Notes not to manufacture tasks. Next: why configured is not the same as complete.