Skip to content

feat(ai): carry-over briefing for upcoming meetings#100

Merged
pratikbodkhe merged 1 commit into
mainfrom
feat/ai-carryover-briefing
Jun 6, 2026
Merged

feat(ai): carry-over briefing for upcoming meetings#100
pratikbodkhe merged 1 commit into
mainfrom
feat/ai-carryover-briefing

Conversation

@pratikbodkhe

Copy link
Copy Markdown
Contributor

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). parseCarryoverBriefing validates the provider response and tolerates markdown fences. Counts are derived from data, not the model, so the numbers are always trustworthy.
  • Route 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.
  • Tests: test:ai-carryover (6 cases, wired into CI), contract-verifier assertions (route + prompt guardrails + UI mount), and e2e/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-carryover 6/6, test:ai-contracts, test:ci-workflows: pass
  • pnpm build (typecheck): pass; eslint on changed files: clean

TDD

summarizeCarryover / parseCarryoverBriefing written 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.

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.
@pratikbodkhe pratikbodkhe merged commit bcb9fa9 into main Jun 6, 2026
17 of 18 checks passed
@pratikbodkhe pratikbodkhe deleted the feat/ai-carryover-briefing branch June 6, 2026 02:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant