changedInput schema / properties / tasks / anyOf
Previous value: -[
- {
- "additionalProperties": false,
- "properties": {
- "arbitrage": {
- "description": "Turns this task into an ARBITRATION (a question with options posed to a human) — see `update_task.arbitrageAction` for the rest of the cycle (approval/challenge by the human, pick-up and closure by the agent). `cellId` omitted: the arbitration takes the block of its parent task (`parentTaskId`), otherwise it is born WITHOUT A SUBJECT (visible in the Arbitrations tab, on no card) — the response says so.",
- "properties": {
- "options": {
- "description": "The PRE-DEFINED answers — at least two, otherwise there is nothing to choose.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "description": "SHORT identifier of the option — cited by `choose`, and not displayed on its own.",
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "The text of the proposed answer.",
- "maxLength": 300,
- "minLength": 1,
- "type": "string"
- },
- "recommended": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "justification": {
- "description": "Why this option is recommended — displayed next to it.",
- "maxLength": 1000,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "justification"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "Marks THIS option as the agent's recommendation. Omitted/`null` = no recommendation on this option (the normal case)."
- }
- },
- "required": [
- "id",
- "label"
- ],
- "type": "object"
- },
- "maxItems": 8,
- "minItems": 2,
- "type": "array"
- },
- "question": {
- "description": "The question posed to the human.",
- "maxLength": 2000,
- "minLength": 1,
- "type": "string"
- },
- "selectionMode": {
- "description": "The human selection mode — `single` (one option only, the default) or `multiple` (checkboxes, several options possible). Set once and fixed afterwards.",
- "enum": [
- "single",
- "multiple"
- ],
- "type": "string"
- }
- },
- "required": [
- "question",
- "options"
- ],
- "type": "object"
- },
- "assignees": {
- "description": "Assignees. An identifier or a name of a person of the project is RESOLVED; any other string is kept as is as an unresolved designation, not discarded.",
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 10,
- "type": "array"
- },
- "body": {
- "description": "Detailed note, optional.",
- "maxLength": 20000,
- "type": "string"
- },
- "cellId": {
- "description": "The block (cell) the task belongs to — RECOMMENDED in almost every case: a task without a cellId appears on NO card of the canvas, only in the Tasks view. A genuinely cross-cutting task with no single subject (e.g. \"prepare the monthly meeting\") goes without it. Omitted = a task with \"No subject\".",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "complexity": {
- "description": "RELATIVE order of magnitude in HUMAN TIME: xs = under an hour · s = a few hours · m = half a day to a day · l = a few days · xl = to SPLIT. It is estimated ahead of the pick-up of the work; it is an estimate, not a promise. No value = not estimated.",
- "enum": [
- "xs",
- "s",
- "m",
- "l",
- "xl"
- ],
- "type": "string"
- },
- "dependsOn": {
- "description": "Ids of OTHER tasks of this project that BLOCK this one (distinct from `parentTaskId`, which ORGANIZES without ever blocking). Each id must exist in this project — including in this SAME batch, if the referenced task appears earlier in the array. Omitted = no dependency. Distinct from `status: 'blocked'` (a manual action, independent): blocking BY DEPENDENCY is read via `list_tasks({fields:['dependsOn','openDependencyCount']})` or the `executable` filter.",
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 50,
- "type": "array"
- },
- "dueOn": {
- "description": "DATED due date (YYYY-MM-DD). Only a date makes \"overdue\" appear.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
- "type": "string"
- },
- "dueText": {
- "description": "Due date as free text (\"end of the week\"). Kept as is and displayed, but it triggers NO overdue calculation: `dueOn` carries the date when it is known.",
- "maxLength": 200,
- "type": "string"
- },
- "externalId": {
- "description": "The identifier of this task IN the originating system (e.g. \"ENG-1234\"). Goes in pair with `externalSource`, in every case.",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "externalSource": {
- "description": "The system this task comes from (e.g. \"linear\", \"jira\", \"notion\"). Displayed provenance — does not replace `id` as the idempotence key. Goes in pair with `externalId`, in every case.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "id": {
- "description": "Identifier supplied by the caller — a key on the external system's side (ticket, import line, an agent's replay key). Omitted = generated by OrgGen (tk_...). If this project already holds a task with this identifier, NOTHING is written for it: it is returned as is (alreadyExisted: true) — a replayed call does not duplicate, and different content on the second call does not overwrite the first. Migration from an external system: the usual pattern is `\"<source>-<external-id>\"` (e.g. `\"linear-ENG-1234\"`) — THIS field carries the idempotence, `externalSource`/`externalId` below only display the provenance.",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "labels": {
- "items": {
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 20,
- "type": "array"
- },
- "links": {
- "description": "The DELIVERABLES of this task (at most 20) — commit, pull request, deployment, run, document. They are then ADDED one by one through `update_task.addLinks`, not by replacing the list.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "documentId": {
- "description": "For the `document` type ONLY: the identifier of a document of the project that YOU can read (`list_documents`).",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "key": {
- "description": "Your STABLE key for this deliverable (e.g. `pr-482`): replaying an addition with the same key does not duplicate it, it UPDATES it (this is how you move a PR from `open` to `merged`: a `key` and a `state` are then enough, without repeating the URL). Without a key, the URL (normalized), then `(type, ref)`, designate the entry.",
- "maxLength": 255,
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "Short displayed label.",
- "maxLength": 120,
- "minLength": 1,
- "type": "string"
- },
- "ref": {
- "description": "Short reference displayed in monospace (sha, PR number, run identifier).",
- "maxLength": 80,
- "minLength": 1,
- "type": "string"
- },
- "state": {
- "description": "The state YOU DECLARE, true at the time of the call — OrgGen never verifies it, the human sees \"declared by the agent\".",
- "enum": [
- "open",
- "merged",
- "closed",
- "succeeded",
- "failed",
- "superseded"
- ],
- "type": "string"
- },
- "type": {
- "description": "The kind of deliverable — closed enumeration.",
- "enum": [
- "commit",
- "pull_request",
- "deployment",
- "run",
- "document",
- "other"
- ],
- "type": "string"
- },
- "url": {
- "description": "ABSOLUTE http(s) address, without embedded username or password. OrgGen never opens it: it is only displayed.",
- "maxLength": 2048,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "type"
- ],
- "type": "object"
- },
- "maxItems": 20,
- "minItems": 1,
- "type": "array"
- },
- "parentTaskId": {
- "description": "Links this task to its parent grouping (\"Part of\") — another task of this project WITHOUT `parentTaskId`, a user story (US) — of which it becomes a SUBTASK. The epic, on the other hand, is the BLOCK (`cellId`): the parent task is never the epic. Omitted = a top-level task (a US). Depth is limited to TWO levels: the target cannot already be a subtask itself. In a BATCH, the target can be created in the SAME call if it appears earlier in the array (with an explicit `id`).",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "priority": {
- "enum": [
- "urgent",
- "high",
- "normal",
- "low"
- ],
- "type": "string"
- },
- "status": {
- "enum": [
- "todo",
- "doing",
- "done",
- "blocked"
- ],
- "type": "string"
- },
- "title": {
- "description": "The task label, on one line.",
- "maxLength": 500,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title"
- ],
- "type": "object"
- },
- {
- "items": {
- "additionalProperties": false,
- "properties": {
- "arbitrage": {
- "description": "Turns this task into an ARBITRATION (a question with options posed to a human) — see `update_task.arbitrageAction` for the rest of the cycle (approval/challenge by the human, pick-up and closure by the agent). `cellId` omitted: the arbitration takes the block of its parent task (`parentTaskId`), otherwise it is born WITHOUT A SUBJECT (visible in the Arbitrations tab, on no card) — the response says so.",
- "properties": {
- "options": {
- "description": "The PRE-DEFINED answers — at least two, otherwise there is nothing to choose.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "description": "SHORT identifier of the option — cited by `choose`, and not displayed on its own.",
- "maxLength": 100,
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "The text of the proposed answer.",
- "maxLength": 300,
- "minLength": 1,
- "type": "string"
- },
- "recommended": {
- "anyOf": [
- {
- "additionalProperties": false,
- "properties": {
- "justification": {
- "description": "Why this option is recommended — displayed next to it.",
- "maxLength": 1000,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "justification"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
- ],
- "description": "Marks THIS option as the agent's recommendation. Omitted/`null` = no recommendation on this option (the normal case)."
- }
- },
- "required": [
- "id",
- "label"
- ],
- "type": "object"
- },
- "maxItems": 8,
- "minItems": 2,
- "type": "array"
- },
- "question": {
- "description": "The question posed to the human.",
- "maxLength": 2000,
- "minLength": 1,
- "type": "string"
- },
- "selectionMode": {
- "description": "The human selection mode — `single` (one option only, the default) or `multiple` (checkboxes, several options possible). Set once and fixed afterwards.",
- "enum": [
- "single",
- "multiple"
- ],
- "type": "string"
- }
- },
- "required": [
- "question",
- "options"
- ],
- "type": "object"
- },
- "assignees": {
- "description": "Assignees. An identifier or a name of a person of the project is RESOLVED; any other string is kept as is as an unresolved designation, not discarded.",
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 10,
- "type": "array"
- },
- "body": {
- "description": "Detailed note, optional.",
- "maxLength": 20000,
- "type": "string"
- },
- "cellId": {
- "description": "The block (cell) the task belongs to — RECOMMENDED in almost every case: a task without a cellId appears on NO card of the canvas, only in the Tasks view. A genuinely cross-cutting task with no single subject (e.g. \"prepare the monthly meeting\") goes without it. Omitted = a task with \"No subject\".",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "complexity": {
- "description": "RELATIVE order of magnitude in HUMAN TIME: xs = under an hour · s = a few hours · m = half a day to a day · l = a few days · xl = to SPLIT. It is estimated ahead of the pick-up of the work; it is an estimate, not a promise. No value = not estimated.",
- "enum": [
- "xs",
- "s",
- "m",
- "l",
- "xl"
- ],
- "type": "string"
- },
- "dependsOn": {
- "description": "Ids of OTHER tasks of this project that BLOCK this one (distinct from `parentTaskId`, which ORGANIZES without ever blocking). Each id must exist in this project — including in this SAME batch, if the referenced task appears earlier in the array. Omitted = no dependency. Distinct from `status: 'blocked'` (a manual action, independent): blocking BY DEPENDENCY is read via `list_tasks({fields:['dependsOn','openDependencyCount']})` or the `executable` filter.",
- "items": {
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 50,
- "type": "array"
- },
- "dueOn": {
- "description": "DATED due date (YYYY-MM-DD). Only a date makes \"overdue\" appear.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
- "type": "string"
- },
- "dueText": {
- "description": "Due date as free text (\"end of the week\"). Kept as is and displayed, but it triggers NO overdue calculation: `dueOn` carries the date when it is known.",
- "maxLength": 200,
- "type": "string"
- },
- "externalId": {
- "description": "The identifier of this task IN the originating system (e.g. \"ENG-1234\"). Goes in pair with `externalSource`, in every case.",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "externalSource": {
- "description": "The system this task comes from (e.g. \"linear\", \"jira\", \"notion\"). Displayed provenance — does not replace `id` as the idempotence key. Goes in pair with `externalId`, in every case.",
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "id": {
- "description": "Identifier supplied by the caller — a key on the external system's side (ticket, import line, an agent's replay key). Omitted = generated by OrgGen (tk_...). If this project already holds a task with this identifier, NOTHING is written for it: it is returned as is (alreadyExisted: true) — a replayed call does not duplicate, and different content on the second call does not overwrite the first. Migration from an external system: the usual pattern is `\"<source>-<external-id>\"` (e.g. `\"linear-ENG-1234\"`) — THIS field carries the idempotence, `externalSource`/`externalId` below only display the provenance.",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "labels": {
- "items": {
- "maxLength": 60,
- "minLength": 1,
- "type": "string"
- },
- "maxItems": 20,
- "type": "array"
- },
- "links": {
- "description": "The DELIVERABLES of this task (at most 20) — commit, pull request, deployment, run, document. They are then ADDED one by one through `update_task.addLinks`, not by replacing the list.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "documentId": {
- "description": "For the `document` type ONLY: the identifier of a document of the project that YOU can read (`list_documents`).",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "key": {
- "description": "Your STABLE key for this deliverable (e.g. `pr-482`): replaying an addition with the same key does not duplicate it, it UPDATES it (this is how you move a PR from `open` to `merged`: a `key` and a `state` are then enough, without repeating the URL). Without a key, the URL (normalized), then `(type, ref)`, designate the entry.",
- "maxLength": 255,
- "minLength": 1,
- "type": "string"
- },
- "label": {
- "description": "Short displayed label.",
- "maxLength": 120,
- "minLength": 1,
- "type": "string"
- },
- "ref": {
- "description": "Short reference displayed in monospace (sha, PR number, run identifier).",
- "maxLength": 80,
- "minLength": 1,
- "type": "string"
- },
- "state": {
- "description": "The state YOU DECLARE, true at the time of the call — OrgGen never verifies it, the human sees \"declared by the agent\".",
- "enum": [
- "open",
- "merged",
- "closed",
- "succeeded",
- "failed",
- "superseded"
- ],
- "type": "string"
- },
- "type": {
- "description": "The kind of deliverable — closed enumeration.",
- "enum": [
- "commit",
- "pull_request",
- "deployment",
- "run",
- "document",
- "other"
- ],
- "type": "string"
- },
- "url": {
- "description": "ABSOLUTE http(s) address, without embedded username or password. OrgGen never opens it: it is only displayed.",
- "maxLength": 2048,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "type"
- ],
- "type": "object"
- },
- "maxItems": 20,
- "minItems": 1,
- "type": "array"
- },
- "parentTaskId": {
- "description": "Links this task to its parent grouping (\"Part of\") — another task of this project WITHOUT `parentTaskId`, a user story (US) — of which it becomes a SUBTASK. The epic, on the other hand, is the BLOCK (`cellId`): the parent task is never the epic. Omitted = a top-level task (a US). Depth is limited to TWO levels: the target cannot already be a subtask itself. In a BATCH, the target can be created in the SAME call if it appears earlier in the array (with an explicit `id`).",
- "maxLength": 200,
- "minLength": 1,
- "type": "string"
- },
- "priority": {
- "enum": [
- "urgent",
- "high",
- "normal",
- "low"
- ],
- "type": "string"
- },
- "status": {
- "enum": [
- "todo",
- "doing",
- "done",
- "blocked"
- ],
- "type": "string"
- },
- "title": {
- "description": "The task label, on one line.",
- "maxLength": 500,
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "title"
- ],
- "type": "object"
- },
- "maxItems": 100,
- "minItems": 1,
- "type": "array"
- }
-]New value: +[
+ {
+ "additionalProperties": false,
+ "properties": {
+ "arbitrage": {
+ "description": "Turns this task into an ARBITRATION (a question with options posed to a human) — see `update_task.arbitrageAction` for the rest of the cycle (approval/challenge by the human, pick-up and closure by the agent). `cellId` omitted: the arbitration takes the block of its parent task (`parentTaskId`), otherwise it is born WITHOUT A SUBJECT (visible in the Arbitrations tab, on no card) — the response says so.",
+ "properties": {
+ "options": {
+ "description": "The PRE-DEFINED answers — at least two, otherwise there is nothing to choose.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "description": "SHORT identifier of the option — cited by `choose`, and not displayed on its own.",
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "The text of the proposed answer.",
+ "maxLength": 300,
+ "minLength": 1,
+ "type": "string"
+ },
+ "recommended": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "justification": {
+ "description": "Why this option is recommended — displayed next to it.",
+ "maxLength": 1000,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "justification"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Marks THIS option as the agent's recommendation. Omitted/`null` = no recommendation on this option (the normal case)."
+ }
+ },
+ "required": [
+ "id",
+ "label"
+ ],
+ "type": "object"
+ },
+ "maxItems": 8,
+ "minItems": 2,
+ "type": "array"
+ },
+ "question": {
+ "description": "The question posed to the human.",
+ "maxLength": 2000,
+ "minLength": 1,
+ "type": "string"
+ },
+ "selectionMode": {
+ "description": "The human selection mode — `single` (one option only, the default) or `multiple` (checkboxes, several options possible). Set once and fixed afterwards.",
+ "enum": [
+ "single",
+ "multiple"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "question",
+ "options"
+ ],
+ "type": "object"
+ },
+ "assignees": {
+ "description": "Assignees. An identifier or a name of a person of the project is RESOLVED; any other string is kept as is as an unresolved designation, not discarded.",
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 10,
+ "type": "array"
+ },
+ "body": {
+ "description": "Detailed note, optional.",
+ "maxLength": 20000,
+ "type": "string"
+ },
+ "cellId": {
+ "description": "The block (cell) the task belongs to — RECOMMENDED in almost every case: a task without a cellId appears on NO card of the canvas, only in the Tasks view. A genuinely cross-cutting task with no single subject (e.g. \"prepare the monthly meeting\") goes without it. Omitted = a task with \"No subject\".",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "complexity": {
+ "description": "RELATIVE order of magnitude in HUMAN TIME: xs = under an hour · s = a few hours · m = half a day to a day · l = a few days · xl = to SPLIT. It is estimated ahead of the pick-up of the work; it is an estimate, not a promise. No value = not estimated.",
+ "enum": [
+ "xs",
+ "s",
+ "m",
+ "l",
+ "xl"
+ ],
+ "type": "string"
+ },
+ "dependsOn": {
+ "description": "Ids of OTHER tasks of this project that BLOCK this one (distinct from `parentTaskId`, which ORGANIZES without ever blocking). Each id must exist in this project — including in this SAME batch, if the referenced task appears earlier in the array. Omitted = no dependency. Distinct from `status: 'blocked'` (a manual action, independent): blocking BY DEPENDENCY is read via `list_tasks({fields:['dependsOn','openDependencyCount']})` or the `executable` filter.",
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "dueOn": {
+ "description": "DATED due date (YYYY-MM-DD). Only a date makes \"overdue\" appear.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ },
+ "dueText": {
+ "description": "Due date as free text (\"end of the week\"). Kept as is and displayed, but it triggers NO overdue calculation: `dueOn` carries the date when it is known.",
+ "maxLength": 200,
+ "type": "string"
+ },
+ "executor": {
+ "description": "WHO is expected to DO the task: `agent` (an AI agent may take it) or `human` (a person must do it — an agent does not claim it and `list_tasks({executable:true})` leaves it out). This is an instruction, not an identity: it does not say who is ASSIGNED. Omitted = unspecified (the default for every existing task).",
+ "enum": [
+ "agent",
+ "human"
+ ],
+ "type": "string"
+ },
+ "externalId": {
+ "description": "The identifier of this task IN the originating system (e.g. \"ENG-1234\"). Goes in pair with `externalSource`, in every case.",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "externalSource": {
+ "description": "The system this task comes from (e.g. \"linear\", \"jira\", \"notion\"). Displayed provenance — does not replace `id` as the idempotence key. Goes in pair with `externalId`, in every case.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "id": {
+ "description": "Identifier supplied by the caller — a key on the external system's side (ticket, import line, an agent's replay key). Omitted = generated by OrgGen (tk_...). If this project already holds a task with this identifier, NOTHING is written for it: it is returned as is (alreadyExisted: true) — a replayed call does not duplicate, and different content on the second call does not overwrite the first. Migration from an external system: the usual pattern is `\"<source>-<external-id>\"` (e.g. `\"linear-ENG-1234\"`) — THIS field carries the idempotence, `externalSource`/`externalId` below only display the provenance.",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "labels": {
+ "items": {
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "links": {
+ "description": "The DELIVERABLES of this task (at most 20) — commit, pull request, deployment, run, document. They are then ADDED one by one through `update_task.addLinks`, not by replacing the list.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "documentId": {
+ "description": "For the `document` type ONLY: the identifier of a document of the project that YOU can read (`list_documents`).",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "key": {
+ "description": "Your STABLE key for this deliverable (e.g. `pr-482`): replaying an addition with the same key does not duplicate it, it UPDATES it (this is how you move a PR from `open` to `merged`: a `key` and a `state` are then enough, without repeating the URL). Without a key, the URL (normalized), then `(type, ref)`, designate the entry.",
+ "maxLength": 255,
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "Short displayed label.",
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ },
+ "ref": {
+ "description": "Short reference displayed in monospace (sha, PR number, run identifier).",
+ "maxLength": 80,
+ "minLength": 1,
+ "type": "string"
+ },
+ "state": {
+ "description": "The state YOU DECLARE, true at the time of the call — OrgGen never verifies it, the human sees \"declared by the agent\".",
+ "enum": [
+ "open",
+ "merged",
+ "closed",
+ "succeeded",
+ "failed",
+ "superseded"
+ ],
+ "type": "string"
+ },
+ "type": {
+ "description": "The kind of deliverable — closed enumeration.",
+ "enum": [
+ "commit",
+ "pull_request",
+ "deployment",
+ "run",
+ "document",
+ "other"
+ ],
+ "type": "string"
+ },
+ "url": {
+ "description": "ABSOLUTE http(s) address, without embedded username or password. OrgGen never opens it: it is only displayed.",
+ "maxLength": 2048,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ],
+ "type": "object"
+ },
+ "maxItems": 20,
+ "minItems": 1,
+ "type": "array"
+ },
+ "parentTaskId": {
+ "description": "Links this task to its parent grouping (\"Part of\") — another task of this project WITHOUT `parentTaskId`, a user story (US) — of which it becomes a SUBTASK. The epic, on the other hand, is the BLOCK (`cellId`): the parent task is never the epic. Omitted = a top-level task (a US). Depth is limited to TWO levels: the target cannot already be a subtask itself. In a BATCH, the target can be created in the SAME call if it appears earlier in the array (with an explicit `id`).",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "priority": {
+ "enum": [
+ "urgent",
+ "high",
+ "normal",
+ "low"
+ ],
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "todo",
+ "doing",
+ "done",
+ "blocked"
+ ],
+ "type": "string"
+ },
+ "title": {
+ "description": "The task label, on one line.",
+ "maxLength": 500,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title"
+ ],
+ "type": "object"
+ },
+ {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "arbitrage": {
+ "description": "Turns this task into an ARBITRATION (a question with options posed to a human) — see `update_task.arbitrageAction` for the rest of the cycle (approval/challenge by the human, pick-up and closure by the agent). `cellId` omitted: the arbitration takes the block of its parent task (`parentTaskId`), otherwise it is born WITHOUT A SUBJECT (visible in the Arbitrations tab, on no card) — the response says so.",
+ "properties": {
+ "options": {
+ "description": "The PRE-DEFINED answers — at least two, otherwise there is nothing to choose.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "description": "SHORT identifier of the option — cited by `choose`, and not displayed on its own.",
+ "maxLength": 100,
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "The text of the proposed answer.",
+ "maxLength": 300,
+ "minLength": 1,
+ "type": "string"
+ },
+ "recommended": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "justification": {
+ "description": "Why this option is recommended — displayed next to it.",
+ "maxLength": 1000,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "justification"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Marks THIS option as the agent's recommendation. Omitted/`null` = no recommendation on this option (the normal case)."
+ }
+ },
+ "required": [
+ "id",
+ "label"
+ ],
+ "type": "object"
+ },
+ "maxItems": 8,
+ "minItems": 2,
+ "type": "array"
+ },
+ "question": {
+ "description": "The question posed to the human.",
+ "maxLength": 2000,
+ "minLength": 1,
+ "type": "string"
+ },
+ "selectionMode": {
+ "description": "The human selection mode — `single` (one option only, the default) or `multiple` (checkboxes, several options possible). Set once and fixed afterwards.",
+ "enum": [
+ "single",
+ "multiple"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "question",
+ "options"
+ ],
+ "type": "object"
+ },
+ "assignees": {
+ "description": "Assignees. An identifier or a name of a person of the project is RESOLVED; any other string is kept as is as an unresolved designation, not discarded.",
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 10,
+ "type": "array"
+ },
+ "body": {
+ "description": "Detailed note, optional.",
+ "maxLength": 20000,
+ "type": "string"
+ },
+ "cellId": {
+ "description": "The block (cell) the task belongs to — RECOMMENDED in almost every case: a task without a cellId appears on NO card of the canvas, only in the Tasks view. A genuinely cross-cutting task with no single subject (e.g. \"prepare the monthly meeting\") goes without it. Omitted = a task with \"No subject\".",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "complexity": {
+ "description": "RELATIVE order of magnitude in HUMAN TIME: xs = under an hour · s = a few hours · m = half a day to a day · l = a few days · xl = to SPLIT. It is estimated ahead of the pick-up of the work; it is an estimate, not a promise. No value = not estimated.",
+ "enum": [
+ "xs",
+ "s",
+ "m",
+ "l",
+ "xl"
+ ],
+ "type": "string"
+ },
+ "dependsOn": {
+ "description": "Ids of OTHER tasks of this project that BLOCK this one (distinct from `parentTaskId`, which ORGANIZES without ever blocking). Each id must exist in this project — including in this SAME batch, if the referenced task appears earlier in the array. Omitted = no dependency. Distinct from `status: 'blocked'` (a manual action, independent): blocking BY DEPENDENCY is read via `list_tasks({fields:['dependsOn','openDependencyCount']})` or the `executable` filter.",
+ "items": {
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 50,
+ "type": "array"
+ },
+ "dueOn": {
+ "description": "DATED due date (YYYY-MM-DD). Only a date makes \"overdue\" appear.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
+ "type": "string"
+ },
+ "dueText": {
+ "description": "Due date as free text (\"end of the week\"). Kept as is and displayed, but it triggers NO overdue calculation: `dueOn` carries the date when it is known.",
+ "maxLength": 200,
+ "type": "string"
+ },
+ "executor": {
+ "description": "WHO is expected to DO the task: `agent` (an AI agent may take it) or `human` (a person must do it — an agent does not claim it and `list_tasks({executable:true})` leaves it out). This is an instruction, not an identity: it does not say who is ASSIGNED. Omitted = unspecified (the default for every existing task).",
+ "enum": [
+ "agent",
+ "human"
+ ],
+ "type": "string"
+ },
+ "externalId": {
+ "description": "The identifier of this task IN the originating system (e.g. \"ENG-1234\"). Goes in pair with `externalSource`, in every case.",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "externalSource": {
+ "description": "The system this task comes from (e.g. \"linear\", \"jira\", \"notion\"). Displayed provenance — does not replace `id` as the idempotence key. Goes in pair with `externalId`, in every case.",
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "id": {
+ "description": "Identifier supplied by the caller — a key on the external system's side (ticket, import line, an agent's replay key). Omitted = generated by OrgGen (tk_...). If this project already holds a task with this identifier, NOTHING is written for it: it is returned as is (alreadyExisted: true) — a replayed call does not duplicate, and different content on the second call does not overwrite the first. Migration from an external system: the usual pattern is `\"<source>-<external-id>\"` (e.g. `\"linear-ENG-1234\"`) — THIS field carries the idempotence, `externalSource`/`externalId` below only display the provenance.",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "labels": {
+ "items": {
+ "maxLength": 60,
+ "minLength": 1,
+ "type": "string"
+ },
+ "maxItems": 20,
+ "type": "array"
+ },
+ "links": {
+ "description": "The DELIVERABLES of this task (at most 20) — commit, pull request, deployment, run, document. They are then ADDED one by one through `update_task.addLinks`, not by replacing the list.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "documentId": {
+ "description": "For the `document` type ONLY: the identifier of a document of the project that YOU can read (`list_documents`).",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "key": {
+ "description": "Your STABLE key for this deliverable (e.g. `pr-482`): replaying an addition with the same key does not duplicate it, it UPDATES it (this is how you move a PR from `open` to `merged`: a `key` and a `state` are then enough, without repeating the URL). Without a key, the URL (normalized), then `(type, ref)`, designate the entry.",
+ "maxLength": 255,
+ "minLength": 1,
+ "type": "string"
+ },
+ "label": {
+ "description": "Short displayed label.",
+ "maxLength": 120,
+ "minLength": 1,
+ "type": "string"
+ },
+ "ref": {
+ "description": "Short reference displayed in monospace (sha, PR number, run identifier).",
+ "maxLength": 80,
+ "minLength": 1,
+ "type": "string"
+ },
+ "state": {
+ "description": "The state YOU DECLARE, true at the time of the call — OrgGen never verifies it, the human sees \"declared by the agent\".",
+ "enum": [
+ "open",
+ "merged",
+ "closed",
+ "succeeded",
+ "failed",
+ "superseded"
+ ],
+ "type": "string"
+ },
+ "type": {
+ "description": "The kind of deliverable — closed enumeration.",
+ "enum": [
+ "commit",
+ "pull_request",
+ "deployment",
+ "run",
+ "document",
+ "other"
+ ],
+ "type": "string"
+ },
+ "url": {
+ "description": "ABSOLUTE http(s) address, without embedded username or password. OrgGen never opens it: it is only displayed.",
+ "maxLength": 2048,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ],
+ "type": "object"
+ },
+ "maxItems": 20,
+ "minItems": 1,
+ "type": "array"
+ },
+ "parentTaskId": {
+ "description": "Links this task to its parent grouping (\"Part of\") — another task of this project WITHOUT `parentTaskId`, a user story (US) — of which it becomes a SUBTASK. The epic, on the other hand, is the BLOCK (`cellId`): the parent task is never the epic. Omitted = a top-level task (a US). Depth is limited to TWO levels: the target cannot already be a subtask itself. In a BATCH, the target can be created in the SAME call if it appears earlier in the array (with an explicit `id`).",
+ "maxLength": 200,
+ "minLength": 1,
+ "type": "string"
+ },
+ "priority": {
+ "enum": [
+ "urgent",
+ "high",
+ "normal",
+ "low"
+ ],
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "todo",
+ "doing",
+ "done",
+ "blocked"
+ ],
+ "type": "string"
+ },
+ "title": {
+ "description": "The task label, on one line.",
+ "maxLength": 500,
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "title"
+ ],
+ "type": "object"
+ },
+ "maxItems": 100,
+ "minItems": 1,
+ "type": "array"
+ }
+]