@prefix sioc: <http://rdfs.org/sioc/ns#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix content: <http://purl.org/rss/1.0/modules/content/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://lhero.org/?post_type=lh-portfolio&#038;p=147131>
  a sioc:Post ;
  dc:title "MCP abilities" ;
  dcterms:identifier 147131 ;
  dc:modified "2026-10-14T23:35:14Z"^^xsd:dateTime ;
  dc:created "2026-09-07T19:13:55Z"^^xsd:dateTime ;
  sioc:link <https://lhero.org/portfolio/lh-tasks/mcp-abilities/> ;
  sioc:has_creator <https://lhero.org/author/1/#account> ;
  sioc:has_container <https://lhero.org/#posts> ;
  content:encoded "<ul class=\"lh_portfolio-meta\"><li><strong>Part of:</strong> <a href=\"https://lhero.org/portfolio/lh-tasks/\">LH Tasks</a></li></ul><div class=\"lh_portfolio-ability-reference\"><ul class=\"lh_portfolio-ability-reference-index\"><li><a href=\"#ability-add-note\"><code>add-note</code></a> Add Note</li><li><a href=\"#ability-claim-next-task\"><code>claim-next-task</code></a> Claim Next Task</li><li><a href=\"#ability-complete-assigned-task\"><code>complete-assigned-task</code></a> Complete Assigned Task</li><li><a href=\"#ability-complete-task\"><code>complete-task</code></a> Complete Task</li><li><a href=\"#ability-convert-descriptions-to-blocks\"><code>convert-descriptions-to-blocks</code></a> Convert Task Descriptions to Blocks</li><li><a href=\"#ability-create-task\"><code>create-task</code></a> Create Task</li><li><a href=\"#ability-edit-task\"><code>edit-task</code></a> Edit Task</li><li><a href=\"#ability-fail-task\"><code>fail-task</code></a> Fail Task</li><li><a href=\"#ability-get-task\"><code>get-task</code></a> Get Task</li><li><a href=\"#ability-list-tasks\"><code>list-tasks</code></a> List Tasks</li><li><a href=\"#ability-reassign-task\"><code>reassign-task</code></a> Reassign Task</li><li><a href=\"#ability-renew-claim\"><code>renew-claim</code></a> Renew Claim</li><li><a href=\"#ability-review-task\"><code>review-task</code></a> Review Task</li><li><a href=\"#ability-update-task\"><code>update-task</code></a> Update Task</li></ul><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-add-note\"><h2>Add Note</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/add-note</code></p><p>Adds a note to the progress log of a task without claiming it, so context can be added to a task you are not working on. Does not change status, claim or assignment, and works on any status, including finished tasks. The note shows in the <code>progress_log</code> returned by get-task as event &quot;note&quot; with the time and who added it. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The task to add the note to.</td></tr><tr><td><code>note</code></td><td>string</td><td>Yes</td><td></td><td>Plain text, up to 4000 characters, stored exactly as written: line breaks and angle brackets are kept, and the note is escaped wherever it is shown.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-claim-next-task\"><h2>Claim Next Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/claim-next-task</code></p><p>Atomically claims the next eligible task for the calling account and returns it with a <code>claim_token</code>. It picks the highest priority first (urgent, high, normal, low), then the oldest, optionally narrowed to a queue and/or task type. Tasks still waiting on a <code>blocked_by</code> prerequisite are skipped. If <code>task_id</code> is given, atomically claims that specific task instead. A candidate is eligible if it is unassigned, or hard-assigned to the calling account &#8211; tasks assigned to someone else are skipped, not errored. Returns claimed:false with a reason when nothing was claimed &#8211; safe to poll repeatedly. Returns the task&#039;s title, description (also as Markdown) and payload, with a <code>claim_token</code> that must be passed to complete-task/fail-task/reassign-task/renew-claim for this task. Pass <code>task_id</code> and <code>claim_token</code> to the write abilities you call while working on it too: a call is then refused if the claim has been lost, and a successful one keeps the claim alive. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>queue</code></td><td>string</td><td>No</td><td></td><td>Queue/lane slug to claim from. Omit to claim from any queue. Ignored if <code>task_id</code> is given.</td></tr><tr><td><code>task_type</code></td><td>string</td><td>No</td><td></td><td>Only claim tasks of this task type slug, e.g. &quot;<code>bug_fix</code>&quot;. Omit for any type. Ignored if <code>task_id</code> is given.</td></tr><tr><td><code>task_id</code></td><td>integer</td><td>No</td><td></td><td>Claim this specific task instead of the next eligible one. Still goes through the same atomic claim, <code>assigned_to</code> and blocked checks &#8211; returns claimed:false with a reason rather than an error if the task is not currently claimable.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-complete-assigned-task\"><h2>Complete Assigned Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/complete-assigned-task</code></p><p>Marks a task assigned to you done without a claim token, as the Mark as done button on the task page does. Use it only when the person the task is assigned to has confirmed in this conversation that the work is done: one task per call, never to clear a backlog. If someone else asked for the task it goes to Awaiting review for them to accept or send back; otherwise it is Resolved. A note saying what was done is required, and the progress log records that the task was closed through MCP. Fails unless the task is open, not waiting on a prerequisite or a review, and assigned to or claimed by you. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The task assigned to you that is done.</td></tr><tr><td><code>note</code></td><td>string</td><td>Yes</td><td></td><td>What was done, in plain text up to 4000 characters. Logged with the completion and shown to the reviewer.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-complete-task\"><h2>Complete Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/complete-task</code></p><p>Marks a claimed task as Resolved and stores an optional result payload. Needs the <code>claim_token</code> returned by claim-next-task for this task &#8211; fails if the caller does not currently hold the claim. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The claimed task to mark Resolved.</td></tr><tr><td><code>claim_token</code></td><td>string</td><td>Yes</td><td></td><td>The <code>claim_token</code> returned by claim-next-task when you claimed this task.</td></tr><tr><td><code>result</code></td><td>object</td><td>No</td><td></td><td>Optional structured result to store against the task.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-convert-descriptions-to-blocks\"><h2>Convert Task Descriptions to Blocks</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/convert-descriptions-to-blocks</code> <span class=\"lh_portfolio-ability-reference-annotation lh_portfolio-ability-reference-annotation-idempotent\">Idempotent</span></p><p>TEMPORARY, for the one-off conversion of task descriptions stored as raw markdown into block markup (#148851). Pass <code>task_ids</code>, or <code>after_id</code> and limit to work through every task in ID order (<code>next_after_id</code> continues). <code>dry_run</code> defaults to true: nothing is saved and each task reports what would happen. Tasks already holding blocks, or empty, are skipped. HTML entities in the stored markdown are decoded before conversion. A task is held, not saved, when the conversion was degraded or any word of the source is missing from the result. Saving changes <code>post_content</code> only: the previous content is kept as a revision, <code>post_modified</code> is kept so follow-up reminder timing is unchanged, and status, claims, taxonomies, meta and the progress log are not touched. Requires <code>install_plugins</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_ids</code></td><td>array of integer</td><td>No</td><td></td><td>Specific tasks to convert. When given, <code>after_id</code> and limit are ignored.</td></tr><tr><td><code>after_id</code></td><td>integer</td><td>No</td><td><code>0</code></td><td>Work through tasks with an ID greater than this, in ID order. Pass the previous <code>next_after_id</code> to continue.</td></tr><tr><td><code>limit</code></td><td>integer</td><td>No</td><td><code>20</code></td><td>How many tasks to look at in an <code>after_id</code> run.</td></tr><tr><td><code>dry_run</code></td><td>boolean</td><td>No</td><td><code>true</code></td><td>When true (the default) nothing is saved.</td></tr><tr><td><code>include_output</code></td><td>boolean</td><td>No</td><td><code>false</code></td><td>Also return each converted result as block markup, for spot checks.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-create-task\"><h2>Create Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/create-task</code></p><p>Creates a new task in the queue with status New. Accepts an optional machine-readable payload for agent-executable tasks, a queue/lane slug for routing, priority, due date, blocking task IDs, and an optional hard assignment. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>title</code></td><td>string</td><td>Yes</td><td></td><td>Task title.</td></tr><tr><td><code>description</code></td><td>string</td><td>No</td><td></td><td>Human-readable description, written as markdown by default (see <code>description_format</code>). Stored as canonical HTML in <code>post_content</code> either way.</td></tr><tr><td><code>description_format</code></td><td>string</td><td>No</td><td><code>&quot;markdown&quot;</code></td><td>How description is written: markdown (default) or html. It is stored as HTML either way. One of: <code>markdown</code>, <code>html</code>.</td></tr><tr><td><code>payload</code></td><td>object</td><td>No</td><td></td><td>Machine-actionable spec for agent tasks, e.g. {&quot;ability&quot;: &quot;lh-email/send-broadcast&quot;, &quot;params&quot;: {&#8230;}}.</td></tr><tr><td><code>queue</code></td><td>string</td><td>No</td><td></td><td>Queue/lane slug for routing, e.g. &quot;email-triage&quot;.</td></tr><tr><td><code>task_type</code></td><td>string</td><td>No</td><td></td><td>Task type slug classifying what kind of work this is, e.g. &quot;<code>github_triage</code>&quot;. Distinct from queue &#8211; queue is about routing, <code>task_type</code> is about classification.</td></tr><tr><td><code>post_status</code></td><td>string</td><td>No</td><td><code>&quot;active&quot;</code></td><td>Visibility. active (default) is immediately visible/claimable. Use draft or pending for a task that should not be visible or claimable yet &#8211; e.g. an AI-drafted task awaiting human review before it is surfaced. One of: <code>draft</code>, <code>pending</code>, <code>active</code>.</td></tr><tr><td><code>assigned_to</code></td><td>integer</td><td>No</td><td></td><td>WP user ID this task must be actioned by. Omit to leave the task open, claimable by anyone polling the queue.</td></tr><tr><td><code>priority</code></td><td>string</td><td>No</td><td></td><td>urgent, high, normal or low; claim-next-task takes higher priorities first. Defaults to normal. One of: <code>low</code>, <code>normal</code>, <code>high</code>, <code>urgent</code>.</td></tr><tr><td><code>due_date</code></td><td>string</td><td>No</td><td></td><td>MySQL datetime, e.g. 2026-07-10 09:00:00.</td></tr><tr><td><code>scheduled_for</code></td><td>string</td><td>No</td><td></td><td>MySQL datetime (site local time). If in the future, the task stays hidden from claim-next-task until this time, then automatically activates to New. Omit to make the task claimable immediately.</td></tr><tr><td><code>blocked_by</code></td><td>array of integer</td><td>No</td><td></td><td>Task IDs that must be finished (Resolved, Closed or Cancelled) before this task can be claimed. Each must be an existing, untrashed task; otherwise nothing is created and the error names the bad IDs. If a prerequisite is later cancelled, trashed or deleted, this task moves to Pending for a human to check.</td></tr><tr><td><code>max_retries</code></td><td>integer</td><td>No</td><td></td><td>How many times to auto-requeue on failure before leaving the task Failed for triage.</td></tr><tr><td><code>requires_review</code></td><td>boolean</td><td>No</td><td><code>true</code></td><td>Only matters when someone other than the author does the task. true (default): their &quot;done&quot; goes to Awaiting review for the author to accept or send back. false: their &quot;done&quot; resolves it straight away, for trivial jobs.</td></tr><tr><td><code>source_plugin</code></td><td>string</td><td>No</td><td></td><td>Slug of the plugin that created this task, e.g. lh-crm.</td></tr><tr><td><code>source_post_id</code></td><td>integer</td><td>No</td><td></td><td>ID of the originating post in the source plugin.</td></tr><tr><td><code>parent_id</code></td><td>integer</td><td>No</td><td></td><td>Master task this is a subtask of. The master must be an existing, untrashed task that is not itself a subtask: one level deep. When every subtask is finished (Resolved, Closed or Cancelled) the master resolves automatically; a Failed subtask moves the master to Pending.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-edit-task\"><h2>Edit Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/edit-task</code> <span class=\"lh_portfolio-ability-reference-annotation lh_portfolio-ability-reference-annotation-destructive\">Destructive</span></p><p>Staff override that changes a task&#039;s assignment, workflow status or queue, or releases a stuck claim, without holding the claim. Returns success. It works unconditionally. Distinct from reassign-task, which is a self-service action for whoever currently holds the claim; use this for cleanup (stuck claims, wrong assignment) rather than routine handoffs. To requeue a Failed task with its full retries, set status to New with <code>reset_retries</code> true. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The task to change.</td></tr><tr><td><code>assigned_to</code></td><td>integer</td><td>No</td><td></td><td>New hard assignment. Pass 0 to explicitly clear assignment (open to anyone). Omit this field entirely to leave assignment unchanged.</td></tr><tr><td><code>release_claim</code></td><td>boolean</td><td>No</td><td></td><td>Release the current claim (if any) without changing assignment or status.</td></tr><tr><td><code>reset_retries</code></td><td>boolean</td><td>No</td><td></td><td>Set <code>retry_count</code> back to 0, so the task gets its full <code>max_retries</code> again. Logged with the previous count.</td></tr><tr><td><code>status</code></td><td>string</td><td>No</td><td></td><td>New workflow status key. Omit to leave unchanged. One of: lh_tasks-new_task (New), lh_tasks-claim_task (Claimed), lh_tasks-prog_task (In Progress), lh_tasks-pend_task (Pending), lh_tasks-revw_task (Awaiting review), lh_tasks-fail_task (Failed), lh_tasks-res_task (Resolved), lh_tasks-clos_task (Closed), lh_tasks-cncl_task (Cancelled), lh_tasks-defr_task (Deferred). One of: <code>lh_tasks-new_task</code>, <code>lh_tasks-claim_task</code>, <code>lh_tasks-prog_task</code>, <code>lh_tasks-pend_task</code>, <code>lh_tasks-revw_task</code>, <code>lh_tasks-fail_task</code>, <code>lh_tasks-res_task</code>, <code>lh_tasks-clos_task</code>, <code>lh_tasks-cncl_task</code>, <code>lh_tasks-defr_task</code>.</td></tr><tr><td><code>queue</code></td><td>string</td><td>No</td><td></td><td>New queue/lane slug. Omit to leave unchanged.</td></tr><tr><td><code>note</code></td><td>string</td><td>No</td><td></td><td>Logged alongside the change for audit purposes.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-fail-task\"><h2>Fail Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/fail-task</code></p><p>Marks a claimed task as failed. Needs the <code>claim_token</code> returned by claim-next-task for this task. <code>reason_type</code> &quot;retryable&quot; (default) requeues to New if retries remain, else sets it Failed and releases the claim, for a person to triage (edit-task with status New and <code>reset_retries</code> requeues it). <code>reason_type</code> &quot;<code>needs_human</code>&quot; skips retries entirely and hands the task off via reassignment instead &#8211; use this when the work itself is fine but something outside your authority/ability is needed to finish it. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The claimed task that failed.</td></tr><tr><td><code>claim_token</code></td><td>string</td><td>Yes</td><td></td><td>The <code>claim_token</code> returned by claim-next-task when you claimed this task.</td></tr><tr><td><code>error_message</code></td><td>string</td><td>No</td><td></td><td>What went wrong, or what is still needed. Stored as the task result and, for <code>needs_human</code>, as the handoff note.</td></tr><tr><td><code>reason_type</code></td><td>string</td><td>No</td><td><code>&quot;retryable&quot;</code></td><td>retryable (default): requeue to New while retries remain, then Failed. <code>needs_human</code>: skip retries and hand the task off (see <code>new_assigned_to</code> and <code>new_queue</code>). One of: <code>retryable</code>, <code>needs_human</code>.</td></tr><tr><td><code>new_assigned_to</code></td><td>integer</td><td>No</td><td></td><td><code>needs_human</code> only. WP user ID of the specific person this should go to, if known. Omit to return it to the open queue.</td></tr><tr><td><code>new_queue</code></td><td>string</td><td>No</td><td></td><td><code>needs_human</code> only. Move to a different queue/lane, e.g. a human-review lane.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-get-task\"><h2>Get Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/get-task</code> <span class=\"lh_portfolio-ability-reference-annotation lh_portfolio-ability-reference-annotation-readonly\">Read-only</span> <span class=\"lh_portfolio-ability-reference-annotation lh_portfolio-ability-reference-annotation-idempotent\">Idempotent</span></p><p>Retrieves a single task by ID with every field, including its Markdown description, progress log and <code>blocked_by</code> prerequisites. The fields: title, description (as stored and as Markdown), workflow and native status, queue, task type, priority, due date, claim holder and hard assignment, progress log, payload, result, retry counts, source, its <code>blocked_by</code> prerequisites with whether any are still holding it back, its master task (<code>parent_id</code>) and its subtasks (children). list-tasks returns the same shape with fewer fields by default. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The task to retrieve.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-list-tasks\"><h2>List Tasks</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/list-tasks</code> <span class=\"lh_portfolio-ability-reference-annotation lh_portfolio-ability-reference-annotation-readonly\">Read-only</span> <span class=\"lh_portfolio-ability-reference-annotation lh_portfolio-ability-reference-annotation-idempotent\">Idempotent</span></p><p>Returns a page of tasks, filtered and sorted in the database. By default it lists open tasks (see <code>status_group</code>) in claim order: highest priority first, then oldest. Filters combine with AND: workflow status or <code>status_group</code>, queue, task type, claim holder (assignee), hard assignment (<code>assigned_to</code>), priority, <code>source_plugin</code> and <code>source_post_id</code>, <code>due_before</code>, overdue, <code>created_after</code>, <code>updated_after</code>, <code>is_blocked</code> (an unfinished prerequisite is holding the task back) and search (text in the title or description). Sort with orderby (priority, created, updated or <code>due_date</code>) and order. Dates are site-local, as Y-m-d H:i:s or Y-m-d. An unknown status or priority, both status and <code>status_group</code>, or a malformed date is refused with an error. Each task is compact by default: <code>task_id</code>, title, status, queue, <code>task_type</code>, priority, <code>due_date</code>, assignee, <code>assigned_to</code>, <code>is_blocked</code>, <code>waiting_on</code>, <code>source_plugin</code> and <code>source_post_id</code>. Name fields to choose others, such as <code>description_markdown</code>, payload or <code>progress_log</code>; <code>task_id</code> is always included and only the fields asked for are worked out. get-task returns every field of one task. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>status</code></td><td>string|array</td><td>No</td><td></td><td>One workflow status key, or an array of them: lh_tasks-new_task (New), lh_tasks-claim_task (Claimed), lh_tasks-prog_task (In Progress), lh_tasks-pend_task (Pending), lh_tasks-revw_task (Awaiting review), lh_tasks-fail_task (Failed), lh_tasks-res_task (Resolved), lh_tasks-clos_task (Closed), lh_tasks-cncl_task (Cancelled), lh_tasks-defr_task (Deferred). Cannot be combined with <code>status_group</code>.</td></tr><tr><td><code>status_group</code></td><td>string</td><td>No</td><td></td><td>open, the default when status is not given: New, Claimed, In Progress, Pending, Awaiting review, Failed. terminal: Resolved, Closed, Cancelled. all: every status, including Deferred, which is in neither group. One of: <code>open</code>, <code>terminal</code>, <code>all</code>.</td></tr><tr><td><code>queue</code></td><td>string</td><td>No</td><td></td><td>Queue (lane) slug.</td></tr><tr><td><code>task_type</code></td><td>string</td><td>No</td><td></td><td>Task type slug.</td></tr><tr><td><code>assignee</code></td><td>integer</td><td>No</td><td></td><td>Only tasks whose claim is currently held by this WP user ID.</td></tr><tr><td><code>assigned_to</code></td><td>integer</td><td>No</td><td></td><td>Only tasks hard-assigned to this WP user ID.</td></tr><tr><td><code>priority</code></td><td>string|array</td><td>No</td><td></td><td>One priority, or an array of them: low, normal, high, urgent. A task with no priority counts as normal.</td></tr><tr><td><code>source_plugin</code></td><td>string</td><td>No</td><td></td><td>Only tasks whose <code>source_plugin</code> is this plugin slug.</td></tr><tr><td><code>source_post_id</code></td><td>integer</td><td>No</td><td></td><td>Only tasks whose <code>source_post_id</code> is this ID.</td></tr><tr><td><code>parent_id</code></td><td>integer</td><td>No</td><td></td><td>Only the subtasks of this master task.</td></tr><tr><td><code>due_before</code></td><td>string</td><td>No</td><td></td><td>Only tasks due before this site-local date or datetime. Tasks with no due date are left out.</td></tr><tr><td><code>overdue</code></td><td>boolean</td><td>No</td><td></td><td>true: only tasks whose due date has passed. false or omitted: no overdue filter.</td></tr><tr><td><code>created_after</code></td><td>string</td><td>No</td><td></td><td>Only tasks created after this site-local date or datetime.</td></tr><tr><td><code>updated_after</code></td><td>string</td><td>No</td><td></td><td>Only tasks whose content or workflow status changed after this site-local date or datetime.</td></tr><tr><td><code>is_blocked</code></td><td>boolean</td><td>No</td><td></td><td>true: only tasks an unfinished prerequisite is holding back. false: only tasks nothing is holding back. Omit for both.</td></tr><tr><td><code>search</code></td><td>string</td><td>No</td><td></td><td>Text to find in the title or description.</td></tr><tr><td><code>orderby</code></td><td>string</td><td>No</td><td><code>&quot;priority&quot;</code></td><td>priority (default): highest first, then oldest, the order claim-next-task uses. created and updated: newest first. <code>due_date</code>: soonest first, tasks with no due date last. One of: <code>priority</code>, <code>created</code>, <code>updated</code>, <code>due_date</code>.</td></tr><tr><td><code>order</code></td><td>string</td><td>No</td><td></td><td>Reverses or confirms the direction of orderby. Defaults to desc for priority, created and updated, and asc for <code>due_date</code>. One of: <code>asc</code>, <code>desc</code>.</td></tr><tr><td><code>fields</code></td><td>array of string</td><td>No</td><td></td><td>The fields to return for each task; <code>task_id</code> is always included. Defaults to <code>task_id</code>, title, status, queue, <code>task_type</code>, priority, <code>due_date</code>, assignee, <code>assigned_to</code>, <code>is_blocked</code>, <code>waiting_on</code>, <code>source_plugin</code>, <code>source_post_id</code>, <code>parent_id</code>. Name <code>description_markdown</code>, description, payload, result, <code>progress_log</code> or any other task field to get it.</td></tr><tr><td><code>include_progress_log</code></td><td>boolean</td><td>No</td><td><code>false</code></td><td>Kept for older callers: true adds <code>progress_log</code> to the fields returned, the same as naming it in fields.</td></tr><tr><td><code>page</code></td><td>integer</td><td>No</td><td><code>1</code></td><td>Page number, from 1.</td></tr><tr><td><code>per_page</code></td><td>integer</td><td>No</td><td><code>20</code></td><td>Tasks per page, up to 100. Defaults to 20.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-reassign-task\"><h2>Reassign Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/reassign-task</code></p><p>Hands a claimed task off: releases the claim, optionally hard-assigns it to an account, and logs a handoff note. Returns success. Once hard-assigned, only that account (or edit-task) can claim or act on it next. The note describes what is done and what is left. Needs the <code>claim_token</code> returned by claim-next-task for this task &#8211; reassigning is an action available to whoever currently holds the claim. Use this for partial-completion handoffs; use fail-task for something that went wrong. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The claimed task to hand off.</td></tr><tr><td><code>claim_token</code></td><td>string</td><td>Yes</td><td></td><td>The <code>claim_token</code> returned by claim-next-task when you claimed this task.</td></tr><tr><td><code>new_assigned_to</code></td><td>integer</td><td>No</td><td></td><td>WP user ID this task must be actioned by next. Omit to just return it to the open queue for anyone to claim.</td></tr><tr><td><code>new_queue</code></td><td>string</td><td>No</td><td></td><td>Move the task to a different queue/lane.</td></tr><tr><td><code>new_status</code></td><td>string</td><td>No</td><td></td><td>Defaults to New (immediately claimable). Use Pending for a handoff to a human who is not actively polling. One of: lh_tasks-new_task (New), lh_tasks-claim_task (Claimed), lh_tasks-prog_task (In Progress), lh_tasks-pend_task (Pending), lh_tasks-revw_task (Awaiting review), lh_tasks-fail_task (Failed), lh_tasks-res_task (Resolved), lh_tasks-clos_task (Closed), lh_tasks-cncl_task (Cancelled), lh_tasks-defr_task (Deferred). One of: <code>lh_tasks-new_task</code>, <code>lh_tasks-claim_task</code>, <code>lh_tasks-prog_task</code>, <code>lh_tasks-pend_task</code>, <code>lh_tasks-revw_task</code>, <code>lh_tasks-fail_task</code>, <code>lh_tasks-res_task</code>, <code>lh_tasks-clos_task</code>, <code>lh_tasks-cncl_task</code>, <code>lh_tasks-defr_task</code>.</td></tr><tr><td><code>note</code></td><td>string</td><td>Yes</td><td></td><td>What has been done so far and what is left &#8211; the next assignee will see this.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-renew-claim\"><h2>Renew Claim</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/renew-claim</code></p><p>Extends a held claim by moving <code>claimed_at</code> to now, so a long-running task is not auto-released mid-work. Returns success. The automatic stale-claim sweep releases claims older than the configured cutoff (default 10 minutes). Does not change status or assignee. Needs the <code>claim_token</code> returned by claim-next-task for this task &#8211; fails if the caller does not currently hold the claim. Call periodically from a long-running task. Optionally logs a progress note alongside the heartbeat, the same way reassign-task logs its note. Write abilities called with this task&#039;s <code>task_id</code> and <code>claim_token</code> renew the claim automatically, but only up to a maximum lease (4 hours from the claim by default); renew-claim itself is not capped, so use it for work that runs longer or makes no writes. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The claimed task whose claim to extend.</td></tr><tr><td><code>claim_token</code></td><td>string</td><td>Yes</td><td></td><td>The <code>claim_token</code> returned by claim-next-task when you claimed this task.</td></tr><tr><td><code>note</code></td><td>string</td><td>No</td><td></td><td>Optional progress note, logged alongside the heartbeat &#8211; lets a renewal double as a lightweight progress trail. Omit for a bare heartbeat with no side effects beyond extending the claim.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-review-task\"><h2>Review Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/review-task</code></p><p>Accepts or sends back a task that is Awaiting review, the step after the person it was assigned to marks it done. accept resolves it. <code>send_back</code> returns it to New, still assigned to the same person, who is notified with your note. Only the task&#039;s author (the person who asked for it) or staff may review. A note is required to send a task back and optional to accept it. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The task that is Awaiting review.</td></tr><tr><td><code>decision</code></td><td>string</td><td>Yes</td><td></td><td>accept (Resolved) or <code>send_back</code> (New, back to the same person). One of: <code>accept</code>, <code>send_back</code>.</td></tr><tr><td><code>note</code></td><td>string</td><td>No</td><td></td><td>Plain text up to 4000 characters. Required for <code>send_back</code>: what still needs doing.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section><section class=\"lh_portfolio-ability-reference-ability\" id=\"ability-update-task\"><h2>Update Task</h2><p class=\"lh_portfolio-ability-reference-meta\"><code>lh-tasks/update-task</code></p><p>Changes the content of a task after it was created: title, description, payload, priority, due date, schedule, task type, max retries, <code>blocked_by</code> and <code>parent_id</code> (the master task). Only the fields you pass change; an empty value clears payload, <code>due_date</code>, <code>task_type</code> or <code>blocked_by</code>. Everything is checked before anything is written, so an invalid <code>blocked_by</code> (missing, trashed, the task itself, or a loop) changes nothing. Works on claimed tasks too, and every call adds an &quot;updated&quot; entry to the progress log listing the fields changed. Status, queue, assignment and the claim are not changed here: use edit-task or the claim-token abilities. Requires <code>edit_others_posts</code>. Pass <code>site_id</code> to act on another site you belong to.</p><figure class=\"wp-block-table lh_portfolio-ability-reference-params\"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td><code>task_id</code></td><td>integer</td><td>Yes</td><td></td><td>The task to change.</td></tr><tr><td><code>title</code></td><td>string</td><td>No</td><td></td><td>New title. Cannot be empty.</td></tr><tr><td><code>description</code></td><td>string</td><td>No</td><td></td><td>Replaces the description. Written as markdown by default (see <code>description_format</code>).</td></tr><tr><td><code>description_format</code></td><td>string</td><td>No</td><td><code>&quot;markdown&quot;</code></td><td>How description is written: markdown (default) or html. It is stored as HTML either way. One of: <code>markdown</code>, <code>html</code>.</td></tr><tr><td><code>payload</code></td><td>object</td><td>No</td><td></td><td>Replaces the whole payload. An empty object clears it.</td></tr><tr><td><code>priority</code></td><td>string</td><td>No</td><td></td><td>New priority: urgent, high, normal or low. One of: <code>low</code>, <code>normal</code>, <code>high</code>, <code>urgent</code>.</td></tr><tr><td><code>due_date</code></td><td>string</td><td>No</td><td></td><td>MySQL datetime, e.g. 2026-07-10 09:00:00. Empty string clears it.</td></tr><tr><td><code>scheduled_for</code></td><td>string</td><td>No</td><td></td><td>New activation time (site local MySQL datetime, in the future). Only for a task that is still scheduled.</td></tr><tr><td><code>task_type</code></td><td>string</td><td>No</td><td></td><td>Task type slug. Empty string clears it.</td></tr><tr><td><code>max_retries</code></td><td>integer</td><td>No</td><td></td><td>How many times to auto-requeue on failure before leaving the task Failed for triage.</td></tr><tr><td><code>blocked_by</code></td><td>array of integer</td><td>No</td><td></td><td>Replaces the whole list of prerequisite task IDs. Empty array clears it.</td></tr><tr><td><code>parent_id</code></td><td>integer</td><td>No</td><td></td><td>Makes this a subtask of that master task, or 0 to make it standalone again. One level deep: the master cannot be a subtask, and a task with subtasks cannot become one.</td></tr><tr><td><code>note</code></td><td>string</td><td>No</td><td></td><td>Why it changed; logged with the update.</td></tr><tr><td><code>site_id</code></td><td>integer</td><td>No</td><td></td><td>Optional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.</td></tr></tbody></table></figure></section></div>"^^rdf:XMLLiteral ;
  sioc:content "Part of: LH Tasksadd-note Add Noteclaim-next-task Claim Next Taskcomplete-assigned-task Complete Assigned Taskcomplete-task Complete Taskconvert-descriptions-to-blocks Convert Task Descriptions to Blockscreate-task Create Taskedit-task Edit Taskfail-task Fail Taskget-task Get Tasklist-tasks List Tasksreassign-task Reassign Taskrenew-claim Renew Claimreview-task Review Taskupdate-task Update TaskAdd Notelh-tasks/add-noteAdds a note to the progress log of a task without claiming it, so context can be added to a task you are not working on. Does not change status, claim or assignment, and works on any status, including finished tasks. The note shows in the progress_log returned by get-task as event &quot;note&quot; with the time and who added it. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe task to add the note to.notestringYesPlain text, up to 4000 characters, stored exactly as written: line breaks and angle brackets are kept, and the note is escaped wherever it is shown.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Claim Next Tasklh-tasks/claim-next-taskAtomically claims the next eligible task for the calling account and returns it with a claim_token. It picks the highest priority first (urgent, high, normal, low), then the oldest, optionally narrowed to a queue and/or task type. Tasks still waiting on a blocked_by prerequisite are skipped. If task_id is given, atomically claims that specific task instead. A candidate is eligible if it is unassigned, or hard-assigned to the calling account &#8211; tasks assigned to someone else are skipped, not errored. Returns claimed:false with a reason when nothing was claimed &#8211; safe to poll repeatedly. Returns the task&#039;s title, description (also as Markdown) and payload, with a claim_token that must be passed to complete-task/fail-task/reassign-task/renew-claim for this task. Pass task_id and claim_token to the write abilities you call while working on it too: a call is then refused if the claim has been lost, and a successful one keeps the claim alive. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptionqueuestringNoQueue/lane slug to claim from. Omit to claim from any queue. Ignored if task_id is given.task_typestringNoOnly claim tasks of this task type slug, e.g. &quot;bug_fix&quot;. Omit for any type. Ignored if task_id is given.task_idintegerNoClaim this specific task instead of the next eligible one. Still goes through the same atomic claim, assigned_to and blocked checks &#8211; returns claimed:false with a reason rather than an error if the task is not currently claimable.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Complete Assigned Tasklh-tasks/complete-assigned-taskMarks a task assigned to you done without a claim token, as the Mark as done button on the task page does. Use it only when the person the task is assigned to has confirmed in this conversation that the work is done: one task per call, never to clear a backlog. If someone else asked for the task it goes to Awaiting review for them to accept or send back; otherwise it is Resolved. A note saying what was done is required, and the progress log records that the task was closed through MCP. Fails unless the task is open, not waiting on a prerequisite or a review, and assigned to or claimed by you. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe task assigned to you that is done.notestringYesWhat was done, in plain text up to 4000 characters. Logged with the completion and shown to the reviewer.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Complete Tasklh-tasks/complete-taskMarks a claimed task as Resolved and stores an optional result payload. Needs the claim_token returned by claim-next-task for this task &#8211; fails if the caller does not currently hold the claim. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe claimed task to mark Resolved.claim_tokenstringYesThe claim_token returned by claim-next-task when you claimed this task.resultobjectNoOptional structured result to store against the task.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Convert Task Descriptions to Blockslh-tasks/convert-descriptions-to-blocks IdempotentTEMPORARY, for the one-off conversion of task descriptions stored as raw markdown into block markup (#148851). Pass task_ids, or after_id and limit to work through every task in ID order (next_after_id continues). dry_run defaults to true: nothing is saved and each task reports what would happen. Tasks already holding blocks, or empty, are skipped. HTML entities in the stored markdown are decoded before conversion. A task is held, not saved, when the conversion was degraded or any word of the source is missing from the result. Saving changes post_content only: the previous content is kept as a revision, post_modified is kept so follow-up reminder timing is unchanged, and status, claims, taxonomies, meta and the progress log are not touched. Requires install_plugins. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idsarray of integerNoSpecific tasks to convert. When given, after_id and limit are ignored.after_idintegerNo0Work through tasks with an ID greater than this, in ID order. Pass the previous next_after_id to continue.limitintegerNo20How many tasks to look at in an after_id run.dry_runbooleanNotrueWhen true (the default) nothing is saved.include_outputbooleanNofalseAlso return each converted result as block markup, for spot checks.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Create Tasklh-tasks/create-taskCreates a new task in the queue with status New. Accepts an optional machine-readable payload for agent-executable tasks, a queue/lane slug for routing, priority, due date, blocking task IDs, and an optional hard assignment. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontitlestringYesTask title.descriptionstringNoHuman-readable description, written as markdown by default (see description_format). Stored as canonical HTML in post_content either way.description_formatstringNo&quot;markdown&quot;How description is written: markdown (default) or html. It is stored as HTML either way. One of: markdown, html.payloadobjectNoMachine-actionable spec for agent tasks, e.g. {&quot;ability&quot;: &quot;lh-email/send-broadcast&quot;, &quot;params&quot;: {&#8230;}}.queuestringNoQueue/lane slug for routing, e.g. &quot;email-triage&quot;.task_typestringNoTask type slug classifying what kind of work this is, e.g. &quot;github_triage&quot;. Distinct from queue &#8211; queue is about routing, task_type is about classification.post_statusstringNo&quot;active&quot;Visibility. active (default) is immediately visible/claimable. Use draft or pending for a task that should not be visible or claimable yet &#8211; e.g. an AI-drafted task awaiting human review before it is surfaced. One of: draft, pending, active.assigned_tointegerNoWP user ID this task must be actioned by. Omit to leave the task open, claimable by anyone polling the queue.prioritystringNourgent, high, normal or low; claim-next-task takes higher priorities first. Defaults to normal. One of: low, normal, high, urgent.due_datestringNoMySQL datetime, e.g. 2026-07-10 09:00:00.scheduled_forstringNoMySQL datetime (site local time). If in the future, the task stays hidden from claim-next-task until this time, then automatically activates to New. Omit to make the task claimable immediately.blocked_byarray of integerNoTask IDs that must be finished (Resolved, Closed or Cancelled) before this task can be claimed. Each must be an existing, untrashed task; otherwise nothing is created and the error names the bad IDs. If a prerequisite is later cancelled, trashed or deleted, this task moves to Pending for a human to check.max_retriesintegerNoHow many times to auto-requeue on failure before leaving the task Failed for triage.requires_reviewbooleanNotrueOnly matters when someone other than the author does the task. true (default): their &quot;done&quot; goes to Awaiting review for the author to accept or send back. false: their &quot;done&quot; resolves it straight away, for trivial jobs.source_pluginstringNoSlug of the plugin that created this task, e.g. lh-crm.source_post_idintegerNoID of the originating post in the source plugin.parent_idintegerNoMaster task this is a subtask of. The master must be an existing, untrashed task that is not itself a subtask: one level deep. When every subtask is finished (Resolved, Closed or Cancelled) the master resolves automatically; a Failed subtask moves the master to Pending.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Edit Tasklh-tasks/edit-task DestructiveStaff override that changes a task&#039;s assignment, workflow status or queue, or releases a stuck claim, without holding the claim. Returns success. It works unconditionally. Distinct from reassign-task, which is a self-service action for whoever currently holds the claim; use this for cleanup (stuck claims, wrong assignment) rather than routine handoffs. To requeue a Failed task with its full retries, set status to New with reset_retries true. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe task to change.assigned_tointegerNoNew hard assignment. Pass 0 to explicitly clear assignment (open to anyone). Omit this field entirely to leave assignment unchanged.release_claimbooleanNoRelease the current claim (if any) without changing assignment or status.reset_retriesbooleanNoSet retry_count back to 0, so the task gets its full max_retries again. Logged with the previous count.statusstringNoNew workflow status key. Omit to leave unchanged. One of: lh_tasks-new_task (New), lh_tasks-claim_task (Claimed), lh_tasks-prog_task (In Progress), lh_tasks-pend_task (Pending), lh_tasks-revw_task (Awaiting review), lh_tasks-fail_task (Failed), lh_tasks-res_task (Resolved), lh_tasks-clos_task (Closed), lh_tasks-cncl_task (Cancelled), lh_tasks-defr_task (Deferred). One of: lh_tasks-new_task, lh_tasks-claim_task, lh_tasks-prog_task, lh_tasks-pend_task, lh_tasks-revw_task, lh_tasks-fail_task, lh_tasks-res_task, lh_tasks-clos_task, lh_tasks-cncl_task, lh_tasks-defr_task.queuestringNoNew queue/lane slug. Omit to leave unchanged.notestringNoLogged alongside the change for audit purposes.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Fail Tasklh-tasks/fail-taskMarks a claimed task as failed. Needs the claim_token returned by claim-next-task for this task. reason_type &quot;retryable&quot; (default) requeues to New if retries remain, else sets it Failed and releases the claim, for a person to triage (edit-task with status New and reset_retries requeues it). reason_type &quot;needs_human&quot; skips retries entirely and hands the task off via reassignment instead &#8211; use this when the work itself is fine but something outside your authority/ability is needed to finish it. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe claimed task that failed.claim_tokenstringYesThe claim_token returned by claim-next-task when you claimed this task.error_messagestringNoWhat went wrong, or what is still needed. Stored as the task result and, for needs_human, as the handoff note.reason_typestringNo&quot;retryable&quot;retryable (default): requeue to New while retries remain, then Failed. needs_human: skip retries and hand the task off (see new_assigned_to and new_queue). One of: retryable, needs_human.new_assigned_tointegerNoneeds_human only. WP user ID of the specific person this should go to, if known. Omit to return it to the open queue.new_queuestringNoneeds_human only. Move to a different queue/lane, e.g. a human-review lane.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Get Tasklh-tasks/get-task Read-only IdempotentRetrieves a single task by ID with every field, including its Markdown description, progress log and blocked_by prerequisites. The fields: title, description (as stored and as Markdown), workflow and native status, queue, task type, priority, due date, claim holder and hard assignment, progress log, payload, result, retry counts, source, its blocked_by prerequisites with whether any are still holding it back, its master task (parent_id) and its subtasks (children). list-tasks returns the same shape with fewer fields by default. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe task to retrieve.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.List Taskslh-tasks/list-tasks Read-only IdempotentReturns a page of tasks, filtered and sorted in the database. By default it lists open tasks (see status_group) in claim order: highest priority first, then oldest. Filters combine with AND: workflow status or status_group, queue, task type, claim holder (assignee), hard assignment (assigned_to), priority, source_plugin and source_post_id, due_before, overdue, created_after, updated_after, is_blocked (an unfinished prerequisite is holding the task back) and search (text in the title or description). Sort with orderby (priority, created, updated or due_date) and order. Dates are site-local, as Y-m-d H:i:s or Y-m-d. An unknown status or priority, both status and status_group, or a malformed date is refused with an error. Each task is compact by default: task_id, title, status, queue, task_type, priority, due_date, assignee, assigned_to, is_blocked, waiting_on, source_plugin and source_post_id. Name fields to choose others, such as description_markdown, payload or progress_log; task_id is always included and only the fields asked for are worked out. get-task returns every field of one task. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptionstatusstring|arrayNoOne workflow status key, or an array of them: lh_tasks-new_task (New), lh_tasks-claim_task (Claimed), lh_tasks-prog_task (In Progress), lh_tasks-pend_task (Pending), lh_tasks-revw_task (Awaiting review), lh_tasks-fail_task (Failed), lh_tasks-res_task (Resolved), lh_tasks-clos_task (Closed), lh_tasks-cncl_task (Cancelled), lh_tasks-defr_task (Deferred). Cannot be combined with status_group.status_groupstringNoopen, the default when status is not given: New, Claimed, In Progress, Pending, Awaiting review, Failed. terminal: Resolved, Closed, Cancelled. all: every status, including Deferred, which is in neither group. One of: open, terminal, all.queuestringNoQueue (lane) slug.task_typestringNoTask type slug.assigneeintegerNoOnly tasks whose claim is currently held by this WP user ID.assigned_tointegerNoOnly tasks hard-assigned to this WP user ID.prioritystring|arrayNoOne priority, or an array of them: low, normal, high, urgent. A task with no priority counts as normal.source_pluginstringNoOnly tasks whose source_plugin is this plugin slug.source_post_idintegerNoOnly tasks whose source_post_id is this ID.parent_idintegerNoOnly the subtasks of this master task.due_beforestringNoOnly tasks due before this site-local date or datetime. Tasks with no due date are left out.overduebooleanNotrue: only tasks whose due date has passed. false or omitted: no overdue filter.created_afterstringNoOnly tasks created after this site-local date or datetime.updated_afterstringNoOnly tasks whose content or workflow status changed after this site-local date or datetime.is_blockedbooleanNotrue: only tasks an unfinished prerequisite is holding back. false: only tasks nothing is holding back. Omit for both.searchstringNoText to find in the title or description.orderbystringNo&quot;priority&quot;priority (default): highest first, then oldest, the order claim-next-task uses. created and updated: newest first. due_date: soonest first, tasks with no due date last. One of: priority, created, updated, due_date.orderstringNoReverses or confirms the direction of orderby. Defaults to desc for priority, created and updated, and asc for due_date. One of: asc, desc.fieldsarray of stringNoThe fields to return for each task; task_id is always included. Defaults to task_id, title, status, queue, task_type, priority, due_date, assignee, assigned_to, is_blocked, waiting_on, source_plugin, source_post_id, parent_id. Name description_markdown, description, payload, result, progress_log or any other task field to get it.include_progress_logbooleanNofalseKept for older callers: true adds progress_log to the fields returned, the same as naming it in fields.pageintegerNo1Page number, from 1.per_pageintegerNo20Tasks per page, up to 100. Defaults to 20.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Reassign Tasklh-tasks/reassign-taskHands a claimed task off: releases the claim, optionally hard-assigns it to an account, and logs a handoff note. Returns success. Once hard-assigned, only that account (or edit-task) can claim or act on it next. The note describes what is done and what is left. Needs the claim_token returned by claim-next-task for this task &#8211; reassigning is an action available to whoever currently holds the claim. Use this for partial-completion handoffs; use fail-task for something that went wrong. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe claimed task to hand off.claim_tokenstringYesThe claim_token returned by claim-next-task when you claimed this task.new_assigned_tointegerNoWP user ID this task must be actioned by next. Omit to just return it to the open queue for anyone to claim.new_queuestringNoMove the task to a different queue/lane.new_statusstringNoDefaults to New (immediately claimable). Use Pending for a handoff to a human who is not actively polling. One of: lh_tasks-new_task (New), lh_tasks-claim_task (Claimed), lh_tasks-prog_task (In Progress), lh_tasks-pend_task (Pending), lh_tasks-revw_task (Awaiting review), lh_tasks-fail_task (Failed), lh_tasks-res_task (Resolved), lh_tasks-clos_task (Closed), lh_tasks-cncl_task (Cancelled), lh_tasks-defr_task (Deferred). One of: lh_tasks-new_task, lh_tasks-claim_task, lh_tasks-prog_task, lh_tasks-pend_task, lh_tasks-revw_task, lh_tasks-fail_task, lh_tasks-res_task, lh_tasks-clos_task, lh_tasks-cncl_task, lh_tasks-defr_task.notestringYesWhat has been done so far and what is left &#8211; the next assignee will see this.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Renew Claimlh-tasks/renew-claimExtends a held claim by moving claimed_at to now, so a long-running task is not auto-released mid-work. Returns success. The automatic stale-claim sweep releases claims older than the configured cutoff (default 10 minutes). Does not change status or assignee. Needs the claim_token returned by claim-next-task for this task &#8211; fails if the caller does not currently hold the claim. Call periodically from a long-running task. Optionally logs a progress note alongside the heartbeat, the same way reassign-task logs its note. Write abilities called with this task&#039;s task_id and claim_token renew the claim automatically, but only up to a maximum lease (4 hours from the claim by default); renew-claim itself is not capped, so use it for work that runs longer or makes no writes. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe claimed task whose claim to extend.claim_tokenstringYesThe claim_token returned by claim-next-task when you claimed this task.notestringNoOptional progress note, logged alongside the heartbeat &#8211; lets a renewal double as a lightweight progress trail. Omit for a bare heartbeat with no side effects beyond extending the claim.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Review Tasklh-tasks/review-taskAccepts or sends back a task that is Awaiting review, the step after the person it was assigned to marks it done. accept resolves it. send_back returns it to New, still assigned to the same person, who is notified with your note. Only the task&#039;s author (the person who asked for it) or staff may review. A note is required to send a task back and optional to accept it. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe task that is Awaiting review.decisionstringYesaccept (Resolved) or send_back (New, back to the same person). One of: accept, send_back.notestringNoPlain text up to 4000 characters. Required for send_back: what still needs doing.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site.Update Tasklh-tasks/update-taskChanges the content of a task after it was created: title, description, payload, priority, due date, schedule, task type, max retries, blocked_by and parent_id (the master task). Only the fields you pass change; an empty value clears payload, due_date, task_type or blocked_by. Everything is checked before anything is written, so an invalid blocked_by (missing, trashed, the task itself, or a loop) changes nothing. Works on claimed tasks too, and every call adds an &quot;updated&quot; entry to the progress log listing the fields changed. Status, queue, assignment and the claim are not changed here: use edit-task or the claim-token abilities. Requires edit_others_posts. Pass site_id to act on another site you belong to.ParameterTypeRequiredDefaultDescriptiontask_idintegerYesThe task to change.titlestringNoNew title. Cannot be empty.descriptionstringNoReplaces the description. Written as markdown by default (see description_format).description_formatstringNo&quot;markdown&quot;How description is written: markdown (default) or html. It is stored as HTML either way. One of: markdown, html.payloadobjectNoReplaces the whole payload. An empty object clears it.prioritystringNoNew priority: urgent, high, normal or low. One of: low, normal, high, urgent.due_datestringNoMySQL datetime, e.g. 2026-07-10 09:00:00. Empty string clears it.scheduled_forstringNoNew activation time (site local MySQL datetime, in the future). Only for a task that is still scheduled.task_typestringNoTask type slug. Empty string clears it.max_retriesintegerNoHow many times to auto-requeue on failure before leaving the task Failed for triage.blocked_byarray of integerNoReplaces the whole list of prerequisite task IDs. Empty array clears it.parent_idintegerNoMakes this a subtask of that master task, or 0 to make it standalone again. One level deep: the master cannot be a subtask, and a task with subtasks cannot become one.notestringNoWhy it changed; logged with the update.site_idintegerNoOptional. ID of another site in the network to act on; list-my-sites gives the sites you belong to. Permissions are checked on that site. Omit for this site." ;
  sioc:topic <https://lhero.org/?taxonomy=author&term=cap-1> .

<https://lhero.org/author/1/#account> rdfs:seeAlso <https://lhero.org/author/1/?feed=lhrdf&format=turtle> .
<https://lhero.org/?taxonomy=author&term=cap-1> rdfs:seeAlso <https://lhero.org/?taxonomy=author&term=cap-1&feed=lhrdf&format=turtle> .
