← Receivers

tasks:board

tasks family

mcp

The whole task board in ONE request: every task in a group (or its whole subtree with scope:'tree'), filtered in RAM, with `total` before paging, a `nextCursor` when there is more, `truncated` naming any budget that bit, and a `summary` over ALL matched rows — counts by status/tag/assignee/workspace, the ready set, the blocked set, overdue, unassigned, orphans, no-notes. Use this to plan; use tasks:bulk to act on what it shows.

Effect
ask
Awaits an outcome — the call returns the response below.
Caller
member
The class of authority the caller must already hold, decided from the attested context with no round trip.
Reversible
yes
The effect can be undone by a later call.
Idempotent
yes
Safe to retry as-is.

Send it with your agent

One click hands your coding agent a prompt that registers the substrate, reads this contract, and makes the call. Launch opens the app; the others copy the prompt.

Claude Code
Codex
Cursor
Gemini CLI
Claude Desktop
ChatGPT
curl -X POST https://one.ie/api/ask/tasks:board \
  -H "Authorization: Bearer $ONE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"data": { "workspace": "one", "view": "summary" }}'

The key is never in a link. npx -y @oneie/cli login writes it to ~/.config/oneie/key on your machine.

Request

Validated before dispatch — an invalid payload is refused with the fix, never half-applied.

  • workspace string optional Group slug. Omit for your own. Honoured only if you may read it.
  • scope own | tree optional tree = this group AND every descendant group (the CEO / agency lens). Default own.
  • status string | string[] optional open | blocked | picked | done | verified | failed | dissolved, one or many. 'active' = open+blocked+picked (the default). 'all' = every status.
  • tags string[] optional Row must carry EVERY tag (AND).
  • anyTags string[] optional Row must carry AT LEAST ONE of these tags (OR).
  • assignee string optional Actor slug. '' = unassigned only.
  • parent string optional Only direct children of this task id. '' = top-level rows (no parent).
  • search string optional Case-insensitive substring on the task name.
  • ready boolean optional true = only rows claimable now (open, and every blocker closed). false = only rows that are NOT claimable now (not open, or at least one blocker still open). Omit for both.
  • include notes | graph | dates | thread[] optional Widen each row. notes = the prose goal, CLIPPED to the first 2000 chars per row (read the whole text one task at a time); graph = children + blocks (the reverse edges); dates = startAt/createdAt/closedAt; thread = the task's inbox conversation (id, comment count, last message). Compact rows already carry parent, blockedBy, dueAt.
  • view rows | summary | both optional summary = counts and sets only, no rows (cheapest way to see a 2,000-row board). Default both.
  • sort priority | due-at | updated-at | … optional Default priority (desc).
  • dir asc | desc optional
  • limit number optional Rows per page. Default 500, max 2000.
  • cursor string optional The nextCursor from the previous page.
  • fresh boolean optional Rebuild the snapshot instead of reading the memo. Rate-limited to once per memo window.

Response

What comes back from the call.

  • ok boolean
  • workspace string
  • workspaces string[] Every group the rows were read from (scope:'tree').
  • asOf string ISO time the snapshot was built. Rows are at most this stale.
  • cached boolean
  • total number Rows matching the filters, before paging. Exact — UNLESS `truncated.rows` is present, in which case the snapshot itself was capped and total is a floor.
  • returned number
  • nextCursor string Present iff more rows match. Absent = you have them all.
  • truncated object Absent = nothing was cut. Present = say so before you plan on it.
  • summary object
  • tasks object[]
  • error string

Traffic

Every call to tasks:board, counted where it is dispatched — over HTTP or in-process alike. Aggregate only — no actor, no payload, no workspace.

Counting…

Wiring

Every place in the open source that names tasks:board, and the file that answers it. Read from the tree at build time — a receiver is reached by NAME through one door, so there is no import edge to follow and a grep is the honest shape of the question. Structure, not volume — the count is in Traffic above.

Called from

API route 2
  • one.ie/web/src/lib/tasks/board.ts:5
  • one.ie/web/src/lib/tasks/learning.ts:6
Agent runtime 1
  • channels/src/tools/tasks.ts:139
MCP 1
  • tasks_stake · packages/mcp/src/tools/tasks.ts:361
CLI 1
  • packages/cli/src/tasks.ts:170
SDK 2
  • packages/sdk/src/client.ts:902
  • packages/sdk/src/tasks-bulk.ts:3
Docs 1
  • one.ie/web/src/lib/CLAUDE.md:62
JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "workspace": {
      "description": "Group slug. Omit for your own. Honoured only if you may read it.",
      "type": "string"
    },
    "scope": {
      "description": "tree = this group AND every descendant group (the CEO / agency lens). Default own.",
      "type": "string",
      "enum": [
        "own",
        "tree"
      ]
    },
    "status": {
      "description": "open | blocked | picked | done | verified | failed | dissolved, one or many. 'active' = open+blocked+picked (the default). 'all' = every status.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "tags": {
      "description": "Row must carry EVERY tag (AND).",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "anyTags": {
      "description": "Row must carry AT LEAST ONE of these tags (OR).",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "assignee": {
      "description": "Actor slug. '' = unassigned only.",
      "type": "string"
    },
    "parent": {
      "description": "Only direct children of this task id. '' = top-level rows (no parent).",
      "type": "string"
    },
    "search": {
      "description": "Case-insensitive substring on the task name.",
      "type": "string"
    },
    "ready": {
      "description": "true = only rows claimable now (open, and every blocker closed). false = only rows that are NOT claimable now (not open, or at least one blocker still open). Omit for both.",
      "type": "boolean"
    },
    "include": {
      "description": "Widen each row. notes = the prose goal, CLIPPED to the first 2000 chars per row (read the whole text one task at a time); graph = children + blocks (the reverse edges); dates = startAt/createdAt/closedAt; thread = the task's inbox conversation (id, comment count, last message). Compact rows already carry parent, blockedBy, dueAt.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "notes",
          "graph",
          "dates",
          "thread"
        ]
      }
    },
    "view": {
      "description": "summary = counts and sets only, no rows (cheapest way to see a 2,000-row board). Default both.",
      "type": "string",
      "enum": [
        "rows",
        "summary",
        "both"
      ]
    },
    "sort": {
      "description": "Default priority (desc).",
      "type": "string",
      "enum": [
        "priority",
        "due-at",
        "updated-at",
        "created-at",
        "name"
      ]
    },
    "dir": {
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ]
    },
    "limit": {
      "description": "Rows per page. Default 500, max 2000.",
      "type": "integer",
      "minimum": 1,
      "maximum": 2000
    },
    "cursor": {
      "description": "The nextCursor from the previous page.",
      "type": "string"
    },
    "fresh": {
      "description": "Rebuild the snapshot instead of reading the memo. Rate-limited to once per memo window.",
      "type": "boolean"
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "workspace": {
      "type": "string"
    },
    "workspaces": {
      "description": "Every group the rows were read from (scope:'tree').",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "asOf": {
      "description": "ISO time the snapshot was built. Rows are at most this stale.",
      "type": "string"
    },
    "cached": {
      "type": "boolean"
    },
    "total": {
      "description": "Rows matching the filters, before paging. Exact — UNLESS `truncated.rows` is present, in which case the snapshot itself was capped and total is a floor.",
      "type": "number"
    },
    "returned": {
      "type": "number"
    },
    "nextCursor": {
      "description": "Present iff more rows match. Absent = you have them all.",
      "type": "string"
    },
    "truncated": {
      "description": "Absent = nothing was cut. Present = say so before you plan on it.",
      "type": "object",
      "properties": {
        "rows": {
          "description": "The snapshot hit its row budget; this many unique rows were read. total is a floor.",
          "type": "number"
        },
        "edges": {
          "description": "parent/blockedBy edges were capped — a row may read as unblocked or orphaned when it is not.",
          "type": "boolean"
        },
        "tags": {
          "description": "This many returned rows may be missing tags.",
          "type": "number"
        }
      }
    },
    "summary": {
      "type": "object",
      "properties": {
        "byStatus": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          }
        },
        "byTag": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Bare tags only (no workspace:/slug:/@ namespaces), top 100 by count."
        },
        "byAssignee": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "'' key = unassigned."
        },
        "byWorkspace": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          }
        },
        "ready": {
          "type": "number",
          "description": "Open with every blocker closed — claimable now."
        },
        "blocked": {
          "type": "number",
          "description": "Has at least one open blocker, or status blocked."
        },
        "overdue": {
          "type": "number"
        },
        "unassigned": {
          "type": "number"
        },
        "orphans": {
          "type": "number",
          "description": "No parent — unreachable from any plan's containment walk."
        },
        "noNotes": {
          "type": "number",
          "description": "No prose goal — the rows a puller cannot act on."
        },
        "readyIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Top 50 ready rows by priority."
        },
        "blockedIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Top 50 blocked rows by priority."
        }
      },
      "required": [
        "byStatus",
        "byTag",
        "byAssignee",
        "byWorkspace",
        "ready",
        "blocked",
        "overdue",
        "unassigned",
        "orphans",
        "noNotes",
        "readyIds",
        "blockedIds"
      ]
    },
    "tasks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "tid": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "priority": {
            "type": "number"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Bare tags; workspace:/@assignee are lifted into their own fields."
          },
          "assignee": {
            "type": "string"
          },
          "workspace": {
            "type": "string"
          },
          "parent": {
            "type": "string"
          },
          "blockedBy": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "openBlockers": {
            "description": "How many of blockedBy are not yet done/verified/dissolved.",
            "type": "number"
          },
          "ready": {
            "type": "boolean"
          },
          "dueAt": {
            "type": "string"
          },
          "overdue": {
            "type": "boolean"
          },
          "startAt": {
            "type": "string"
          },
          "createdAt": {
            "type": "string"
          },
          "closedAt": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "children": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "thread": {
            "type": "object",
            "properties": {
              "threadId": {
                "description": "The inbox thread id; absent = nobody has commented yet.",
                "type": "string"
              },
              "comments": {
                "type": "number"
              },
              "lastAt": {
                "type": "string"
              },
              "lastAuthor": {
                "type": "string"
              },
              "lastBody": {
                "description": "First 280 chars of the latest message.",
                "type": "string"
              }
            },
            "required": [
              "comments"
            ]
          }
        },
        "required": [
          "tid",
          "name",
          "status",
          "priority",
          "tags",
          "workspace",
          "ready"
        ]
      }
    },
    "error": {
      "type": "string"
    }
  },
  "required": [
    "ok"
  ]
}