feat(transcripts): trackable follow-up tasks from call action items (LC-527) #501

Merged
longjacksonle merged 1 commit from longjacksonle/feat/LC-527-followup-tasks into main 2026-07-03 02:38:43 +02:00 AGit

Turns a call transcript's "## Action items" summary into a live, trackable checklist posted to the room. On the transcript page, once a summary with action items exists, a "Create follow-up tasks" button parses the bullet list and posts a follow-up card to the call's room. Each item is a checkbox anyone in the room can toggle done, plus a self-claim control so a member can take ownership of an item. Toggles and claims fan out over the WebSocket and re-render per viewer, exactly like poll votes.

The feature mirrors the LC-66 poll pattern end to end: a follow-up list is anchored to a messages row (followups + followup_items, migration 0080), rendered beneath the body via partials/followup_block.html inside an id-keyed #followup-{id} region, and updated live through a new FollowUpUpdated ChatEvent rendered per-recipient in ws.rs. Creation reuses finalize_message_send; the action-item parser is pure text (no extra LLM call) and bounds item count + length.

Scope note: self-claim only (a member can claim or release an item for themselves, never assign work to someone else), which keeps the moderation posture simple and sidesteps the "assigned work as social pressure" concern.

Also regenerates the LC-77 webhook/email render fixtures: they were left stale by LC-528's message.html change (CI runs only cargo test --lib, so the integration-only fixture test did not catch it); this brings them current and adds the LC-527 checklist whitespace.

Tests: db-layer CRUD/toggle/claim (db_followups.rs), action-item parser unit tests (inline, CI-covered via --lib), full just test + just test-saas + just check green.

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01NTRhc4n7A2uB2Y5PHV2ewL

Turns a call transcript's "## Action items" summary into a live, trackable checklist posted to the room. On the transcript page, once a summary with action items exists, a "Create follow-up tasks" button parses the bullet list and posts a follow-up card to the call's room. Each item is a checkbox anyone in the room can toggle done, plus a self-claim control so a member can take ownership of an item. Toggles and claims fan out over the WebSocket and re-render per viewer, exactly like poll votes. The feature mirrors the LC-66 poll pattern end to end: a follow-up list is anchored to a `messages` row (`followups` + `followup_items`, migration 0080), rendered beneath the body via `partials/followup_block.html` inside an id-keyed `#followup-{id}` region, and updated live through a new `FollowUpUpdated` ChatEvent rendered per-recipient in ws.rs. Creation reuses `finalize_message_send`; the action-item parser is pure text (no extra LLM call) and bounds item count + length. Scope note: self-claim only (a member can claim or release an item for themselves, never assign work to someone else), which keeps the moderation posture simple and sidesteps the "assigned work as social pressure" concern. Also regenerates the LC-77 webhook/email render fixtures: they were left stale by LC-528's message.html change (CI runs only `cargo test --lib`, so the integration-only fixture test did not catch it); this brings them current and adds the LC-527 checklist whitespace. Tests: db-layer CRUD/toggle/claim (db_followups.rs), action-item parser unit tests (inline, CI-covered via --lib), full `just test` + `just test-saas` + `just check` green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NTRhc4n7A2uB2Y5PHV2ewL
feat(transcripts): trackable follow-up tasks from call action items (LC-527)
All checks were successful
check-secrets / Nosey parker (pull_request) Successful in 6s
check-secrets / TruffleHog (pull_request) Successful in 10s
check-secrets / Kingfisher (pull_request) Successful in 10s
Check / clippy + fmt + tests (pull_request) Successful in 6m10s
Create release / Create release from merged PR (pull_request) Has been skipped
82c47fb4bc
Turns a call transcript's "## Action items" summary into a live, trackable checklist posted to the room. On the transcript page, once a summary with action items exists, a "Create follow-up tasks" button parses the bullet list and posts a follow-up card to the call's room. Each item is a checkbox anyone in the room can toggle done, plus a self-claim control so a member can take ownership of an item. Toggles and claims fan out over the WebSocket and re-render per viewer, exactly like poll votes.

The feature mirrors the LC-66 poll pattern end to end: a follow-up list is anchored to a `messages` row (`followups` + `followup_items`, migration 0080), rendered beneath the body via `partials/followup_block.html` inside an id-keyed `#followup-{id}` region, and updated live through a new `FollowUpUpdated` ChatEvent rendered per-recipient in ws.rs. Creation reuses `finalize_message_send`; the action-item parser is pure text (no extra LLM call) and bounds item count + length.

Scope note: self-claim only (a member can claim or release an item for themselves, never assign work to someone else), which keeps the moderation posture simple and sidesteps the "assigned work as social pressure" concern.

Also regenerates the LC-77 webhook/email render fixtures: they were left stale by LC-528's message.html change (CI runs only `cargo test --lib`, so the integration-only fixture test did not catch it); this brings them current and adds the LC-527 checklist whitespace.

Tests: db-layer CRUD/toggle/claim (db_followups.rs), action-item parser unit tests (inline, CI-covered via --lib), full `just test` + `just test-saas` + `just check` green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTRhc4n7A2uB2Y5PHV2ewL
longjacksonle scheduled this pull request to auto merge when all checks succeed 2026-07-03 02:33:14 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/lets-chat!501
No description provided.