feat: ask meeting history through MCP summaries#1331
Merged
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The heavy local summarizer (Gemma/Apple beta) only writes Decisions / Action Items / Open Questions when a user opts into the ~12GB path, so the "ask my history" index only ever covered a subset of meetings. Add an always-on, dependency-free heuristic extraction that runs on every meeting save (live + imported) and writes a baseline version of the same logical fields into a parallel `auto_summary_*` frontmatter namespace. - MeetingQuickSummaryExtractor: precision-leaning rule pass over the styled transcript (curated cue lists, sentence-level matching, dedupe, per-section caps) producing a LocalMeetingSummarySections. - MeetingQuickSummaryWriter: idempotent, frontmatter-only writer. Deliberately does NOT reuse the heavy `local_summary_*` keys (those gate Home UI and the "Run AI summary" affordance), so the heavy summarizer stays the high-quality path and overwrites nothing. - Wired into MeetingSessionController.restyleSavedTranscriptInBackground, after restyle, on the chained background task. Coverage of the index fields is now 100% of meetings instead of the beta opt-in subset. Value format mirrors `local_summary_*` exactly so the Moat #1 indexer can fall back to `auto_summary_*` (heavy taking precedence). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rollups Make Decisions / Action Items / Open Questions queryable from the MCP index. Previously the index only built FTS over raw utterances + dictation; the per-meeting summary (decisions, action items, open questions) was written to the transcript but never indexed. - Add CaptureSummaryParser to TranscriptedCaptureKit (the shared seam the standalone tools depend on; the app-target preview parser can't be imported). Ports the proven section logic from RecentMeetingSummaryPreviewParser and understands both the inline transcript summary and the legacy meeting_summary sidecar. Action-item owner is extracted conservatively (Title-Case name/team, placeholders normalized to unassigned). - Add a single normalized meeting_summary_items table (kind discriminator + owner + FTS5 + triggers, mirroring utterances) so cross-meeting tools can roll up across all meetings without a per-category table. TranscriptIndex .listSummaryItems(kind:owner:dateFrom:dateTo:) is the query foundation. - Parse + insert in indexMeeting; delete in removeFromIndex. Exclude *.summary.md sidecars from meeting enumeration (read as a summary fallback instead of indexed as empty junk meetings). - Add a schema user_version gate so existing on-disk indexes rebuild once on upgrade — unchanged transcript mtimes would otherwise skip backfill. Scope is the indexing foundation only; the cross-meeting MCP tools (list_action_items, etc.) are a separate thread that builds on listSummaryItems. Tests: CaptureSummaryParserTests (parse: inline/sidecar/owner/None-found/ fallback) + SummaryItemIndexTests (parse->index->query, owner+unassigned rollup, date filter, reindex/delete, sidecar-not-a-meeting, version rebuild). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ns/digest) Add three read-only MCP tools that aggregate the structured summary fields across meetings instead of one at a time (NEXT_WORK #4): - list_action_items — filter by owner (name-variant + substring), status (open default / done / all), free-text query, and date window - list_decisions — free-text query + date window - digest — every meeting in a window with its decisions/action items/open questions grouped, plus rolled-up counts Contributes the provisional summary-fact schema (action_items / decisions / open_questions, keyed to meeting id, with FTS), the write seam replaceSummaryFacts() that the summary-index PR's extractor will call, the query layer, the tool handlers, and tests (action items filtered by owner across 2+ meetings, status/date/FTS filters, decisions, digest rollup, write-seam idempotency, reindex clears stale facts). HARD DEPENDENCY: populating these tables is owned by the summary-index PR ("Moat #1: index summary fields"). Sequence #1 first, then rebase this. Until then the tables stay empty in production and the tools return a clear "not indexed yet" message. See docs/cross-meeting-tools.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jun 26, 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.
Summary
meeting_summary_itemsinstead of separate provisional rollup tablesProof
origin/main: clean, no actionable findings after fixesswift test --package-path Tools/TranscriptedCaptureKit-> 38 tests passedswift test --package-path Tools/TranscriptedCLI-> 45 tests passedswift test --package-path Tools/TranscriptedMCP-> 110 tests passed after digest fixbash build-deps.sh --force-> passedbash build.sh --no-open-> passed; reviewer also reran app build successfullybash run-tests.sh-> 11203 tests passed before final MCP-only digest fixbash run-integration-smoke.sh-> passed before final MCP-only digest fixbash run-e2e-smoke.sh-> passedTRANSCRIPTED_DATA_DIR=$(mktemp -d) build/Transcripted.app/Contents/Helpers/transcripted-mcp --self-test-> okpython3 scripts/dev/check-build-source-lists.py-> passedgit diff --check-> passedNotes
status=doneaction-item queries intentionally return empty for now because saved summaries do not carry done/due metadata yet;openandallreturn indexed summary action items.lanes used: Codex=branch integration, code fixes, tests, review, PR; Claude=skipped (Codex review covered final independent pass); Local=attempted overlap triage via maestro-delegate but output was unusable; Windows=skipped (not needed for local Mac build/test proof)