Update meeting summary agent UI

This commit is contained in:
2026-07-01 10:30:28 +02:00
parent 4787bf8cec
commit 92e359646b
18 changed files with 731 additions and 101 deletions
@@ -0,0 +1,32 @@
# Design
## Live Transcript Ordering
`MeetingRecordingCoordinator` will treat the formatted transcript line as the durable fallback. For each live segment:
1. Format and relabel the segment.
2. Append the formatted line to the transcript store immediately.
3. Keep the returned transcript-line reference for that exact appended line.
4. Queue `transcript_line` workflow processing out of band so later live segments can continue to be appended.
5. If workflow processing returns a different line, ask the transcript store to replace the referenced line.
6. If workflow processing fails, log the failure and keep the original appended line.
This preserves the observable transcript even when local automation rules are invalid, slow, or unexpectedly fail after validation.
## Transcript Store Contract
Add a transcript-store operation for replacing one previously written line by stable line reference. The vault-backed implementation serializes transcript-file edits per file and rewrites the referenced body line while preserving frontmatter. Existing bulk replacement remains in place for final diarization and speaker relabeling rewrites.
## Workflow Logging
The workflow engine already logs when a rule is applied. Extend this so logs show:
- rule start with rule name and event type,
- rule completion with whether the meeting note changed and whether the transcript line changed,
- rule errors with rule name and event type.
The engine will still throw for general workflow events so non-transcript lifecycle automation failures remain visible to callers. The recording coordinator catches transcript-line workflow failures during live transcript writes so transcript persistence continues.
## Disk-Full Follow-Up
The temporary WAV disk-full exception is tracked as a follow-up task. The expected one-hour file size for the configured `16 kHz / mono / 16-bit` stream is about 110 MiB, so a one-off disk-full error with ample later free space needs separate investigation rather than speculative cleanup behavior.
@@ -0,0 +1,25 @@
# Resilient Transcript Workflow
## Summary
Make live transcript persistence independent from workflow-rule success. Transcript lines should be written before optional workflow transformations run, changed lines should be rewritten in place, and workflow rule activity/errors should be logged clearly enough to diagnose broken local rules.
## Motivation
A running meeting showed Azure Speech continuing to emit live segments while the transcript markdown stopped advancing. The current append path waits for workflow transformation before writing each line, so a failing or stalled workflow rule can make transcription appear dead even when ASR is still producing output.
A separate earlier run logged a disk-full `IOException` while writing the temporary WAV, despite the expected WAV size being small. That anomaly should be tracked separately because the current evidence does not identify a safe corrective behavior beyond better diagnostics.
## Scope
- Write the formatted live transcript line before transcript-line workflow processing.
- Rewrite the just-written transcript line if workflow rules change it.
- Keep transcript writes going when transcript-line workflow rules fail.
- Log triggered workflow rules, workflow rule completion, and workflow rule errors with event context.
- Track follow-up investigation for anomalous temporary-recording disk-full failures.
## Out Of Scope
- Changing ASR providers or audio capture format.
- Restarting or interrupting an active meeting.
- Automatically deleting files or freeing disk space after a disk-full error.
@@ -0,0 +1,102 @@
## MODIFIED Requirements
### Requirement: Meeting automation rules support lifecycle triggers
Meeting Assistant SHALL support rule triggers for `created`, `state_transition`, `speaker_identified`, and `transcript_line`.
A `state_transition` trigger MAY filter by `from`, `to`, or both state values.
A `speaker_identified` trigger MAY filter by speaker name.
A `transcript_line` trigger MAY filter by speaker name.
Workflow rule execution SHALL log each triggered rule with its rule name and event type.
Workflow rule execution SHALL log rule failures with the rule name and event type.
#### Scenario: State transition rule matches from and to
- **GIVEN** a configured rule that triggers on a state transition from `collecting metadata` to `transcribing`
- **WHEN** Meeting Assistant transitions that meeting from `collecting metadata` to `transcribing`
- **THEN** it applies the rule steps
#### Scenario: Speaker identified rule filters by name
- **GIVEN** a configured rule that triggers when speaker `Ada` is identified
- **WHEN** Meeting Assistant identifies speaker `Grace`
- **THEN** it does not apply the rule
- **WHEN** Meeting Assistant identifies speaker `Ada`
- **THEN** it applies the rule steps
#### Scenario: Transcript line rule rewrites masked profanity after durable append
- **GIVEN** a configured rule that triggers on transcript line writes and sets `transcript.line` by replacing `*****` with `[redacted]`
- **WHEN** Meeting Assistant writes a transcript line for speaker `Guest-1` containing `*****`
- **THEN** Meeting Assistant first appends the original formatted line to the transcript file
- **AND** rewrites that written line to contain `[redacted]`
- **AND** the final written transcript line does not contain `*****`
#### Scenario: Transcript line workflow failure keeps transcript writing
- **GIVEN** a configured transcript line workflow rule fails while processing a transcript line
- **WHEN** Meeting Assistant receives that live transcript segment
- **THEN** Meeting Assistant keeps the original formatted line in the transcript file
- **AND** logs the workflow rule failure
- **AND** continues processing later transcript segments
### Requirement: Meeting automation rules support conditions and steps
Meeting Assistant SHALL support rule conditions using an expression engine.
Rules SHALL support nested `and`, `or`, and `not` condition groups.
Step values SHALL support Razor syntax against the current meeting event model.
Rendered step values SHALL be treated as plain UTF-8 text for markdown artifacts and SHALL NOT persist Razor HTML entity encoding.
Step values SHALL treat `@` characters inside valid email address tokens as literal text rather than Razor transitions.
Meeting Assistant SHALL expose the formatted transcript line and transcript speaker to `transcript_line` rule conditions and Razor step templates.
Meeting Assistant SHALL support these initial rule steps:
- `add_attendee`
- `remove_attendee`
- `set_property`
- `add_context`
- `add_project`
The `set_property` step SHALL support setting `transcript.line` during `transcript_line` events.
#### Scenario: Nested conditions choose a matching rule
- **GIVEN** a configured rule with nested `and`, `or`, and `not` conditions over meeting title, attendees, and event data
- **WHEN** the condition evaluates to true
- **THEN** Meeting Assistant applies the rule
- **WHEN** the condition evaluates to false
- **THEN** Meeting Assistant skips the rule
#### Scenario: Templated context mentions identified speaker
- **GIVEN** a configured `speaker_identified` rule with an `add_context` step using Razor syntax
- **WHEN** Meeting Assistant identifies matching speaker `Ada`
- **THEN** it appends rendered context text containing `Ada` to the assistant context note
#### Scenario: Email addresses do not trigger Razor templating
- **GIVEN** a configured rule step value containing `Support@contoso.com`
- **WHEN** the rule runs
- **THEN** Meeting Assistant preserves the email address as literal text
#### Scenario: Email addresses can appear beside Razor templating
- **GIVEN** a configured rule step value containing both `Support@contoso.com` and a Razor expression
- **WHEN** the rule runs
- **THEN** Meeting Assistant renders the Razor expression and preserves the email address as literal text
#### Scenario: Razor-rendered transcript line preserves UTF-8 text
- **GIVEN** a configured `transcript_line` rule uses Razor to replace part of a transcript line containing `heißt`, `Schimpfwörter`, and `nächstes`
- **WHEN** the rule changes `transcript.line`
- **THEN** the resulting transcript line contains the original UTF-8 characters
- **AND** does not contain HTML entities such as `ß`, `ö`, or `ä`
#### Scenario: Rule can clean a meeting title
- **GIVEN** a configured state-transition rule that matches a title containing a configured marker
- **WHEN** the rule runs
- **THEN** Meeting Assistant can update the meeting title through `set_property`
#### Scenario: Transcript line conditions can use the written line and speaker
- **GIVEN** a configured `transcript_line` rule with conditions over `transcript.line` and `transcript.speaker`
- **WHEN** Meeting Assistant writes a transcript line that matches both conditions
- **THEN** Meeting Assistant applies the rule steps after the original formatted line is durably appended
- **AND** rewrites the written line if a rule changes `transcript.line`
@@ -0,0 +1,9 @@
# Tasks
- [x] Add requirement scenarios for resilient transcript workflow writes and workflow diagnostics.
- [x] Add a failing behavior test proving transcript text is written when transcript-line workflow rules fail.
- [x] Append live transcript lines before workflow transformation and rewrite changed lines afterward.
- [x] Add workflow rule completion/error logging.
- [x] Update workflow engine documentation.
- [x] Run focused tests and `openspec validate resilient-transcript-workflow --strict`.
- [ ] Follow up later: investigate anomalous temporary-recording disk-full `IOException` despite small expected WAV size.