Skip to content

The Agent: Todos endpoints let you file, read, update, claim, run, snooze, and archive master todos in the agent’s per-cwd todo store. You can also approve or deny run proposals, post comments to a todo’s timeline (with or without kicking an orchestrator turn), kick autonomous worker runs, and trigger an LLM triage pass over the inbox. Every operation that targets a single todo uses the todo’s {id} in the path; proposal sub-resources add {pid}.

These routes resolve the daemon’s todos.* JSON-RPC actions. The gateway holds no service-level auth of its own — hoody-proxy is the network boundary (kit network-position trust) — and forwards the body plus request-scope headers (cwd, config_dir, container, realm) to the daemon. Several of these routes are J-class ops (run, approve_proposal, triage, purge): they spend model budget on autonomous LLM activity with no _machine_confirmed gate on the daemon RPC, and the daemon’s own systemAdminGate may still 403 admin_unauthorized when a Unix-socket admin capability is configured.

Lists master todos for the requesting cwd/config_dir, with the current CAS revision. Filters ride the request body (states, tags, query, open_only, all) — there is no query-param filter alias (the daemon applies typed filters a flat query string cannot supply). Active-realm-scoped: a per-request realm header is rejected.

Terminal window
curl -X GET 'https://api.hoody.com/api/v1/agent/todos?page=1&limit=50' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{"states":["open"],"open_only":true}'
NameInTypeRequiredDescription
pagequeryintegerNo1-based page number for pagination.
limitqueryintegerNoMaximum items per page (0 = no pagination).
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1): the .hoody project layer / record cwd / tool+workflow cwd. Required by routes that resolve a cwd (e.g. POST /todos; createTodo also accepts a body cwd).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1) selecting which on-disk .hoody install a stateless read/write resolves (HoodyPaths).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local). Rejected (400) on routes with no container dimension.
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id (also accepted as ?realm=). Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of the X-Hoody-Realm header (read only when the header is absent): "global" or a 24-hex id. Rejected (400 realm_scope_unsupported) on active-only / no-realm routes.
FieldTypeRequiredDescription
statesarrayNoFilter to these todo states (array of strings).
tagsarrayNoFilter to todos carrying these tags (array of strings).
querystringNoFree-text filter over title/body.
open_onlybooleanNoWhen true, only open (non-terminal) todos.
allbooleanNoWhen true, include archived/closed todos.
{
"states": ["open"],
"tags": ["bug"],
"query": "crash on startup",
"open_only": true,
"all": false
}
{
"items": [
{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"title": "Investigate crash on startup",
"body": "Reproduces on macOS 14 only.",
"state": "open",
"priority": 2,
"tags": ["bug", "p1"],
"cwd": "/Users/me/projects/my-app",
"created_at": "2026-01-15T10:32:11Z",
"revision": 4
}
],
"meta": {
"total": 137,
"page": 1,
"limit": 50
}
}

Returns the current CAS revision token of the todo store (todos.revision) for optimistic concurrency on updates. Pass the returned revision on PATCH /todos/{id} to guard against concurrent updates.

Terminal window
curl -X GET 'https://api.hoody.com/api/v1/agent/todos/revision' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app'
NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
{
"revision": 42
}

Returns the full todo record including timeline and proposals (todos.read).

Terminal window
curl -X GET 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"title": "Investigate crash on startup",
"body": "Reproduces on macOS 14 only.",
"state": "open",
"priority": 2,
"tags": ["bug", "p1"],
"cwd": "/Users/me/projects/my-app",
"revision": 4,
"timeline": [
{
"kind": "create",
"at": "2026-01-15T10:32:11Z",
"by": "user"
},
{
"kind": "comment",
"at": "2026-01-15T11:02:48Z",
"by": "user",
"text": "Confirmed on 14.3 with the production build."
}
],
"proposals": [
{
"id": "p1",
"kind": "run",
"summary": "Patch the macOS-specific path resolver",
"status": "pending"
}
]
}

