feat(ai): carry-over briefing for upcoming meetings#100
Merged
Conversation
Add an OIL-native pre-meeting briefing that surfaces open, overdue, stale, and unowned issues carried from earlier meetings in the series. This is the differentiator Granola structurally cannot copy: accountability across a recurring series, not single-meeting notes. - src/lib/ai/carryover.ts: deterministic summarizeCarryover (overdue, no-owner, stale counts and ranking) plus fence-tolerant parseCarryoverBriefing. Counts come from the data, not the model. - New route /api/meetings/[meetingId]/carryover-briefing via the shared resilient client; skips the provider entirely when nothing is open. - CarryoverBriefingPanel mounted in the upcoming meeting view. - Unit tests (test:ai-carryover, wired into CI), contract assertions, and e2e/regression/carryover-briefing.spec.ts.
This was referenced Jun 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
PR B of the AI 80:20 program. Adds carry-over intelligence: an AI pre-meeting briefing that surfaces open / overdue / stale / unowned issues carried from earlier meetings in a series, shown in the upcoming-meeting view before the facilitator hits "Start meeting."
Why
This is the OIL-native differentiator from the Granola audit. Granola produces single-meeting notes; Minutia tracks accountability across a recurring series. A briefing of "what slipped, who owns it, what's overdue" is structurally impossible for a notes tool to replicate. High strategic leverage, built entirely on data we already have.
Changes
src/lib/ai/carryover.ts:summarizeCarryover(issues, today)computes overdue (due_date < today), no-owner, and stale (open >= 30d) counts plus a ranked list (overdue first, then due date, then staleness).parseCarryoverBriefingvalidates the provider response and tolerates markdown fences. Counts are derived from data, not the model, so the numbers are always trustworthy.POST /api/meetings/[meetingId]/carryover-briefing: mirrors the ask pattern, goes through the shared resilient client (callOpenRouter), and short-circuits with an empty briefing (no provider call) when nothing is open.CarryoverBriefingPanel: mounted in the upcoming meeting view under the brief card. Generate / regenerate, overdue + no-owner stat chips, error state. Hidden when no issues are carried.test:ai-carryover(6 cases, wired into CI), contract-verifier assertions (route + prompt guardrails + UI mount), ande2e/regression/carryover-briefing.spec.ts(503 unconfigured, real-key backend with deterministic counts, mocked panel render, error state, 401 auth guard).Verification (local)
test:ai-carryover6/6,test:ai-contracts,test:ci-workflows: passpnpm build(typecheck): pass; eslint on changed files: cleanTDD
summarizeCarryover/parseCarryoverBriefingwritten test-first: failing test (module missing) → minimal implementation → green. The AI only narrates the already-computed summary.Next
PR C transcript paste, then the Edge Functions infra PR. STT last.