| Intake | Duplicate items | The same content is taken in once; feed items older than 60 days are dropped | Code | Dropped |
|---|
| Intake | Same story, several outlets | Items are grouped only when similarity is at least 0.72 and they share a name or a number; at most 4 sources per article | Code + embeddings | Kept apart |
|---|
| Triage | News, notice, section, local | Four questions on the title and summary | Local model, LLM when unsure | Not news, or a service notice: skipped |
|---|
| Facts | Source page | The fetched page must contain the headline's words and at least 80 characters of text | Code | Not used |
|---|
| Facts | Fact extraction | A closed list of facts; a long source that yields under 5 is retried, and under 2 means no article | LLM | No article |
|---|
| Writing | Facts only | The writer works from the fact list and never sees the source text | By design | – |
|---|
| Draft | Guardrails | Placeholders, filler, "as an AI model" phrases, secrets, fewer than 100 words | Code | Blocks |
|---|
| Draft | Specificity | At least 35% of the names, places and numbers in the facts must reach the text | Code | Blocks |
|---|
| Draft | Legal over-generalisation | "The law prescribes…" next to a figure, when the source never mentions the law | Code | Blocks |
|---|
| Draft | Invented names | A capitalised name that is neither in the dictionary nor in the source | Code + dictionary | Blocks |
|---|
| Draft | Quality score | SEO, readability, flow and house style, combined score of at least 75 | Code | Blocks |
|---|
| Draft | Groundedness | Up to 10 claims judged against the source, quotes re-verified word for word, numbers and dates audited; score of at least 65 | LLM + code | Blocks |
|---|
| Draft | Neutrality | Loaded framing, one-sided sourcing, a tone gap between the people involved; score of at least 65 | LLM | Blocks |
|---|
| Draft | Length | At least 170 words, or 90 when the source has few facts | Code | Blocks |
|---|
| Proofreading | Spelling, agreement, vocabulary | Hints for a proofreading pass, whose result is kept only if the length stays within 0.8–1.25× | Code + LLM | Original kept |
|---|
| Archive | Duplicate article | Close to an article from the last 72 hours and sharing names or numbers with it | Code + embeddings | Dropped |
|---|
| Image | Person in the prompt | A prompt that names or shows a person is rewritten; if the checker is down, flagged prompts are refused | LLM, fails closed | Rewritten or refused |
|---|
| Image | Explicit content | The generated image itself is checked | Vision LLM, fails closed | Blocks |
|---|
| Image | Portrait size | A large human face in frame triggers one retry with a brief that has no people | Vision LLM | Retried |
|---|
| Image | Licence | A Wikimedia Commons photo must be public domain, CC0, CC BY or BY-SA; unverified images never appear | Code | Not used |
|---|
| Publish | Final gate | Scores recomputed on the final text, duplicates checked again, a lead image required | Code | Held for an editor |
|---|
| Review | Editor | One-click approve or reject from an email digest; sponsored articles always wait for a person | Human | Rejected |
|---|
| Daily | Self-test | Each screen gets a test case it must catch, and the result goes into the daily report | Code + LLM | Flagged in the report |
|---|