Skip to content

feat: The assistant sees each recording's chapters and speakers - EXO-92130 - #433

Merged
bmestrallet merged 1 commit into
feature/ai-contributionfrom
feat/EXO-92130-recordings-outline
Oct 27, 2026
Merged

bmestrallet merged 1 commit into
feature/ai-contributionfrom
feat/EXO-92130-recordings-outline

Conversation

@bmestrallet

@bmestrallet bmestrallet commented Oct 26, 2026 •

Copy link
Copy Markdown

Why

EXO-92130: when an assistant lists a meeting's recordings, each recording shows its chapters and its speakers, so that the assistant picks the right recording and chapter before reading any transcript.

How

  • get_meeting_recordings gives, for the 10 newest recordings it lists, the chapters of the transcript (start in seconds, time, title) and the speakers' names in the order they first speak: the person's full name, the guest's name, or Speaker N (RecordingOutlineReader, RecordingChapterModel, RecordingOutlineModel). A recording without them is listed as before (NON_EMPTY).
  • The outline is read from Documents (DocumentFileService#getTranscriptionChapters, #getTranscriptionSegments, #getTranscriptionSpeakers) with the listing user's identity, so Documents' ACL applies. Chapters and speakers are read separately: a failure on one never takes the other away, and a failure on both lists the recording without an outline.
  • documents-api is a provided dependency, and the reader is a bean only when Documents is installed (@ConditionalOnClass by name, ObjectProvider in the tool): without Documents, recordings are listed as today.
  • Chapters are numbered as Documents numbers them (title and start present, stored order), and the tool description sends the assistant to get_transcript_excerpt (documents) with the recording's documentId and the chapter's number.

Tests

  • RecordingOutlineReaderTest, MeetingRecordingMcpToolTest: 22 tests, 0 failures, compiled against a documents-api carrying #2121 and #2122 built locally; this PR's CI needs a published documents-api with both, so it waits for those PRs.
  • On the shared test server, through an MCP client (Claude Code) connected to the server's MCP endpoint, not the EVA chat: get_meeting_recordings on the « Demo ACME recordings » meeting listed its 13 recordings, the ones with chapters showing them. Asked in the EVA chat by a recording's title, EVA hands the question to its Search or Content specialist and never reaches this tool: routing meeting questions is EXO-92131's.

The tool description changed: an instance that already imported it shows the new text after one start with meeds.mcp.tools.forceReimport=true.

Stacked on #429 (EXO-91998, get_meeting_recordings).

Knowledge: pending — EXO-92130

This change is classified N1 (the user's identity resolution drives the ACL'd Documents reads, recall-first) at 4093eb0 — its approver must be an Archi/Dev who knows it is N1, not an approval on AI review alone; author ≠ approver.

🤖 Generated with Claude Code

Base automatically changed from feat/EXO-91998-meeting-recordings to feature/ai-contribution October 27, 2026 11:38
…-92130

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@bmestrallet
bmestrallet force-pushed the feat/EXO-92130-recordings-outline branch from 4093eb0 to a54fffa Compare October 27, 2026 14:11
@bmestrallet

Copy link
Copy Markdown
Author

Rebased onto feature/ai-contribution after #432/#434 merged: head 4093eb0 → a54fffa. Resolved: MeetingRecordingModel gets both sides' fields in this order: durationSeconds (FB), previewUrl, then this PR's chapters and speakers. MeetingRecordingMcpTool builds it the same way. Build: local full mvn verify: BUILD SUCCESS, 118 tests (no PR Build runs here for feature/ai-contribution).

@bmestrallet
bmestrallet merged commit 11ddf8f into feature/ai-contribution Oct 27, 2026
1 check was pending
@bmestrallet
bmestrallet deleted the feat/EXO-92130-recordings-outline branch October 27, 2026 14:11
exo-swf pushed a commit that referenced this pull request Oct 28, 2026
…-92130 (#433)

## Why
EXO-92130: when an assistant lists a meeting's recordings, each
recording shows its chapters and its speakers, so that the assistant
picks the right recording and chapter before reading any transcript.

## How
- `get_meeting_recordings` gives, for the 10 newest recordings it lists,
the chapters of the transcript (start in seconds, time, title) and the
speakers' names in the order they first speak: the person's full name,
the guest's name, or `Speaker N` (`RecordingOutlineReader`,
`RecordingChapterModel`, `RecordingOutlineModel`). A recording without
them is listed as before (`NON_EMPTY`).
- The outline is read from Documents
(`DocumentFileService#getTranscriptionChapters`,
`#getTranscriptionSegments`, `#getTranscriptionSpeakers`) with the
listing user's identity, so Documents' ACL applies. Chapters and
speakers are read separately: a failure on one never takes the other
away, and a failure on both lists the recording without an outline.
- `documents-api` is a `provided` dependency, and the reader is a bean
only when Documents is installed (`@ConditionalOnClass` by name,
`ObjectProvider` in the tool): without Documents, recordings are listed
as today.
- Chapters are numbered as Documents numbers them (title and start
present, stored order), and the tool description sends the assistant to
`get_transcript_excerpt` (documents) with the recording's `documentId`
and the chapter's number.

## Tests
- `RecordingOutlineReaderTest`, `MeetingRecordingMcpToolTest`: 22 tests,
0 failures, compiled against a `documents-api` carrying #2121 and #2122
built locally; this PR's CI needs a published `documents-api` with both,
so it waits for those PRs.
- On the shared test server, through an MCP client (Claude Code)
connected to the server's MCP endpoint, not the EVA chat:
`get_meeting_recordings` on the « Demo ACME recordings » meeting listed
its 13 recordings, the ones with chapters showing them. Asked in the EVA
chat by a recording's title, EVA hands the question to its Search or
Content specialist and never reaches this tool: routing meeting
questions is EXO-92131's.

The tool description changed: an instance that already imported it shows
the new text after one start with `meeds.mcp.tools.forceReimport=true`.

Stacked on #429 (EXO-91998, `get_meeting_recordings`).

Knowledge: pending — EXO-92130

This change is classified N1 (the user's identity resolution drives the
ACL'd Documents reads, recall-first) at 4093eb0 — its approver must be
an Archi/Dev who knows it is N1, not an approval on AI review alone;
author ≠ approver.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <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