Lucile Tranchant

Case study · Harmful-information detection & triage

Finding the harmful-information signals that matter during an emergency

Keeping an LLM pipeline honest during a live public-health emergency.

Three automated detection-and-triage pipelines I designed and run daily on the Claude API: the layer enterprise social-listening tools don’t provide.

The problemWhy the layer didn’t exist

Harmful information outruns manual monitoring

Health disinformation during an outbreak, donation-scam impersonations, narratives that put field staff at risk. Enterprise social-listening tools surface volume, reach and sentiment, not whether a narrative could affect trust, access or staff safety. At the IFRC, I built the missing layer: pipelines that detect, score and triage harmful-information signal every day, and ship it as an opt-in expert digest.

By the numbers
3
Production pipelines, one shared architecture
50+
Editions shipped on the EVD pipeline alone
12+
Harm-lexicon categories in the deterministic gate
4
Ingestion sources: Sprinklr · GNews · RSS · GDELT
Solo
Design, build & ongoing operations
3
Live emergencies, incl. Ebola PHEIC 2026
The productA rendered edition · structure real, content redacted

What an edition looks like, and why each block exists

Subject
EVD Harmful-Information Digest, Edition 47
06:00 · daily
Snapshot 1

One narrative crossed the priority bar overnight; two on watch. All sources reporting except GDELT (backfill pending).

Harmful narratives 2
N4 · TIER 2 SOURCE · s-nnnn 3HARM 7.1

Claim that a vaccination team was turned away at a checkpoint, spreading in-language across two regional pages since 02:10.

N7 · NEW · TIER 3 · g-nnnnHARM 5.4

Funding-misuse allegation resurfacing after a leadership interview; stable volume, no new vectors.

Threats to staff & operations 4

One post naming a field coordinator, caught by the proximity detector and escalated for security review outside the model.

Scam / impersonation watch 5
No signal today, the section is omitted from the live edition rather than padded.
Recommended responses
1.Publish a dated correction on the owned channel, in-language.
2.Brief regional spokespeople with the agreed checkpoint line.
3.Report the impersonation account; monitor for re-posting.
Sources & item register 6
s-4471 · g-2210 · r-0090 · d-7742 · s-5218 …
1

Deterministic first. Every item enters with a harm score from the 12+-category lexicon, computed before the model ever sees it.

2

Persistent numbering. N1, N2… persist across editions, so an expert can track how a narrative evolves day over day.

3

Provenance by prefix. IDs carry their source: s = Sprinklr, g = GNews, r = RSS, d = GDELT. Every claim traceable to its record.

4

Threats caught outside the model. A proximity-aware detector flags direct threats to staff, too important to leave to a probabilistic step.

5

Conditional sections. They render only when there is signal. An empty section is itself information the reader can trust.

6

The register closes the loop. Assessment → item → source. This is what makes the digest auditable rather than just plausible.

The systemPython · GitHub Actions cron · one codebase, three configs
01
Ingest
Sprinklr listening
GNews · RSS
Arabic RSS · GDELT
02
Dedupe & idempotency
at-most-once/day
state-file + runs-API
redundant crons
03
Deterministic gate
harm-lexicon scoring
source-risk tiers
fail closed
04
LLM assessment
Claude API
segmented context
JSON + auto-repair
05
Render & send
HTML digest
Gmail SMTP
opt-in expert list

“The model summarises what passes the gate. It never decides what passes.”

Design rule no. 1, and the reason the audience can trust it.
Production lessonsBeyond the happy path
01 · The fail-open incident

Mid-crisis, an OAuth token expired and the social feed went dark with 401s. The pipeline could keep shipping confident assessments on a silently narrowed base. The fix: an empty-feed guard, so a dark source now degrades the edition visibly. LLM systems fail open by default; honesty has to be engineered in.

02 · The idempotency trap

Redundant retry crons meet a hard rule: at most one send per day. When credit exhaustion killed a run mid-execution, a naive re-run would double-send. What held: state committed only on confirmed send, pushed with rebase/autostash to survive same-day races.

03 · Determinism at the gate

What surfaces is decided by code, not the model: lexicon scores, source-risk tiers, relevance gates, plus a proximity-aware detector for threats against staff. Fail closed: a skipped edition beats a malformed one in an expert’s inbox.

What the system demonstrates

A complete review-and-triage workflow, from raw signal to a decision a person can act on. Three principles hold it together: the decisions that matter stay in code, not the model; every assessment can be traced back to its source; and human attention is spent on the few signals most likely to matter.

Ingest sources Score against harm framework Model writes the assessment Escalate to a person

Developed independently as an experimental monitoring workflow; all operational content here is redacted. This write-up focuses on system design and lessons learned, not a service.

Interested in the thinking behind this system? A code-and-prompt walkthrough is available on request.

Get in touch →
More work
Executive intelligence · System design
Turning monitoring noise into a 90-second executive readout
See the readout architecture →
AI reputation research · Mirrorline
Helping organisations see how AI assistants represent them
See the Mirrorline method →
Research & insight · Decision support
From fragmented signals to an executive reputation readout
Read the insights case study →