update_task
Partially update one task. Pass only the fields you want to change: title (string, 1-500 chars), description (string or null to clear, up to 10000 chars), status (TODO/IN_PROGRESS/REVIEW/DONE/BLOCKED), priority (LOW/MEDIUM/HIGH/CRITICAL, a ranking label that does not put a task on the critical path), dueDate (ISO or null to clear), startDate (ISO or null), assigneeId (user id or null to unassign), progress (0-100), estimatedHours (number or null to clear), agentBrief (per-task agent spec, string or null to clear), isMilestone (boolean), constraintType (ASAP/ALAP/MSO/MFO/SNET/SNLT/FNET/FNLT or null) + constraintDate + deadline (ISO dates or null), plannedCost + fixedCost + baselineCost (currency numbers or null), recurringRule ({freq,interval,endDate?} object or null), previewUrl + prUrl (URLs or null to clear), isManual (for a task with subtasks: true keeps its own dates, false takes them from its subtasks, null follows the project). A date, duration or constraint change on a task whose dates come from its subtasks is refused with code:"PARENT_DATES_FROM_SUBTASKS"; change a subtask, or send isManual:true with the dates. Optional notify="owner"|"assigner"|"both" sends a notification to the assignee, the creator, or both. Optional reason adds a comment with the supplied text and includes it in the notification body. Caller must have task.edit.any on the project, or task.edit.own + ownership. Optional expectedUpdateRevision guards against overwriting a concurrent edit: when it no longer matches, the call SUCCEEDS with applied:false and code:"UPDATE_REVISION_MISMATCH" and writes nothing, so read applied before treating the task as changed. A real write returns applied:true. In a project with automatic scheduling off, a date or duration change moves no other task, and the result carries autoScheduleOff:true. When the edit moves the project finish, the result carries finishMove: the old and new finish, what changed, the driving chain, and plain sentences. PREFER bulk_update_status when flipping status on 2+ tasks at once; PREFER bulk_update_tasks when applying the SAME multi-field patch to 2+ tasks.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| prUrl | No | Source-control PR URL, or null to clear. | |
| title | No | New title (1-500 chars). | |
| dryRun | No | Preview only. Return the per-field diff (current vs proposed) + currentUpdateRevision without committing. Writes nothing and fires no side effects. Pair with expectedUpdateRevision on the real call. | |
| notify | No | Send a notification to owner (assignee), assigner (creator), or both. | |
| reason | No | Free-text reason for the update, up to 5000 chars. Adds a comment + appears in the notification body. | |
| status | No | ||
| taskId | Yes | Task to update. | |
| dueDate | No | ISO date or null to clear. | |
| noCache | No | Bypass idempotency dedup for this call (re-runs apply on a byte-identical retry). Use only when a prior write was confirmed lost; prefer expectedUpdateRevision. | |
| deadline | No | Hard deadline (distinct from dueDate target); ISO date or null to clear. | |
| isManual | No | For a task with subtasks: true keeps its own dates, false takes its start and due from its subtasks, null follows the project. | |
| parentId | No | Move task to a different parent. Pass null to move to project root. | |
| priority | No | Priority label (LOW/MEDIUM/HIGH/CRITICAL) that people set to rank work. It is not the critical path: the schedule engine computes that from dependencies, durations and the calendar, and priority does not change it. | |
| progress | No | Integer 0-100. | |
| fixedCost | No | Fixed cost (currency, 2dp), or null to clear. | |
| startDate | No | ISO date or null to clear. | |
| agentBrief | No | Per-task agent spec/brief, or null to clear. Up to 20000 chars. | |
| assigneeId | No | User id or null to unassign. | |
| previewUrl | No | Deployed preview URL, or null to clear. | |
| actualStart | No | ISO date work actually began. Stamped automatically from startDate the first time the task leaves TODO or gains progress. Changing it on a task that is not DONE and not pinned by MSO or MFO moves startDate to it and dueDate to where the remaining work finishes; sending dates too lets the dates win. null clears. | |
| description | No | New description, or null to clear. | |
| isMilestone | No | Flip the task into (true) or out of (false) milestone mode. | |
| plannedCost | No | Planned cost (currency, 2dp), or null to clear. | |
| baselineCost | No | Baseline/original-budget cost (currency, 2dp), or null to clear. | |
| recurringRule | No | Recurring config { freq: daily|weekly|monthly, interval: int>=1, endDate?: ISO|null }, or null to stop recurring. | |
| constraintDate | No | ISO date for the constraint, or null to clear. | |
| constraintType | No | MS Project constraint: ASAP/ALAP (as soon/late as possible), MSO/MFO (must start/finish on), SNET/FNET (start/finish no earlier than), SNLT/FNLT (start/finish no later than), or null to clear. | |
| estimatedHours | No | Estimated hours of effort; null to clear; matches create_task contract. | |
| expectedUpdateRevision | No | §U3 optimistic-concurrency guard. Pass Task.updateRevision from your last read; mismatch returns UPDATE_REVISION_MISMATCH so concurrent agents don't silently overwrite each other. | |
| originalDurationMinutes | No | Planned duration in working minutes (a day is the project calendar's hoursPerDay, default 8h = 480). Setting it on a task with a startDate moves dueDate to match; sending dates too lets the dates win. null clears. | |
| remainingDurationMinutes | No | Working minutes left. Defaults to original x (1 - progress); DONE forces 0. On a started task (actualStart set) that is not DONE and not pinned by MSO or MFO, changing it moves dueDate to where that work finishes, counted from the later of actualStart and the project status date; sending dates too lets the dates win. null clears. |