WordloopWordloop
WorkMeeting RecordingTechnical Design DocMilestones07 Live Talking Points

Core — Live Talking Points

POST /meetings/:id/talking-points ML write-back for provisional draft points, TalkingPointEvent broadcast, and PUT /meetings/:id/synthesis final replacement.

Core — Live Talking Points

Owner: Core Engineer Domain: core Complexity: S Prerequisite: Milestone 04 merged

When this slice is complete, Core accepts ML's live talking-point write-back (POST /meetings/{id}/talking-points), stores each one with is_final: false, and exposes them via GET /meetings/{id}/talking-points. Stopping the recording runs the shared finalization path; the synthesis write-back (PUT /meetings/{id}/synthesis) atomically replaces every draft with the final, is_final: true set — drafts never survive alongside final points, and their ids are disjoint. Private notes are untouched by either path.

Required Capabilities

  • POST /meetings/{id}/talking-points (service auth) creates a talking point with is_final: false.
  • GET /meetings/{id}/talking-points returns every talking point for the meeting, live drafts included.
  • While recording is active, no talking point returned is is_final: true, and the meeting's synthesis carries no final talking points yet.
  • PUT /meetings/{id}/synthesis atomically replaces the entire talking-point set with the final, is_final: true rebuild output — draft ids do not survive into the final set.
  • After finalization, GET /meetings/{id}/talking-points and GET /meetings/{id}/synthesis agree on the final talking-point content.
  • Neither the draft write-back nor the final synthesis replacement modifies notes.

Dependencies

  • Milestone 04 (live-transcript-to-final-rebuild) must be merged — specifically the live recording WebSocket session and the shared finalization pipeline that PUT /synthesis runs through on stop.

Domain Notes

Draft and final talking points are the same resource at different points in its lifecycle, not two parallel tables — a draft is a row with is_final: false created by the live write-back, and finalization is a full atomic replacement of that meeting's talking-point set, not a merge or patch. This is why the finalization test can assert the draft ids are entirely disjoint from the final ids: replacement, not promotion.

Test Cases

Test cases map to tests/bets/meeting-recording/test_milestone_07_live_talking_points.py. Run via ./dev test bet meeting-recording.

TestLocationAssertion
test_draft_talking_points_appear_during_live_transcripttest_milestone_07While a live transcript streams, GET /meetings/{id}/talking-points returns at least one draft with non-empty content, and the meeting has live transcript segments backing it.
test_draft_talking_points_are_marked_provisionaltest_milestone_07Every live talking point carries is_final: false; the meeting's synthesis (if present) has no final talking points while recording is active.
test_draft_talking_points_update_with_more_contexttest_milestone_07After more transcript context streams, the draft content or id set changes from its earlier snapshot, every draft remains is_final: false, and no two drafts share identical content.
test_finalization_replaces_drafts_with_final_talking_pointstest_milestone_07After stop and finalization, no is_final: false talking points remain, all returned points are is_final: true, none of the final ids intersect the pre-stop draft ids, and GET /synthesis agrees with GET /talking-points on content.
test_private_notes_remain_unchanged_by_talking_pointstest_milestone_07notes set via PATCH /meetings/{id} before recording remain identical after draft talking points appear and after the final synthesis replaces them.

Completion Checklist

  • Code merged and deployed
  • Bet progress tests pass (./dev test bet meeting-recording)
  • Permanent service tests implemented per testing strategy
  • Code review completed
  • API review completed (POST /meetings/{id}/talking-points write-back)
  • Testing review completed
  • System documentation updated (as applicable)

On this page