Alert Desk

The newsroom keeps the button. The desk keeps the log.
policy —
demo dataset

Everything here is synthetic

~1,000 generated readers, a week of editorial pushes, and lifecycle nudges — all produced by a seeded, deterministic builder (demo/build_dataset.py). No real reader data, no real publisher's editorial output.

  • User ids, names, stations, and quiet-hours timezones are invented.
  • Headlines are template-generated to look like a newsroom's daily mix; the two recurring "breaking" scenarios are generic enough to describe almost any market.
  • The decision log, caps, and disable-risk numbers you see are computed live by the same engine.decide() the unit tests exercise — the rules are real, the audience is not.

Rundown · what the desk would do right now

loading…
send quiet hours at cap held suppressed
Loading…
Decision log · live
Loading…
TimeUserClassSourceStatusRuleReason
Loading…

policy.json —

Every knob that governs push, in one file. The rule precedence is fixed and documented in engine.py; nothing here is applied ad hoc per candidate.

Compare: naive vs governed

"Naive" sends every candidate the instant it's generated — no caps, no quiet hours, no hold, no dedupe, no risk governor. P0 breaking news is identical in both runs, because the governed policy never throttles it either; this isolates exactly what Alert Desk's rules buy you, over the full synthetic week.

Loading…

What Alert Desk is, in plain English

Two streams

Editorial —

Programmatic —

Priority classes

Why this exists

The newsroom owns push. Product needs push to build a habit. Nobody arbitrates between them today — an editor and a lifecycle campaign can both message the same user in the same minute, and no one can say afterward why one landed and the other didn't. Alert Desk answers that with a rule, applied consistently, and a record of every decision it made, so the answer to "why did this user get five notifications yesterday" is a query, not a guess.