Skip to content

[MM-69856] Append Zoom chat continuation lines to prior message - #927

Merged
nickmisasi merged 2 commits into
masterfrom
mm-69856-2
Jul 28, 2026
Merged

[MM-69856] Append Zoom chat continuation lines to prior message#927
nickmisasi merged 2 commits into
masterfrom
mm-69856-2

Conversation

@jgheithcock

@jgheithcock jgheithcock commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Follow-up to #906: treat a valid HH:MM:SS timestamp as the discriminator for Zoom chat lines. Non-timestamp lines (short or long) append to the previous message instead of being skipped or failing the entire parse.

Ticket Link

https://mattermost.atlassian.net/browse/MM-69856

Release Note

Improved Zoom chat transcription parsing so multiline continuation messages are preserved when summarizing meetings.

Summary by CodeRabbit

  • Bug Fixes
    • Improved parsing of Zoom chat transcripts when generating subtitles.
    • Subtitle timing and text now better match HH:MM:SS <text> lines, with consistent subtitle durations.
    • Continuation lines are appended to the preceding subtitle (including short, multi-line, and malformed-separator cases).
    • Transcripts containing only non-timestamp lines no longer produce invalid subtitles.
  • Tests
    • Updated Zoom chat parsing coverage and added a test to ensure underlying reader/scanner failures surface as errors.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: a4e24121-2ee6-40b6-a8f8-b974f19f010d

📥 Commits

Reviewing files that changed from the base of the PR and between 6e49ad0 and 54a5f57.

📒 Files selected for processing (2)
  • subtitles/subtitles.go
  • subtitles/subtitles_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • subtitles/subtitles.go

📝 Walkthrough

Walkthrough

Zoom chat subtitle parsing now preserves non-timestamp continuation lines by appending them to the latest subtitle item. Tests cover timestamp formats, continuation handling, empty input, and scanner errors.

Changes

Zoom chat subtitle parsing

Layer / File(s) Summary
Parser behaviour and validation
subtitles/subtitles.go, subtitles/subtitles_test.go
readZoomChat parses the zero-time offset once, creates five-second items for valid timestamps, appends other lines to the latest item, and skips leading continuations. Tests validate updated output, empty-input behaviour, accepted and malformed timestamp formats, and propagated scanner errors.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: Zoom chat continuation lines are now appended to the prior message.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch mm-69856-2

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown

🤖 LLM Evaluation Results

OpenAI

⚠️ Overall: 21/28 tests passed (75.0%)

Provider Total Passed Failed Pass Rate
⚠️ OPENAI 28 21 7 75.0%

❌ Failed Evaluations

Show 7 failures

OPENAI

1. TestReactEval/[openai]_react_cat_message

  • Score: 0.00
  • Rubric: The word/emoji is a cat emoji or a heart/love emoji
  • Reason: The output is the text token "smiley_cat", not an actual cat emoji (e.g., 😺/🐱) or a heart/love emoji (e.g., ❤️).

2. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: is a list of bugs
  • Reason: The output does not provide any actual bug list; it requests the user to paste bugs and offers a template for a future table.

3. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: includes a description of each bug
  • Reason: The output does not include any actual bug descriptions; it only asks the user to provide bugs and offers an empty template. Therefore it does not include a description of each bug.

4. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes each bug to a user
  • Reason: The output asks the user to provide bug data and includes a table template with a 'Reported by' column, but it does not actually attribute any specific bugs to any users.

5. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes the bug about trying to save without a color and the save button not doing anything to @maria.nunez
  • Reason: The output asks for source data and provides a template, but it does not mention the specific bug (saving without a color and the save button not doing anything) nor does it attribute it to @maria.nunez.

6. TestConversationMentionHandling/[openai]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: the bug about the end user being able to change channel banner is attributed to @maria.nunez
  • Reason: The output does not mention the specific bug about an end user being able to change the channel banner, nor does it attribute that bug to @maria.nunez. It only asks for source data and provides a template.

7. TestDirectMessageConversations/[openai]_bot_dm_tool_introspection

  • Score: 0.00
  • Rubric: mentions Github and refers to the documentation
  • Reason: The output refers to documentation (docs.mattermost.com) but does not mention GitHub anywhere. Since the rubric requires both mentioning GitHub and referring to the documentation, it does not satisfy the rubric.

Anthropic

⚠️ Overall: 21/28 tests passed (75.0%)

Provider Total Passed Failed Pass Rate
⚠️ ANTHROPIC 28 21 7 75.0%

❌ Failed Evaluations

Show 7 failures

ANTHROPIC

1. TestReactEval/[anthropic]_react_cat_message

  • Score: 0.00
  • Rubric: The word/emoji is a cat emoji or a heart/love emoji
  • Reason: The output is the text string "heart_eyes_cat", not an actual cat emoji (e.g., 😺/🐱) or a heart/love emoji (e.g., ❤️/😍).

2. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: is a list of bugs
  • Reason: The output does not provide an actual list of bugs; it states lack of access and suggests how the user could share bug reports, plus a placeholder example table with ellipses rather than bug entries.

3. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: includes a description of each bug
  • Reason: The output does not include any actual bug descriptions; it only states it lacks access and provides an example table with placeholders ("..."). Therefore it does not include a description of each bug.

4. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes each bug to a user
  • Reason: The output does not attribute any bugs to specific users. It only suggests providing bug reports and includes an example table with a 'Reported By' column left as '...'.

5. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: attributes the bug about trying to save without a color and the save button not doing anything to @maria.nunez
  • Reason: The output states it cannot access bug trackers and suggests sharing bug reports, but it does not mention the specific bug about saving without a color nor attribute it to @maria.nunez.

6. TestConversationMentionHandling/[anthropic]_conversation_from_attribution_long_thread.json

  • Score: 0.00
  • Rubric: the bug about the end user being able to change channel banner is attributed to @maria.nunez
  • Reason: The output does not mention the specific bug about an end user being able to change the channel banner, nor does it attribute that bug to @maria.nunez. It only states it lacks access and provides a generic example table.

7. TestDirectMessageConversations/[anthropic]_bot_dm_tool_introspection

  • Score: 0.50
  • Rubric: mentions Github and refers to the documentation
  • Reason: The output refers to documentation (docs.mattermost.com) but does not mention GitHub anywhere.

This comment was automatically generated by the eval CI pipeline.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@subtitles/subtitles.go`:
- Around line 27-48: Update the subtitle parsing flow around the scanner loop to
check scanner.Err() after scanning completes. If an error is present, propagate
it instead of returning partial storage with a nil error; otherwise preserve the
existing storage return behavior.
- Around line 31-36: In the timestamp parsing branch, require the character at
line[8] to be a space before creating the astisub.Item; update the condition
around time.Parse so malformed separators such as “X” are rejected while valid
timestamp lines continue using line[9:] for text.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro

Run ID: d142c68b-bcf9-492f-a930-6de9d3bbd5e3

📥 Commits

Reviewing files that changed from the base of the PR and between ccc3c69 and 6e49ad0.

📒 Files selected for processing (2)
  • subtitles/subtitles.go
  • subtitles/subtitles_test.go

Comment thread subtitles/subtitles.go
Comment thread subtitles/subtitles.go Outdated
@jgheithcock jgheithcock added 2: Dev Review Requires review by a developer 3: QA Review Requires review by a QA tester. May occur at the same time as Dev Review labels Jul 27, 2026
@jgheithcock
jgheithcock requested a review from ogi-m July 27, 2026 18:10

@nang2049 nang2049 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@nickmisasi
nickmisasi merged commit 48a6b5e into master Jul 28, 2026
33 checks passed
@nickmisasi nickmisasi removed the 2: Dev Review Requires review by a developer label Jul 28, 2026
@nickmisasi
nickmisasi deleted the mm-69856-2 branch July 28, 2026 19:47
@nickmisasi

Copy link
Copy Markdown
Collaborator

@jgheithcock @ogi-m merging this to get it into release cut FYI

nickmisasi added a commit that referenced this pull request Jul 29, 2026
* [MM-69856] Safely parse short Zoom chat lines during summarization (#906)

* webapp: polish Agents list and agent configuration form UX (#887)

* webapp: polish Agents list and agent configuration form UX

Co-authored-by: Cursor <cursoragent@cursor.com>

* webapp: address PR review feedback and fix lint/i18n drift

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>

* e2e: update agent provider config tests for advanced section UX

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>

* e2e: fix Reasoning Effort select locator for nested form layout

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>

* e2e: expand advanced section before toggling Enable Tools in CRUD test

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>

* e2e: rename agent page helper and provider config spec to snake_case

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>

* e2e: revert snake_case renames to keep PR diff focused

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* Exempt embedded Mattermost MCP tools from the MCP license gate (#924)

* Exempt embedded Mattermost MCP tools from the MCP license gate

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

* webapp: mark remote MCP servers as a licensed feature in the system console

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

* Gate remote MCP auto-execution on license and base approval gate on acceptance

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

* Enforce remote MCP licensing at tool supply time and hide remote server config UI when unlicensed

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

* Address review feedback: plan-neutral chip title, shared license-mock helpers

Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

* [MM-69973] Validate the mention reminder's target post id before building the loop-in request (#931)

* [MM-69973] Harden post id handling in the agent mention reminder

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* [MM-69973] Harden webapp handling of values read from post props

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* [MM-69973] Validate and bound search source props in the webapp

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* [MM-69973] Add e2e coverage for the agent mention reminder loop-in link

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* webapp: use a transient styled-components prop for the sources toggle

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* webapp: use unique post ids in the search source cap test fixture

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* [MM-69973] Simplify the props validation changes and trim test duplication

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

* chore: retrigger CodeRabbit review after feedback triage

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* MM-69973: Trim scope to the mention reminder post id validation

Co-authored-by: nick.misasi <nick.misasi@mattermost.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-69856] Append Zoom chat continuation lines to prior message (#927)

* [MM-69856] Append Zoom chat continuation lines to prior message

* Address review: require timestamp separator and propagate scanner errors

* fix: guard nil map in web search context to prevent plugin crash (#935)

Unmarshaling the literal JSON "null" from the web_search_context post
prop succeeds and leaves the target map nil. The unconditional writes
that followed panicked with "assignment to entry in nil map", crashing
the plugin process and taking all AI routes offline. Any authenticated
user could trigger this by DMing a bot with props.web_search_context
set to "null".

Guard against a nil map after unmarshaling and add a table-driven test
covering null, empty-object, valid, and invalid inputs.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>

---------

Co-authored-by: JG Heithcock <jgheithcock@gmail.com>
Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Christopher Speller <crspeller@gmail.com>
Co-authored-by: Christopher Speller <crspeller@users.noreply.github.com>
Co-authored-by: mattermost-code <matty-code@mattermost.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

3: QA Review Requires review by a QA tester. May occur at the same time as Dev Review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants