The weekly intelligence report feels like a fundamental unit of the work. It's on the calendar, clients expect it, the whole production line points at it. From the stream side, though, a week is just one parameter value. The mention count that anchors a weekly report is the same aggregation as an hourly dashboard tile — identical query, different window size.
That reframe sounds academic until you see what it deletes. In a batch stack, the weekly report's numbers are computed by report-build scripts, the dashboard's numbers by dashboard code, and any alert thresholds by a third thing. Three implementations of "mention velocity," which agree until they don't, and when a client asks why the dashboard said 340 and the report said 328, the answer is an archaeology project.
Stream processing collapses the three into one windowed view. Declare the aggregation once over the event stream; ask for it tumbled hourly, daily, and weekly. Flink's window functions make the sizes literally parameters:
```sql TUMBLE(TABLE signals, DESCRIPTOR(event_time), INTERVAL '1' HOUR) -- dashboard TUMBLE(TABLE signals, DESCRIPTOR(event_time), INTERVAL '7' DAY) -- report ```
There are more shapes than fixed buckets, and the shapes are analytically meaningful. Hopping windows (an hour of data, recomputed every 15 minutes) give alerts fast reaction without losing smoothing. Session windows close after a gap of silence, which turns "how long does a conversation about this brand last?" from an unaskable question into a GROUP BY. The window vocabulary is a vocabulary of questions.
The second half of the trick is what happens at report time. Flink runs the same SQL in batch mode over bounded, archived input. So the weekly figures aren't a separate computation that hopefully matches the live one — they're the standing definitions, evaluated over exactly the archived week. Rerun the report for the week of 2026-06-22 next March and the figures come out identical, because the inputs are archived and the definitions are versioned. Reproducible figures are the difference between a report and a defensible report.
One discipline makes this work: definitions that report figures cite have to be written mode-agnostically, anchored to event time, with no shortcuts that only make sense live. The definitions that deliberately break this rule (alerting on discovery time, so you hear about old-but-just-found evidence today) stay out of report figures. Two categories, chosen on purpose, documented in the view names.
The weekly report doesn't go away in this picture. Clients want the editorial judgment, the argument, the so-what — a cadence of human synthesis. What goes away is the report as the only moment the numbers exist. Numbers become continuous; the report becomes the weekly reading of them.
What's still open
Sessions and windows expose metrics clients haven't asked for because nobody could produce them (story lifetime, time-above-baseline, burst frequency). Which of those earn a place in the report, and which are just newly-possible noise? Newly measurable is a category that requires taste.
Related
-