Skip to content

Methodology

How the brief is made, the rules it follows, and where it falls short.

Last updated:

Sources

The brief is built only from openly published material: news outlets' RSS feeds, public Telegram channels, satellite fire data and sanctions lists, in Ukrainian, Russian and English. New material is collected every 15 to 30 minutes.

Every source carries a label saying what kind of source it is: Ukrainian official, Ukrainian media, Russian state media, Russian pro-war channel, independent Russian media, international media, and a few others. Independent Russian media are their own side; they are never counted as the Russian side. A label says what a source is, not how far to trust it. We do not grade outlets.

For Telegram we keep what we collected: the text of each post, when it was posted, when we collected it, whether it was later edited (with each version we saw) and whether it was no longer available when we checked again.

The daily cycle

  1. Collect. Sources are read through the day.
  2. Filter. A relevance step keeps material about the war and drops the rest.
  3. Draft. Each morning a model drafts the brief under the rules on this page. It is given the day's material with an identifier for every item, and each statement it writes must point to the items it rests on.
  4. Check. Automated checks run on the draft. Links to items that were not in the day's material are removed. A statement whose links were all removed is kept and marked "no source linked", rather than shown as sourced. Casualty figures in headlines are checked, with one retry. Other checks — whether a cited item is relevant to the statement, whether a named source matches the post cited for it — raise an alert for the morning read; they do not change the brief.
  5. Publish. The brief is published at 05:00 UTC and emailed to subscribers.
  6. Read. The brief is read every morning after publication. Errors are corrected on the published brief.

No check stops a brief from being sent. The email goes out before any correction.

What you see under a statement

Under each development and each side's account, the brief lists the posts and articles it rests on: the outlet or channel, its label, the time in UTC and a link. Posts in Ukrainian or Russian carry an English line marked "OSNT machine translation": a translation of the post, not a summary, made once per version of the post.

Some marks you may see:

  • relays: — the post passes on someone else's report ("according to…", "monitoring channels report…"). Detected from the post's original wording, not the translation. Detection misses some cases.
  • edited — the post was changed after we first collected it.
  • deleted — the post was no longer available when we checked again. We record that it was gone, not why.
  • origin not linked — the statement names a speaker, such as a ministry, and none of the posts listed is that speaker's own channel or site. It marks a gap in our chain of sources, not doubt about the claim.
  • no source linked — the statement has no valid link to the day's material.

The rules

Every claim names its source. The brief says who said something, not only what was said.

Civilian harm is attributed to the source that reported it. Casualty figures are given as a named source's figures.

A contested claim is labelled as a claim, not stated as fact. Russian official statements are presented as claims. Who attacked whom follows international law.

How they are applied: the rules are written into the model's instructions; the checks above catch some breaches automatically; the morning read catches others. None of this is a guarantee, which is why every item links to its source.

How each side told it

Each brief has a section setting out how Ukrainian officials, Russian officials, international sources and independent Russian media presented the day, each line with the posts behind it. It reports what each side said. It does not say which side is right, and it does not treat every side as equally reliable on every question.

Narratives

A topic is what an event is about. A framing is how a text presents it: who or what caused it, how it should be judged, and what should be done about it.

A statement joins a framing only when its own text carries at least two of those three elements. A judgement counts only if the words are in the text; we quote them as written or we do not count them.

The rule reads the statement, not the outlet. A Russian outlet can report an event without framing it, and a Western outlet can carry a framing it quotes.

Narratives are defined by hand, and each framing's definition is shown on its page in the app.

Where the method falls short

  • A framing expressed in a single move is not counted: the rule needs two of three elements in the statement's own text.
  • Framings only see what made the brief. Statements that did not make the day's selection are not tracked.
  • Telegram posts inform the brief and are shown under it, but they do not reach narrative pages.
  • Narratives are defined by hand, not discovered from the data.
  • Some Telegram post types, such as long-form posts and polls, are collected without their text.
  • The brief is written in English from sources in other languages. Quotes in the brief itself may be the model's own rendering; the wording under "OSNT machine translation" is the translation of the post, and the link leads to the original.
  • No check stops a brief from being sent, and the email goes out before a correction.
  • We do not grade outlets. A source's type is labelled; its reliability is not assessed.

Corrections

When we find an error, we correct the published brief, usually the same morning. Subscribers have already received the email.

One narrative moved out. We had tracked "Ukrainian strikes on Russian logistics as legitimate defense" as a framing. When we checked its material against our own membership test, most of it turned out to be plain reports of strikes: what happened, not how it was cast. Most of its links also already sat under two neutral topics, on cross-border strikes and on refinery strikes. In September 2026 we reclassified it as a topic. It still collects material, but it is no longer counted or shown as a framing. When our own classification turns out to be wrong, we change it and say so here.

Changes to the product itself, including corrections of our own earlier claims about it, are recorded in the changelog ›

Questions about the method

Is the brief written by AI?

Yes. A model drafts it every morning under the rules on this page. It is read every morning after publication, and errors are corrected on the published brief.

What sources do you use?

Only openly published material: news outlets' feeds, public Telegram channels, satellite fire data and sanctions lists, in Ukrainian, Russian and English.

How do you handle Russian state sources?

We read them, label them and present what they say as claims, never as fact. You cannot show how a side tells the war without reading it.

Do you rate outlets?

No. A label says what kind of source something is, not how far to trust it.

How often is it updated?

Sources are collected every 15 to 30 minutes. The brief is published once a day at 05:00 UTC, and the weekly report every Sunday.

Can I check a claim myself?

Yes. Each item links to the posts and articles behind it. The brief is the map; checking against the primary source stays with you.

Why not just ask an AI assistant?

An assistant answers from what it can reach when you ask, and most of them do not read Telegram directly. It cannot show you what a channel posted last week if the post has since been edited or deleted. We collect the same sources every day, keep what we collected, and publish under rules that are written down here.

Who runs this

Built and run by Mike Hafin. More on the about page ›

Read the whole record every morning.

Start free trial