Sections (top to bottom, all wrapped in a cascade-entry animation):
- greeting block: MONDAY · 11 MAY label, serif-italic "Good morning, X."
greeting (server time, Europe/Copenhagen), tenure line that uses
cab_joined_date for cab members and falls back to created_at
- ActivityTicker fed by getRecentActivity (hidden when empty)
- this-week Pulse card: live breathing dot + time-left countdown, italic
serif question, 2×2 grid of option buttons that submit a hidden-action
vote form. Once voted, options lock and show a distribution bar fill;
the user's choice keeps a terracotta border. Empty state when no pulse
is open.
- 2-col roadmap preview + council mark: three most-recently-updated items
with status dot (copper/ochre/muted), and the user's CouncilMark md with
the "{n} of 12 quarters" stat
- members-in-the-room: 4 chips for other CAB members seen within 5 min,
+N overflow chip; pulsing copper dot for the "online now" indicator
- two-column event row: dark indigo "members-only" card (next dinner or
summit) + light "office hours" card (next office_hours event). Hidden
per-card when no matching upcoming event exists.
Vote POST uses the existing admin form pattern (hidden action field,
redirect on success). Activity row for 'voted' is written inline here;
step 11 covers the other activity sources.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cab and fenja are sent to /pulse on landing; pilot continues to see the
existing editorial home content in place. Uses the same helper the test
suite already covers, so behaviour is locked in.
Adds a minimal /pulse stub so the redirect target resolves; step 7 replaces
it with the full member view.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>