Task
Action items — full CRUD with sub-task nesting, user-created and system-generated via ML.
Task
Tasks are action items associated with a meeting. They can be user-created or system-generated by ML during live recording. Tasks support nesting (sub-tasks), assignment to people, and due dates. For shared semantics, see Infrastructure.
Resource Shape
{
"id": "task-uuid",
"meeting_id": "meeting-uuid",
"content": "Send the rollout plan to design",
"status": "pending",
"source": "system",
"assigned_to": "person-uuid",
"due_date": "2026-05-08",
"parent_task_id": null,
"sub_task_summary": { "total": 2, "completed": 1 },
"created_at": "2026-05-01T09:04:30Z"
}Valid source values: user, system. Editing a system-generated task promotes it to user.
Valid status values: pending, completed.
REST API
GET /meetings/{id}/tasks
Returns tasks for a specific meeting.
| Auth | bearerAuth |
| Response | 200 TaskList |
| Query params | cursor, limit |
GET /tasks
Lists all tasks across meetings for the authenticated user.
| Auth | bearerAuth |
| Response | 200 TaskList |
| Query params | cursor, limit, meeting_id, status, assigned_to |
POST /tasks
Creates a task. User-created tasks come from the app; system-generated tasks come from ML through Core.
| Auth | bearerAuth or service auth |
| Idempotency | Required |
| Echo suppression | Client-Session-Id optional |
| Response | 201 Created with Task + Location: /tasks/{id} |
| Side effects | Broadcasts EntityChangedEvent { entity: "task", action: "created" }. During live sessions, Core also emits TaskEvent with the full task for immediate UI insertion. |
{
"meeting_id": "meeting-uuid",
"content": "Send the rollout plan to design",
"assigned_to": "person-uuid",
"due_date": "2026-05-08",
"parent_task_id": null,
"source": "user"
}GET /tasks/{id}
Returns a single task with sub-task summary.
| Auth | bearerAuth |
| Response | 200 Task |
| Errors | 404 task not found |
PATCH /tasks/{id}
Updates a task. Editing a system-generated task promotes it to source: "user".
| Auth | bearerAuth |
| Echo suppression | Client-Session-Id optional |
| Response | 200 Task |
| Side effects | Broadcasts EntityChangedEvent { entity: "task", action: "updated" } |
{
"content": "Send the rollout plan to design and engineering",
"status": "completed",
"source": "user"
}DELETE /tasks/{id}
Deletes a task and cascades to sub-tasks.
| Auth | bearerAuth |
| Echo suppression | Client-Session-Id optional |
| Response | 204 No Content |
| Side effects | Broadcasts EntityChangedEvent { entity: "task", action: "deleted" } |
GET /tasks/{id}/sub-tasks
Returns sub-tasks for a parent task.
| Auth | bearerAuth |
| Response | 200 TaskList |
POST /tasks/{id}/sub-tasks
Creates a sub-task nested under a parent task.
| Auth | bearerAuth |
| Idempotency | Required |
| Echo suppression | Client-Session-Id optional |
| Response | 201 Created with Task + Location: /tasks/{sub_id} |
| Side effects | Broadcasts EntityChangedEvent { entity: "task", action: "created" } |
Real-Time Events
Core → Browser
TaskEvent
Carries system-generated tasks produced during live recording. User-originated task mutations use EntityChangedEvent only because the optimistic local state already has the full payload.
{
"specversion": "1.0",
"id": "event-uuid",
"source": "wordloop-core/ws",
"type": "com.wordloop.meeting.task.v1",
"time": "2026-05-01T09:04:30Z",
"traceparent": "00-...",
"data": {
"meeting_id": "meeting-uuid",
"task": {
"id": "task-uuid",
"content": "Send the rollout plan to design",
"assigned_to": null,
"due_date": null,
"parent_task_id": null,
"source": "system",
"status": "pending"
}
}
}ML Integration
ML → Core
WebSocket: TaskProducedEvent
Emits a live system task from the same structured-output call as talking points. Core persists the task via POST /tasks and fans out TaskEvent to the browser.
{
"specversion": "1.0",
"id": "event-uuid",
"source": "wordloop-ml/ws",
"type": "com.wordloop.ml.task.v1",
"time": "2026-05-01T09:04:30Z",
"traceparent": "00-...",
"data": {
"meeting_id": "meeting-uuid",
"task": {
"id": "task-uuid",
"content": "Send the rollout plan to design",
"assigned_to": null,
"due_date": null,
"parent_task_id": null,
"source": "system"
}
}
}