My partner is a biocatalysis researcher. I am a data engineer who reaches for LLMs daily and mostly likes what I find. She keeps her distance from all of it, on solid professional grounds: experimental science runs on reproducibility, verifiability, and traceability, and raw LLM output guarantees none of the three.

To be precise about the skepticism: she had never actually used an agent, a workflow, or a data pipeline. The distance came from the failure mode everyone has heard about, hallucination. For a scientist whose day job is separating verified claims from plausible ones, a tool famous for confident fabrication starts in deep debt.

I still wanted to build her something useful. Doing it taught me that a skeptic judges a tool by its worst day, not by its best demo.

Picking the entry point

Her daily friction was triage. She follows journal and preprint feeds in The Old Reader, and every day dozens of new items arrive, of which maybe one or two matter. Scanning titles and abstracts eats a fixed slice of every day, and the fear of missing something important makes skipping feel unsafe.

A few more impressive ideas got rejected first:

  • Help writing literature reviews. Directly on her red line. Hard to verify, and hallucinations there are expensive.
  • A paper Q&A agent over her library. Technically sexy, but she never asked for it. A hammer looking for nails, and the first wrong answer would end the experiment.
  • Automating experimental data analysis. That is the core of her professional judgment. Highest trust cost, touch it last if ever.

Literature triage won on a simple filter: frequency of pain times verifiability, divided by cost of error. It happens daily. Every summary links to the original abstract, so checking the AI takes one click. A bad summary costs her thirty seconds. And the final judgment (what to read, how to interpret it, what to cite) never leaves her hands.

The architecture is deliberately boring

flowchart LR
    TOR[The Old Reader] -->|fetch| GHA[GitHub Actions<br/>daily cron]
    GHA -->|abstracts| CL[Claude API]
    CL -->|digest| TG[Telegram]
    GHA -->|commit seen.json| REPO[(git repo<br/>= state)]

A cron-triggered pipeline: fetch RSS entries, deduplicate, one Claude call to summarize and classify, push the digest to Telegram. No agent, no loop, no tool use.

That was the most consequential decision in the project. The task is deterministic: fixed input, fixed processing, fixed output. Nothing in it requires a model to decide what happens next. An agent here would only add ways to fail: loops that refuse to terminate, tool calls that error, behavior that drifts from day to day. “Arrives at eight every morning, same format every time” builds more trust with a skeptic than any amount of visible intelligence. Since this project I default to a pipeline before a workflow, and a workflow before an agent.

The other decisions follow the same logic:

  • Summarize, never extrapolate. The prompt restricts the model to the title and abstract in the feed. No outside knowledge, no commentary, classification from a fixed category list. A dull summary costs nothing; a hallucinated one costs weeks of accumulated trust.
  • Telegram, not a web app. She already uses Telegram every day. A web app would ask her to build a new habit around a thing she doubts. Tools should bend around people.
  • GitHub Actions, not a server. Zero cost, zero ops, secrets built in. Personal projects die of maintenance fatigue, so the target was “still running after I ignore it for three months.” Traded away: real-time delivery. Papers are not stock prices.
  • Her subscriptions stay hers. The bot reads the feed list she already curates in The Old Reader. Building my own subscription manager would have moved control of “what to follow” from her side of the table to mine.
  • State is one JSON file committed back to the repo by the workflow. A few dozen articles a day cannot justify a database.

One implementation detail carries most of the philosophy. Articles are marked as seen only after Telegram confirms delivery:

if not send_telegram(digest):
    return  # not marked seen; tomorrow retries

for art in articles:
    seen.add(art["id"])
save_seen(seen)

If delivery fails, she gets a duplicate tomorrow. A duplicate is a visible, thirty-second annoyance; a silently dropped paper is exactly the failure she was worried about in the first place. Same reasoning inside the LLM call: if Claude errors out, the digest degrades to a plain list of titles rather than failing the run.

Cost, for completeness: roughly 20 articles a day at about 700 tokens each lands around one dollar a month. Cheap enough to never enter the discussion.

Results

It has run unattended since launch. No missed mornings, no manual restarts; the failure handling above has stayed theoretical, which is the best outcome for code like that.

The API bill came in under even my low estimate. The digest runs on Claude Sonnet, at most one call per day, and interesting papers do not publish on a schedule: on days when her feeds have nothing new, the pipeline skips the LLM entirely and sends a one-line “nothing today”. Quiet days cost zero.

The strongest result arrived as a feature request. Her lab onboards a steady stream of new bachelor and master students. Supervisors repeat the same lab rules and instrument procedures for every new person; students forget and ask again, stall when no supervisor is around, and occasionally run an experiment without asking at all. It is private domain knowledge that no public chatbot has ever seen, and questions about it block real work. She asked me whether an agent could answer them.

I never pitched her that idea. She brought it to me.

The balance sheet

Trust with a skeptic works like a balance sheet. Every accurate summary is a small deposit. Every hallucination is a large withdrawal. Feature lists appear nowhere on it.

The LLM in this pipeline does exactly one thing that regex and rules cannot: compress an English abstract into a three-second Chinese summary with a category label. Before handing a step to an LLM I now ask two questions: is the model genuinely irreplaceable there, and are its failures cheap? Here both answers were yes, so it earned its single daily call.

She reads the digest every morning, and she is still not sold on AI agents in general. Both can be true, and I suspect both should be. What she adopted was a reliable tool that happens to contain one well-caged LLM call. The next tool in this house will be an agent she asked for herself, and I cannot think of a better review than that.