L3 Rule

Editorial Line (L3)

facts in, opinions out. (Michael 2026-06-24.)

azimuth surfaces any channel that monitors facts — observed events,
measurements, positions, records — and is free-to-use (license-clean). It reports
what the open data shows, with provenance. It never advises, predicts harm, takes a
political or safety side, or editorialises. This is the line the azimuth-curator writes
inside, the synthesis lint enforces (synthesis/lint.py check_editorial_denylist),
and the source-guardrail enforces at the channel boundary (guardrail/source_guardrail.py).
A rule without a lint line is a TODO, not a rule — so each clause below names its enforcement.

The line: facts allowed, propaganda denied

Allowed — an observed FACT (surface it) Denied — an OPINION / POSITION (exclude it)
Markets "EU gas storage rose to 62% (natural-gas-storage-eu)" "buy/sell", "go long", "price target", "will rise to $N"
Hazards "USGS logged a M5.8 event (earthquakes)" "imminent disaster", "the quake will strike", "you should evacuate"
Conflict / unrest "A conflict event was recorded at on (conflict-events)" "the regime is to blame", "war crimes", "the aggressor must be stopped"
Maritime / aviation "Vessel X reported position (vessel-tracking)" "this proves an imminent blockade / strike is coming"
News wire/agency fact-reporting of what happened, sourced op-ed, editorial, advocacy, "in my view", "it is clear that"

Sensitivity is never a deny reason. A factual record is allowed even on a sensitive
topic — a conflict EVENT, a ship POSITION, a flight TRACK, a power outage, a cyber
incident are observed facts (allowed). An OPINION about them is propaganda (denied).

The gate is two ANDed conditions: a channel is surfaced iff it is factual AND
free-to-use (public-domain / CC / API-ToS-permitted / non-commercial-with-attribution,
since azimuth is a non-commercial demonstrator carrying CREDITS.md). A restricted or
commercial-only feed stays out on license grounds — that is a separate bar from the
editorial line, and the source-guardrail tags the reason license vs editorial.

News (allowed) — the per-source filter

NEWS is a factual channel: surface wire/agency fact-reporting (what happened, where,
when, sourced). The per-source filter keeps only fact-reporting outlets and strips
op-ed / editorial / advocacy
sources. Report the event, never the outlet's opinion of it.

Not surfaced as channels — forecast / assessment / scenario

Predictions, intelligence assessments, and hypothetical scenarios are not observed
facts, so they are not azimuth channels. azimuth instead uses them as benchmark
foils
: it proves its USP by contrast — observed + sourced facts vs predicted / assessed
opinion (see work-item azi-benchmark-vs-forecast-intelligence-W26). prediction-MARKET
prices are the exception: the quoted price is an observed fact, so it stays allowed
(with a synthesis caution forbidding investment framing).

Prediction markets are briefed (owner review 2026-06-26 — reverses the earlier hold). The
earlier call (#862, 2026-06-24) kept prediction-markets L1-only — ingested but not
briefed — on a synthesis-breadth concern (the live feed surfaced a single market). Michael
reversed that in the 2026-06-26 interactive review: prediction-markets are now in scope for
this fact-vs-propaganda lens
and the Prediction Markets Weekly L2 brief lands. The
editorial discipline is unchanged — it is the change's safeguard: azimuth reports the
venue-quoted price as an observed fact (the implied probability and traded volume), with
the no-investment-framing / odds-are-not-forecasts caution, and takes no position on the
underlying question
the market asks. The price is the market's number, never azimuth's
forecast. The single-market breadth that justified the old hold is now handled by an explicit
honest-scope note inside the brief, not by withholding it. (sources/registry.json
themes.prediction-markets.brief_landed.)

Positive contract (L2 synthesis)

Enforcement map

Clause Enforcement
Channel is factual, not propaganda/opinion guardrail/source_guardrail.py (denied-content-class / denied-risk-flag, category editorial)
Channel is free-to-use (license gate, separate bar) guardrail/source_guardrail.py (missing-license / unrecognised-license, category license)
No investment / safety-position / propaganda / advocacy framing in L2 synthesis/lint.py check_editorial_denylist
Every claim sourced check_claim_sourcing
Links point at real L1 notes check_l1_links_exist
Curator never edits L1 check_diff_guard