docs/panels/latest-brief.mdx
The Latest Brief panel is the dashboard surface for the WorldMonitor Brief — an AI-generated intelligence digest that synthesises the most significant events in the reader's configured digest window into a structured, source-attributed read. The default product cadence is daily, but digest rules can also produce twice-daily or weekly slots through digestMode. The panel simply mirrors the latest composed brief for the signed-in reader at the moment they open the dashboard.
For the canonical pipeline details, see News Digest and Briefing Methodology.
Three states are rendered, depending on the reader and the composer's progress:
Panel id is latest-brief; canonical component is src/components/LatestBriefPanel.ts.
premium: 'locked'). Not present in the happy variant. Source: FULL_PANELS, TECH_PANELS, FINANCE_PANELS, COMMODITY_PANELS in src/config/panels.ts.Clicking Read brief → opens the full magazine-style reader in a new tab. Sharing the brief is a separate, explicit action — see AI Brief Endpoints for how share links are materialised.
The panel calls GET /api/latest-brief (Clerk JWT required, PRO gated). The response is either the ready payload (issueDate, dateLong, greeting, threadCount, magazineUrl) or a { status: "composing", issueDate } stub. The signed magazineUrl is generated server-side — the HMAC signing secret never lives in the client bundle.
The brief itself is composed by a Railway job from:
Redis key shape (for anyone inspecting the feature from the backend):
brief:{userId}:{issueSlot} — where issueSlot is computed by issueSlotInTz(nowMs, userTz), so two same-day compose runs in different time-of-day slots produce distinct keys.brief:latest:{userId} → { "issueSlot": "<slot>" }. Readers (the dashboard panel, the share-URL endpoint) resolve the current brief by reading the pointer first, then fetching the slot-keyed envelope.Reference: scripts/seed-digest-notifications.mjs (writer) and api/latest-brief.ts (reader).
digestMode is due. Default is daily; twice-daily and weekly modes are supported by the same writer.COMPOSING_POLL_MS = 60_000 in src/components/LatestBriefPanel.ts) so the panel transitions from composing to ready on the next composer tick without requiring a full page reload. The poll timer is cleared when the panel leaves the composing state.The panel follows the latest slot pointer rather than assuming a strictly
calendar-daily edition. If the composer has not produced the current/requested
slot yet, the panel shows composing and auto-promotes to ready once the
composer writes the payload.
Followed-country personalisation is a soft lift, not a filter and not a
cross-severity promotion. The nominal FOLLOWED_BIAS_MULTIPLIER is 1.25
and is env-tunable, but the live composer applies it as a stable severity-lane
sort: a followed-country story can move ahead of non-followed stories in the
same lane, while lower-severity stories never jump above higher-severity
stories. Free-tier readers can follow up to 3 countries.
The brief excludes op-ed/opinion and analysis columns, feel-good/lifestyle items, and ephemeral live-coverage teasers such as "WATCH LIVE" pages. Those items can be acceptable in live news surfaces, but delayed briefs are meant to summarise durable event-driven intelligence.
Latest Brief is PRO. The panel is registered with premium: 'locked' in src/config/panels.ts, so free-tier readers see the upgrade overlay and never see the brief body. Verification runs server-side in api/latest-brief.ts — a valid Clerk JWT and an active PRO entitlement are both required; otherwise the endpoint returns 403 pro_required. No content is exposed over the wire for non-PRO readers.
/api/latest-brief, /api/brief/share-url, the public /api/brief/public/{hash} read, the per-user per-slot read, and the social-ready PNG carousel route.