Files a new master todo (todos.create). Deterministic triage (normalize, fingerprint-dedupe, defaults) runs server-side. The todo’s working directory is taken from the body cwd OR, if omitted, the X-Hoody-Cwd request-scope header; one of the two is required (todos.create rejects an empty cwd).

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{
"title": "Investigate crash on startup",
"body": "Reproduces on macOS 14 only.",
"priority": 2,
"tags": ["bug", "p1"]
}'
NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
FieldTypeRequiredDescription
titlestringYesTodo title.
bodystringNoTodo body / description.
priorityintegerNoOptional priority band 0..4 (0 = P0 urgent … 4 = P4 someday); defaults to 2. The daemon reads a JSON number — a string value is NOT accepted (it silently defaults), so send an integer.
tagsarrayNoOptional tags.
cwdstringNoThe todo’s working directory (labels the record’s computer/path). Defaults to the X-Hoody-Cwd request-scope header when omitted; one of the two must be set.
{
"title": "Investigate crash on startup",
"body": "Reproduces on macOS 14 only.",
"priority": 2,
"tags": ["bug", "p1"],
"cwd": "/Users/me/projects/my-app"
}
{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"deduped": false,
"revision": 1
}

Applies a CAS-guarded field patch / state transition to a todo (todos.update). Pass the current revision; a stale revision is rejected with 409 todo_conflict and you must refetch via getTodosRevision and retry.

Terminal window
curl -X PATCH 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{
"revision": 4,
"state": "in_progress",
"priority": 1
}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
FieldTypeRequiredDescription
revisionintegerYesThe current store revision (CAS token from getTodosRevision); a stale value is rejected.
titlestringNoNew title.
bodystringNoNew body.
statestringNoNew state transition.
priorityintegerNoNew priority.
rankintegerNoNew ordering rank.
tagsarrayNoNew tag set.
cwdstringNoRetarget the todo’s working directory.
{
"revision": 4,
"state": "in_progress",
"priority": 1
}
{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"revision": 5,
"state": "in_progress"
}

Archives a todo (todos.archive). The {id} comes from the path; the body is optional and forwarded verbatim to todos.archive.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/archive' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.archive RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch.

{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"archived": true
}

Claims a todo for the caller (todos.claim).

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/claim' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.claim RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch.

{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"claimed_by": "session-9a7b3c",
"claimed_at": "2026-01-15T12:14:02Z"
}

Releases a claimed todo (todos.release).

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/release' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.release RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch.

{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"released": true
}

Snoozes a todo until a wake time (todos.snooze).

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/snooze' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{"until": "2h"}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
FieldTypeRequiredDescription
untilstringNoWake time (duration-from-now or timestamp token).
{
"until": "2h"
}
{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"snoozed_until": "2026-01-15T14:14:02Z"
}

Dispatches a background worker to autonomously work a todo (todos.run) and returns {job_id, session_id}. The daemon treats reaching the todos.run RPC as the human approval itself (issued by the TUI Run action or the CLI, both human-driven) — it has NO _machine_confirmed gate; that denial lives only on the model-facing run_todo tool. The minted job is bound to the worker session_id so its {job_id}→status lifecycle completes when the worker turn ends. Observe progress on the todo worker’s stream.

This is a J-class op: it spends model budget on an autonomous LLM run with no _machine_confirmed gate on the daemon RPC. The daemon’s own systemAdminGate may still 403 admin_unauthorized when a Unix-socket admin capability is configured.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/run' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.run RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch.

{
"job_id": "job-2f9b1e7a",
"session_id": "session-9a7b3c2d"
}

Cancels an in-flight orchestrator run for a todo (todos.cancel_run).

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/cancel-run' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.cancel_run RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch.

{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"run_cancelled": true
}

Kicks an LLM triage pass over the inbox (todos.triage) and returns {job_id}. This is a J-class op: it spends model budget on an autonomous LLM run with no _machine_confirmed gate on the daemon RPC — the same property that makes todos.run a privileged op. Optional triage scoping in the body; an empty body triages the whole inbox.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/triage' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.triage RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch. An empty body triages the whole inbox.

