Skip to content

Tasks (Symphony)

Foundry tasks are the system of record for work in flight across your project fleet. Every task has a title, status, priority, optional project link, dependencies, comment thread, and branch/PR/deploy fields so agents and humans can hand off without losing context.

Tasks are managed in the Cockpit UI (app.sassmaker.com), through the API, or via fnd api — the same endpoints power all three.

FieldTypeDescription
idstringStable identifier.
titlestringRequired. Short imperative summary.
descriptionstringOptional. Multi-line markdown.
project_slugstringOptional. Pins the task to a project (filterable).
statusenumpending, in_progress, blocked, completed.
priorityenumlow, normal, high.
task_typeenumFree-form bucket — e.g. bug, feature, chore.
sizeenums, m, l.
dependenciesstring[]Other task IDs that block this one.
branch_namestringGit branch.
pr_url, pr_statusstring, enumPR link and one of none, draft, open, merged, closed.
commit_shastringLast known commit.
deployment_url, deployment_statusstring, enumDeploy URL and one of none, pending, success, failed.
blocked_on_userbooleanWhen true, deployment status is forced back to none.

blocked_on_user and deployment_status are mutually exclusive — setting one clears the other.

All task endpoints require a session token. Use fnd login to obtain one or pass Authorization: Bearer <token> directly.

GET /v1/tasks

Optional filters: status, project_slug.

Terminal window
fnd api GET /v1/tasks --auth session --query status=in_progress --output table

Response (200):

{ "data": [ { "id": "task_...", "title": "...", "status": "in_progress", ... } ] }
GET /v1/tasks/:id
Terminal window
fnd api GET /v1/tasks/<taskId> --auth session

Returns 404 if the task does not belong to the authenticated user.

POST /v1/tasks
Terminal window
fnd api POST /v1/tasks --auth session \
--body '{
"title": "Ship invite flow",
"description": "Implement invitation tokens and email delivery.",
"project_slug": "my-app",
"priority": "high",
"task_type": "feature",
"size": "m",
"dependencies": ["task_abc"]
}'
FieldRequiredNotes
titleYesNon-empty string.
descriptionNo
project_slugNoSurface the task on the project’s task board.
priorityNoDefaults to normal.
task_type, sizeNoFree-form buckets.
dependenciesNoArray of other task IDs.
branch_name, pr_url, pr_status, commit_shaNoGit state — usually set by agents as work progresses.
deployment_url, deployment_status, blocked_on_userNoDeploy state.

Response (201): Full task object.

PATCH /v1/tasks/:id

Any subset of the create fields, plus status. Setting blocked_on_user: true clears deployment_status; setting deployment_status to anything other than none clears blocked_on_user.

Terminal window
fnd api PATCH /v1/tasks/<taskId> --auth session \
--body '{ "status": "in_progress", "branch_name": "feature/invites" }'
DELETE /v1/tasks/:id
Terminal window
fnd api DELETE /v1/tasks/<taskId> --auth session

Response (200): { "ok": true }

Comments belong to a task and have an author_type of either user or agent.

GET /v1/tasks/:id/comments
POST /v1/tasks/:id/comments
Terminal window
fnd api POST /v1/tasks/<taskId>/comments --auth session \
--body '{
"body": "PR opened — waiting on review.",
"author_type": "agent",
"author_label": "claude-opus"
}'
FieldRequiredNotes
bodyYesMarkdown text.
author_typeNouser (default) or agent.
author_labelNoOptional display label for agent comments.

Tasks integrate with three Symphony surfaces that record how work was actually executed by agents:

  • /v1/symphony/memory — operating notes shared with local agents.
  • /v1/symphony/audit — append-only audit log of task dispatches and agent handoffs.
  • /v1/symphony/runs — ledger of local task-run starts with agent profile, pid, command, and cost notes.

See the CLI page for recipes.