WordloopWordloop
WorkMeeting RecordingTechnical Design DocContracts

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.

AuthbearerAuth
Response200 TaskList
Query paramscursor, limit

GET /tasks

Lists all tasks across meetings for the authenticated user.

AuthbearerAuth
Response200 TaskList
Query paramscursor, 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.

AuthbearerAuth or service auth
IdempotencyRequired
Echo suppressionClient-Session-Id optional
Response201 Created with Task + Location: /tasks/{id}
Side effectsBroadcasts 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.

AuthbearerAuth
Response200 Task
Errors404 task not found

PATCH /tasks/{id}

Updates a task. Editing a system-generated task promotes it to source: "user".

AuthbearerAuth
Echo suppressionClient-Session-Id optional
Response200 Task
Side effectsBroadcasts 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.

AuthbearerAuth
Echo suppressionClient-Session-Id optional
Response204 No Content
Side effectsBroadcasts EntityChangedEvent { entity: "task", action: "deleted" }

GET /tasks/{id}/sub-tasks

Returns sub-tasks for a parent task.

AuthbearerAuth
Response200 TaskList

POST /tasks/{id}/sub-tasks

Creates a sub-task nested under a parent task.

AuthbearerAuth
IdempotencyRequired
Echo suppressionClient-Session-Id optional
Response201 Created with Task + Location: /tasks/{sub_id}
Side effectsBroadcasts 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"
    }
  }
}

On this page