{
"job_id": "job-2f9b1e7a"
}

Posts a comment AND kicks an orchestrator turn on the todo (todos.message). Returns {job_id}; observe the orchestrator on the todo worker’s stream.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/message' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{
"text": "Please reproduce on a fresh checkout and attach the stack trace."
}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
FieldTypeRequiredDescription
textstringYesThe message that both comments and prompts the orchestrator.
{
"text": "Please reproduce on a fresh checkout and attach the stack trace."
}
{
"job_id": "job-2f9b1e7a"
}

Posts a comment onto a todo’s timeline WITHOUT triggering an orchestrator turn (todos.post_message).

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/messages' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{
"text": "FYI — confirmed on 14.3 with the production build."
}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.
FieldTypeRequiredDescription
textstringYesThe comment body to append to the todo timeline.
{
"text": "FYI — confirmed on 14.3 with the production build."
}
{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"commented_at": "2026-01-15T11:02:48Z"
}

POST /api/v1/agent/todos/{id}/proposals/{pid}/approve

Section titled “POST /api/v1/agent/todos/{id}/proposals/{pid}/approve”

Approves a run proposal on a todo (todos.approve_proposal). Approval is NOT inert: the daemon hands the approved proposal to startApprovedProposal, which spawns a background worker session equivalent to todos.run — a J-class autonomous run with no _machine_confirmed gate on the daemon RPC. The paired denyTodoProposal spawns no worker.

The HTTP edge has no service-level auth (hoody-proxy is the boundary, kit network-position trust); the daemon’s own systemAdminGate may still 403 admin_unauthorized when a Unix-socket admin capability is configured.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/proposals/p1/approve' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
pidpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.approve_proposal RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch. The todo {id} and proposal {pid} come from the path.

{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"proposal_id": "p1",
"approved": true
}

POST /api/v1/agent/todos/{id}/proposals/{pid}/deny

Section titled “POST /api/v1/agent/todos/{id}/proposals/{pid}/deny”

Denies a run proposal on a todo (todos.deny_proposal). Deny does not spawn a worker.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789/proposals/p1/deny' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
idpathstringYesPath identifier.
pidpathstringYesPath identifier.
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.deny_proposal RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch. The todo {id} and proposal {pid} come from the path.

{
"id": "7c4f1a0b9d2e4f8c8a1b2c3d4e5f6789",
"proposal_id": "p1",
"denied": true
}

Permanently and irreversibly removes archived todos (todos.purge) — the tombstones are destroyed with no _machine_confirmed gate on the daemon RPC. This is a J-class op on the same axis as run and triage: it can spend budget on autonomous activity. The daemon’s own systemAdminGate may still 403 admin_unauthorized when a Unix-socket admin capability is configured. Optional filters in the body scope which archived todos to purge; an empty body purges all archived tombstones for the cwd.

Terminal window
curl -X POST 'https://api.hoody.com/api/v1/agent/todos/purge' \
-H 'X-Hoody-Cwd: /Users/me/projects/my-app' \
-H 'Content-Type: application/json' \
-d '{}'
NameInTypeRequiredDescription
X-Hoody-CwdheaderstringNoPer-request working-directory scope (§6.1).
X-Hoody-Config-DirheaderstringNoPer-request --config-dir override (§6.1).
X-Hoody-ContainerheaderstringNoPer-request bound remote container (§6.1; omitted = local).
X-Hoody-RealmheaderstringNoPer-request realm selector (§6.1): "global" or a 24-hex id.
realmquerystringNoPer-request realm selector (§6.1) — the in:query alias of X-Hoody-Realm.

This endpoint accepts an optional JSON body. The body is forwarded to the daemon todos.purge RPC; the gateway scrubs every _-prefixed key and folds in the request scope (cwd, config_dir) before dispatch. An empty body purges all archived tombstones for the cwd.

{
"purged": 12
}