## 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. #### 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 before persistence - **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** the written transcript line contains `[redacted]` - **AND** the written transcript line does not contain `*****` ### 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. 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: 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** it applies the rule steps before the line is persisted