Skip to content

feat(mcp): index structured meeting-summary fields (decisions/action items/open questions)#1328

Closed
r3dbars wants to merge 2 commits into
mainfrom
claude/sleepy-burnell-65ef40
Closed

feat(mcp): index structured meeting-summary fields (decisions/action items/open questions)#1328
r3dbars wants to merge 2 commits into
mainfrom
claude/sleepy-burnell-65ef40

Conversation

@r3dbars

@r3dbars r3dbars commented Jun 25, 2026

Copy link
Copy Markdown
Owner

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 on listSummaryItems.

How

Parser (TranscriptedCaptureKit) — new CaptureSummaryParserParsedMeetingSummary. The app-target preview parser (RecentMeetingSummaryPreviewParser in Sources/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:

  • inline transcript summary (local_summary_version frontmatter + marker-bounded ## Local Summary body block with ### subsections, plus pipe-joined local_summary_* frontmatter fallback)
  • legacy generated meeting_summary sidecar (# 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)

  • One normalized meeting_summary_items table (kind discriminator + owner + FTS5 + AI/AD triggers, mirroring the utterances pattern). A single table with a kind column rolls up trivially across meetings — designed so the future tools thread can GROUP BY owner / filter by kind without a per-category table.
  • Parse + insert in indexMeeting (inside the existing transaction); delete in removeFromIndex.
  • listSummaryItems(kind:owner:dateFrom:dateTo:) is the cross-meeting query foundation (owner: "" selects unassigned).
  • Exclude *.summary.md sidecars from meeting enumeration — read as a summary fallback instead of being indexed as empty junk meetings.
  • Schema user_version gate (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 (touched TranscriptedCaptureKit/** + MCP):

  • swift test --package-path Tools/TranscriptedCaptureKit → 34 pass
  • swift test --package-path Tools/TranscriptedCLI → 45 pass
  • swift test --package-path Tools/TranscriptedMCP → 82 pass
  • bash run-e2e-smoke.sh → OK

Independent 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 on meeting_summary_items + listSummaryItems.

🤖 Generated with Claude Code

r3dbars and others added 2 commits June 25, 2026 06:09
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>
@r3dbars

r3dbars commented Jun 26, 2026

Copy link
Copy Markdown
Owner Author

Closing as superseded by #1331, which merged the combined ask-meeting-history path covering this draft's scope.

@r3dbars r3dbars closed this Jun 26, 2026
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