feat(mcp): index structured meeting-summary fields (decisions/action items/open questions)#1328
Closed
r3dbars wants to merge 2 commits into
Closed
feat(mcp): index structured meeting-summary fields (decisions/action items/open questions)#1328r3dbars wants to merge 2 commits into
r3dbars wants to merge 2 commits into
Conversation
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>
Owner
Author
|
Closing as superseded by #1331, which merged the combined ask-meeting-history path covering this draft's scope. |
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
Makes the structured summary fields (Decisions / Action Items / Open Questions) queryable from the Transcripted MCP index. Today the summarizer extracts these into each meeting's summary, but the MCP index (
TranscriptIndex) only builds FTS over raw utterances + dictation — it never parses the summary. There was no decisions/action_items/open_questions table anywhere.This is the indexing foundation only. The cross-meeting tools (
list_action_items, etc.) are a separate thread that builds onlistSummaryItems.How
Parser (
TranscriptedCaptureKit) — newCaptureSummaryParser→ParsedMeetingSummary. The app-target preview parser (RecentMeetingSummaryPreviewParserinSources/UI/Shared/RecentCaptureScanners.swift) can't be imported across the module boundary, so the proven section logic is ported into the shared kit that the standalone tools already depend on. Handles both shapes:local_summary_versionfrontmatter + marker-bounded## Local Summarybody block with###subsections, plus pipe-joinedlocal_summary_*frontmatter fallback)meeting_summarysidecar (#sections)Action-item owner is extracted conservatively: a leading Title-Case name/team before
": "(≤3 words, ≤24 chars, no lowercase function words), with placeholders (unassigned,tbd,team, …) normalized to unassigned.Discuss the new API: …stays plain text.Index (
TranscriptedMCP)meeting_summary_itemstable (kinddiscriminator +owner+ FTS5 + AI/AD triggers, mirroring theutterancespattern). A single table with akindcolumn rolls up trivially across meetings — designed so the future tools thread canGROUP BY owner/ filter by kind without a per-category table.indexMeeting(inside the existing transaction); delete inremoveFromIndex.listSummaryItems(kind:owner:dateFrom:dateTo:)is the cross-meeting query foundation (owner: ""selects unassigned).*.summary.mdsidecars from meeting enumeration — read as a summary fallback instead of being indexed as empty junk meetings.user_versiongate (v2): existing on-disk indexes rebuild once on upgrade, since unchanged transcript mtimes would otherwise skip backfill. (The live path writes the summary into the transcript, so re-summarizing bumps its mtime and reconcile catches it; the sidecar-only staleness is a documented legacy-path limitation.)Tests
CaptureSummaryParserTests(9) — inline/sidecar parsing, owner extraction + sentence-colon guard, placeholder normalization, None-found → empty, frontmatter fallback, nil cases.SummaryItemIndexTests(8) — parse→index→query, owner + unassigned rollup, date filter, newest-first ordering, reindex-replaces, delete-clears, sidecar-not-a-meeting, older-schema-forces-rebuild.Verification
Per
.agents/test-matrix.yml(touchedTranscriptedCaptureKit/**+ MCP):swift test --package-path Tools/TranscriptedCaptureKit→ 34 passswift test --package-path Tools/TranscriptedCLI→ 45 passswift test --package-path Tools/TranscriptedMCP→ 82 passbash run-e2e-smoke.sh→ OKIndependent codex review: PASS, no P1. The two P2s it raised (backfill on upgrade; sidecar-only staleness) are addressed by the schema-version gate and documented, respectively.
Unblocks
Cross-meeting tools thread (
list_action_items, open-questions roll-up) builds onmeeting_summary_items+listSummaryItems.🤖 Generated with Claude Code