Morning brief
How the daily digest is assembled and delivered before 09:00.
Pre-cache scripts firecalendar + work queue fetched by 08:25
Cached JSON snapshotscalendar-YYYY-MM-DD.json, queue-YYYY-MM-DD.json
Most recent meeting notesGranola transcripts from last 48h
Sonnet synthesisbrief prompt + all three sources, < 90s
Telegram deliveryplain text, max 4000 chars
Brief archivedbriefs/nabila/YYYY-MM-DD.md
Why cache first? MCP tools that talk to external services can take 30-60s each. Pre-caching before 08:25 means the brief fires on time even if the calendar or queue service is slow.
Capture a thought
Sending any note via Telegram gets it classified, filed, and confirmed within ~30 seconds.
Telegram messageany free-form note, idea, or status update
Inbox listenerappends to _scratch/inbox/YYYY-MM-DD.md
Router hashes the entryskips duplicates, processes new entries only
Intent: capturevs. recall, action, feedback, diagnose
Project match foundfiled to project notes
No project matchfiled to ideas folder
Mirrored to Obsidian vaultKeystone/Captures/YYYY-MM-DD title.md
Semantic index updatedsearchable by ask/recall intents
Telegram confirmation"Captured: [title]. Filed at [path]."
The pipeline gap this fixed: Before May 2026, captures landed in project notes but never reached the semantic index or the weekly action scanner. Now every capture is mirrored to the vault so it closes open items automatically on Sunday.
Ask anything
Recall from the knowledge base using a natural language question via Telegram.
Telegram: "ask [question]"or "recall [question]"
Router extracts questionstrips "ask " prefix
Workspace scanreads project notes, memory, handoffs, briefs
Synthesisgrounded answer from workspace files only
Telegram replysplit across multiple messages if > 4000 chars
What it reads: project notes, memory shards, session handoffs, brief archives. It does not make external API calls, so it answers fast but only knows what has been indexed.
Leave feedback
How feedback on a brief changes what the next brief looks like.
Telegram: "fb: [feedback]"on any brief, any persona
Router classifies as brief_feedbackextracts target persona from context
Appended to feedback logbriefs/nabila/feedback.log with timestamp
Brief prompt includes feedbacklast 5 entries injected into synthesis prompt
Next brief reflects itno manual prompt editing required
Example: "fb: stop showing me cancelled meetings" gets logged and injected into the next morning's synthesis prompt. The brief adjusts without touching any config file.
Midday ping
Weekdays at 13:00: what three things still need to close before end of day. Uses the same cached data from the morning so it never re-fetches.
Morning cache (already fetched)calendar + queue snapshots from 08:25 run
Today's inboxcaptures and updates since morning — new signal only
13:00 CEST weekdays, Haiku 90s
Priority narrowingcross-ref: unblocked + high impact + not waiting on someone else; skips anything inbox shows as done
Telegram delivery2-3 bullets + one line on what's left on the calendar today
Brief archivedbriefs/nabila/YYYY-MM-DD-midday-ping.md
Design choice: always fires, no conditional. Even on quiet days, a "nothing new, here's what's left on the calendar" message is useful. The constraint is Haiku at 90s — fast enough to be in the flow, cheap enough to run daily.
Block scan
Mondays at 08:15: looks at the last 7 days of captured notes for anything that keeps appearing without a completion signal. Stuck work, surfaced early in the week.
Last 7 days of inbox files_scratch/inbox/YYYY-MM-DD.md, newest last
Ideas folder (14-day window)slugs captured 3+ times flagged as recurring
Recurring topic detectiontopic on 3+ different days, no done/shipped/merged/closed near it
Blocks found?NO_BLOCKS: silent exit, no Telegram
Diagnoses deliveredblock type (cognitive/emotional/capability), root cause, next physical action, reframe question
Why Mondays: The week starts with a clean read on what didn't resolve last week. Up to 4 blocks, each under 60 words. The reframe question is the sharpest part: "Is this actually stuck, or just unscheduled?"
1:1 prep
Thursdays at 09:30: cross-references open items from the last 1:1 against this week's changelogs and meeting transcripts. Only asks questions when there are genuine data gaps.
Last 1:1 briefopen decisions, commitments, RED/YELLOW OKR items
PPP changelogs this weekgit log last 7 days on product-brain; changelog sections only
Granola meeting transcriptsPM, sprint, OKR, and planning meetings only; standups excluded
Gap detectionfor each open item: is it covered by PPP or Granola this week? If not, it's a gap.
Gaps found?no gaps: "Brief looks solid. Nothing needed." Telegram fires either way.
Targeted questions or clearmax 4 questions, each names a specific project or commitment
The constraint that makes it useful: every question must name a specific project or commitment, not a general topic. "What's the status of the onboarding OKR?" is banned. "Has the FoS 3-combo cost decision been made?" is the target.
Meeting coaching
Every weekday at 18:00, every meeting that day gets scanned for behavioral patterns. Telegram only fires if there's something worth saying.
18:00 weekdaysend-of-day trigger; not tied to any specific meeting
All today's Granola transcriptsevery meeting, not just 1:1s; standups and pure-listening sessions filtered out
Active performance themes4 behavioral patterns: credit-sharing, backbencher identity, mid-spiral commits, conflict avoidance
Transcript scanexact quote + timestamp + which theme it matches
Coaching archive writtenpm-workspace/coaching/YYYY-MM-DD-coaching.md, every run
Any incidents found?+ repetition watch if same theme fires 3+ times
Telegram: coaching blockexact quote, theme, 2-sentence coaching note. Max 3 incidents.
Silent: clean dayarchive written, Telegram skipped. No noise when nothing happened.
What makes it honest: The coaching is grounded in exact transcript quotes, not impressions. If the model can't find a line that matches a pattern, it says so. Clean days stay silent. The archive captures everything regardless.
Weekly action scanner
Sunday at 10:00: closes out the past week's commitments from completion signals, then layers in next week's calendar, OKRs, and project themes to produce a forward-looking actions doc.
Obsidian vault scannedKeystone/, Captures/, Side Projects/ — action lines extracted
Completion signal matchingkeyword overlap (2+ words, 5+ chars) against "completed, shipped, merged, sent..."
State file updatedmatched items closed with reason; unmatched items persist; stale after 14 days
M365 calendar next Mon-Frivia MCP; Swedish public holidays table
Squad OKRsQ2 OKR CSV; RED/YELLOW status surfaced
Active project themes_product-brain/ context for each open item
Week actions doc_work/actions/YYYY-MM-DD-week-actions.md — backward closed + forward context
Not just a checklist: the backward pass closes what's done, the forward pass adds why the remaining items matter next week. OKR status and calendar context mean the doc tells you what to prioritise, not just what's open.
Open loops drift
On the 1st of each month at 21:00: scans every memory shard for unresolved markers. Silent unless something is hot or going stale.
All memory shard files~/.claude/projects/.../memory/*.md
Open marker countgrep: Open: / TODO: / Resume: / unchecked - [ ] across all shards
Hot or stale file?hot: >5 open markers in one file; stale: file idle 60+ days with any open markers
Telegram alert (if drift)lists hot and stale files by name; silent on clean months
Why monthly: the memory store accumulates cognitive debt slowly. Daily or weekly scans would produce noise. Monthly on the 1st is a natural review cadence — and silent months mean the store is healthy.