Skip to content

feat: ask meeting history through MCP summaries#1331

Merged
r3dbars merged 6 commits into
mainfrom
codex/ask-meeting-history-path
Jun 26, 2026
Merged

feat: ask meeting history through MCP summaries#1331
r3dbars merged 6 commits into
mainfrom
codex/ask-meeting-history-path

Conversation

@r3dbars

@r3dbars r3dbars commented Jun 26, 2026

Copy link
Copy Markdown
Owner

Summary

Proof

  • codex-review against origin/main: clean, no actionable findings after fixes
  • swift test --package-path Tools/TranscriptedCaptureKit -> 38 tests passed
  • swift test --package-path Tools/TranscriptedCLI -> 45 tests passed
  • swift test --package-path Tools/TranscriptedMCP -> 110 tests passed after digest fix
  • bash build-deps.sh --force -> passed
  • bash build.sh --no-open -> passed; reviewer also reran app build successfully
  • bash run-tests.sh -> 11203 tests passed before final MCP-only digest fix
  • bash run-integration-smoke.sh -> passed before final MCP-only digest fix
  • bash run-e2e-smoke.sh -> passed
  • TRANSCRIPTED_DATA_DIR=$(mktemp -d) build/Transcripted.app/Contents/Helpers/transcripted-mcp --self-test -> ok
  • python3 scripts/dev/check-build-source-lists.py -> passed
  • git diff --check -> passed

Notes

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)

r3dbars and others added 6 commits June 25, 2026 18:35
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>
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