move_task_to_project
Moves a task from the ACTIVE project to ANOTHER project, PRESERVING its identifier, its creation date, its emitter, its status and its assignees. This is the action that was missing when a block moves house: after create_nested_project or link_project_to_cell, blocks get recreated but the tasks stayed behind, and recreating them by hand BREAKS the id convergence of create_tasks (a sync replay would duplicate them). A user story takes its subtasks along; a lone subtask is refused. You need WRITE access to both projects, and agent writes must not be locked on the target. Refuses — without writing anything — if the target project already holds a task with the same identifier. The response declares what did NOT follow, and — separately — what followed but loses its meaning in the target project.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cellId | No | The block of the TARGET project to link the task to. THREE states, and they differ: OMITTED = the task keeps its block link if the target project holds a block with the SAME identifier, otherwise it is detached (keeping its memory: it will relink by itself if that block is created there later); `null` = detach explicitly; an identifier = link to THAT block, which must exist in the target project. Affects only the named task — its subtasks always follow the "omitted" rule. | |
| taskId | Yes | ID of the task to move, in the ACTIVE project. Its identifier is PRESERVED on the other side — this is what keeps the `id` convergence of create_tasks valid. If it is a user story, its subtasks go WITH it. | |
| targetProjectId | Yes | ID of the project that must RECEIVE the task. The caller must have write access on both projects. Identifiers are read with list_projects. | |
| expectedProjectId | No | UUID of the project targeted by THIS call. ACTUALLY targets this project instead of the session project. Refused without changing anything if access is not granted. |