[{"data":1,"prerenderedAt":34},["ShallowReactive",2],{"$f35vcao8uoxk85":3},{"href":4,"title":5,"description":6,"kind":7,"mark":7,"planned":8,"contributors":9,"provenance":7,"html":10,"headings":11},"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat","Chat tools","The os.* tools the CEO chat offers a member: the company's directory, its tasks, and starting and checking runs.",null,false,[],"\u003Cp>\u003Cem>Generated from the built-in tools registry. Do not edit by hand.\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>When the CEO talks to a member in the portal, the member can use these tools, and the member's own connected tools beside them. Chat has no gates of its own; spend still applies.\u003C\u002Fp>\n\u003Cp>A conversation opened for one job, such as creating a task, also gets the tools kept for that job. A member’s everyday thread never does.\u003C\u002Fp>\n\u003Cp>A run never answers a chat-only tool, so a task that declares one is refused when it is saved (\u003Ccode>tool_not_run_callable\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-list-tasks\">\u003Ccode>os.list_tasks\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>The tasks of the roles the chatting member holds, plus OS-owned tasks.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-start-task\">\u003Ccode>os.start_task\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Queue a run of a task of a role you hold, an OS task, or a colleague's task.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-get-run\">\u003Ccode>os.get_run\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>A run's status, why it stopped, and its recent events.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-hand-off-task-brief\">\u003Ccode>os.hand_off_task_brief\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Hand the brief a person agreed to over to the OS, which designs the task from it.\u003C\u002Ftd>\n\u003Ctd>write\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-list-runs\">\u003Ccode>os.list_runs\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>The enterprise's runs, newest first, a page at a time.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-kpi-board\">\u003Ccode>os.kpi_board\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>The enterprise's KPI board: every signed-off company KPI and each team's key KPI, with its light.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fchat#os-list-enterprise-kpis\">\u003Ccode>os.list_enterprise_kpis\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd>Every KPI of the enterprise, with its owner, target, cadence, light and last reading.\u003C\u002Ftd>\n\u003Ctd>read\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Also offered here: \u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\u002Fos#os-directory\">\u003Ccode>os.directory\u003C\u002Fcode>\u003C\u002Fa>, which a run can call too.\u003C\u002Fp>\n\u003Ch2 id=\"os-list-tasks\">\u003Ccode>os.list_tasks\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>The tasks of the roles the chatting member holds, plus OS-owned tasks.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">List the tasks of the roles you hold on each task’s team, plus OS-owned tasks. OS tasks are not a person.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>No declared fields: the schema accepts any object.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the CEO chat, the API.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>GET \u002Fv1\u002Ftasks\u002Fheld-by\u002F:memberId\u003C\u002Fcode> (\u003Ccode>tasks:read\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-start-task\">\u003Ccode>os.start_task\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Queue a run of a task of a role you hold, an OS task, or a colleague's task.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Start a run of a task of a role you hold, an OS task, or a colleague’s task. Pass taskId or slug, and input matching the task’s fields; a field you leave out takes the task’s default. The run goes to a free member holding the task’s role, who may not be you; when every holder is busy it queues as pending. This only queues the run: check it with os.get_run before reporting on it.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>taskId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>slug\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>input\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>object\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Idempotent: a repeat of the same call acts once, or leaves the same state. Keyed on the chat session and the tool call: the same call sent twice starts one run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the CEO chat, the API.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> \u003Ccode>{ runId, status, taskId, slug, origin }\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>POST \u002Fv1\u002Ftasks\u002F:taskId\u002Fruns\u003C\u002Fcode> (\u003Ccode>tasks:write\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>task_not_found\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No task in this enterprise has that id or slug.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;slug&quot;: &quot;weekly-report&quot;,\n  &quot;input&quot;: {\n    &quot;week&quot;: &quot;2026-W39&quot;\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"os-get-run\">\u003Ccode>os.get_run\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>A run's status, why it stopped, and its recent events.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">One run's status, why it stopped (blockedReason, when it is blocked), task id and input, and its last eight events. Not found for another enterprise's run.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>runId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The run id.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>No other fields are accepted.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the CEO chat, the API, the OS MCP server.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> Status, \u003Ccode>blockedReason\u003C\u002Fcode> (why a \u003Ccode>blocked\u003C\u002Fcode> run stopped, otherwise null), task id, input and the last eight events.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>GET \u002Fv1\u002Fruns\u002F:runId\u002Fos-tool\u003C\u002Fcode> (\u003Ccode>runs:read\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>runId_required\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>runId\u003C\u002Fcode> is missing.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>run_not_found\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>No run in this enterprise has that id.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;runId&quot;: &quot;5f0c1d2e-0000-4000-8000-000000000004&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"os-hand-off-task-brief\">\u003Ccode>os.hand_off_task_brief\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Hand the brief a person agreed to over to the OS, which designs the task from it.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Hand the brief the person agreed to over to the OS, which designs the new task from it and asks the CEO to sign off on its definition before anything is created. Call it once, only after they have said yes to your read-back summary, with every part of the brief in their own words. It starts the design and returns its run; it does not create the task.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>object\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>What the person agreed to, each part in plain language.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.goal\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>What the job is.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.success\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>How to tell it was done well.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.owner\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The existing team and role that should own it.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.trigger\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>When it runs: on demand, on a schedule said in words, or after another task.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.inputs\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>What it needs each time it runs.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.tools\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The connected tools it needs, naming any that is not connected.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief.limits\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>What it must never do, what needs approval, and its budget.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>No other fields are accepted.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> write.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Idempotent: a repeat of the same call acts once, or leaves the same state. Keyed on the conversation and the tool call: the same call sent twice starts one run.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the CEO chat, the API.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Offered in:\u003C\u002Fstrong> a conversation opened for \u003Ccode>create_task\u003C\u002Fcode> only, never in a member's everyday thread.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> \u003Ccode>{ runId, status, taskId }\u003C\u002Fcode>: the run designing the task.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>POST \u002Fv1\u002Ftasks\u002Ffrom-brief\u003C\u002Fcode> (\u003Ccode>tasks:write\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Error\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003Cth>What happens\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>brief_required\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>brief\u003C\u002Fcode> is missing, or says nothing about what the job is.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>task_designer_not_found\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The enterprise has no task-designing task to hand the brief to.\u003C\u002Ftd>\n\u003Ctd>Tool error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;brief&quot;: {\n    &quot;goal&quot;: &quot;Chase unpaid invoices&quot;,\n    &quot;success&quot;: &quot;Every invoice over 30 days old gets one polite reminder&quot;,\n    &quot;owner&quot;: &quot;Finance team, accounts role&quot;,\n    &quot;trigger&quot;: &quot;Every Monday morning&quot;,\n    &quot;inputs&quot;: &quot;The list of overdue invoices&quot;,\n    &quot;tools&quot;: &quot;Email, which is connected&quot;,\n    &quot;limits&quot;: &quot;Never contact a customer twice in a week; refunds need approval; two dollars a run&quot;\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"os-list-runs\">\u003Ccode>os.list_runs\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>The enterprise's runs, newest first, a page at a time.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">List the enterprise's runs, newest first, one page at a time. Each run carries its status, task (id, name, slug), the member it runs as, its input, and when it was created, started and finished. The response is { data, total, page, limit, pages }.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>status\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string, one of \u003Ccode>pending\u003C\u002Fcode>, \u003Ccode>queued\u003C\u002Fcode>, \u003Ccode>running\u003C\u002Fcode>, \u003Ccode>waiting_on_gate\u003C\u002Fcode>, \u003Ccode>waiting_on_run\u003C\u002Fcode>, \u003Ccode>paused_spend\u003C\u002Fcode>, \u003Ccode>succeeded\u003C\u002Fcode>, \u003Ccode>failed\u003C\u002Fcode>, \u003Ccode>cancelled\u003C\u002Fcode>, \u003Ccode>skipped_overlap\u003C\u002Fcode>, \u003Ccode>blocked\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Only runs in this status.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>taskId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Only runs of this task.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>live\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>true for only runs still in progress: not finished, and not blocked or paused on spend.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>page\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, at least 1\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The page to read, from 1. Defaults to 1.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>limit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, 1 to 200\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Runs per page, up to 200. Defaults to 25.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>No other fields are accepted.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the API, the OS MCP server.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> \u003Ccode>{ data, total, page, limit, pages }\u003C\u002Fcode>, each run with its status, task, member, input and times.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>GET \u002Fv1\u002Fruns\u003C\u002Fcode> (\u003Ccode>runs:read\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;status&quot;: &quot;failed&quot;,\n  &quot;limit&quot;: 5\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"os-kpi-board\">\u003Ccode>os.kpi_board\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>The enterprise's KPI board: every signed-off company KPI and each team's key KPI, with its light.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">The enterprise's KPI board, as HQ shows it: every company KPI the owner has signed off and each team's key KPI with its light (red off target, amber at risk, green on target), its trend (up, down, flat), when it was last read, the cadence it is read on, and whether that reading is overdue. A KPI nobody has read yet has no light (`rag` is null): it is never read and overdue, not green. A KPI still waiting for sign-off is not on the board. A team that has set no key KPI is named with none rather than left out. The response is { enterprise, teams }. Read-only: recording a reading is not a tool here.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Takes no arguments: no fields are accepted.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the API, the OS MCP server.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> \u003Ccode>{ enterprise, teams }\u003C\u002Fcode>: each signed-off company KPI, and each team with its key KPI or \u003Ccode>key: null\u003C\u002Fcode> when it has none. Every KPI carries its light, trend, \u003Ccode>lastReadAt\u003C\u002Fcode>, \u003Ccode>cadenceDays\u003C\u002Fcode> and whether it is \u003Ccode>overdue\u003C\u002Fcode> — derived from the readings themselves, so it matches HQ's board KPI for KPI.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>GET \u002Fv1\u002Fenterprise\u002Fkpis\u003C\u002Fcode> (\u003Ccode>enterprise:read\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-list-enterprise-kpis\">\u003Ccode>os.list_enterprise_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Every KPI of the enterprise, with its owner, target, cadence, light and last reading.\u003C\u002Fp>\n\u003Cp>What the model reads:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">List every KPI of the enterprise, whatever layer owns it and whether or not it has been signed off, ordered by name then id. Each row carries its id (the kpiId the readings tools take), name, owner (layer and id), source (kind and ref), target (value, direction, AMBER band, on-target-worsening rule), cadence, current light, whether it is overdue, when it was signed off (null while it waits for sign-off, when it takes no reading), and its latest reading. The light is null when the KPI has no target or no reading yet. No arguments. Never another enterprise's KPIs.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Takes no arguments: no fields are accepted.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Effect:\u003C\u002Fstrong> read.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Retry:\u003C\u002Fstrong> Safe: repeating the call changes nothing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Called by:\u003C\u002Fstrong> the API, the OS MCP server.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Returns:\u003C\u002Fstrong> One row per KPI, each with \u003Ccode>id\u003C\u002Fcode>, \u003Ccode>name\u003C\u002Fcode>, \u003Ccode>ownerLayer\u003C\u002Fcode> (\u003Ccode>company\u003C\u002Fcode>, \u003Ccode>team\u003C\u002Fcode>, \u003Ccode>role\u003C\u002Fcode>, \u003Ccode>task\u003C\u002Fcode>, or null for a company KPI set before layers), \u003Ccode>ownerId\u003C\u002Fcode>, \u003Ccode>sourceKind\u003C\u002Fcode> (\u003Ccode>task\u003C\u002Fcode> or \u003Ccode>person\u003C\u002Fcode>), \u003Ccode>sourceRef\u003C\u002Fcode>, \u003Ccode>target\u003C\u002Fcode>, \u003Ccode>cadenceMinutes\u003C\u002Fcode>, \u003Ccode>light\u003C\u002Fcode>, \u003Ccode>overdue\u003C\u002Fcode>, \u003Ccode>signedOffAt\u003C\u002Fcode> (ISO 8601, or null) and \u003Ccode>lastReading\u003C\u002Fcode> (\u003Ccode>id\u003C\u002Fcode>, \u003Ccode>value\u003C\u002Fcode>, \u003Ccode>takenAt\u003C\u002Fcode>, \u003Ccode>recordedBy\u003C\u002Fcode>, \u003Ccode>runId\u003C\u002Fcode>), or null before the first reading.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>API:\u003C\u002Fstrong> \u003Ccode>GET \u002Fv1\u002Fkpis\u003C\u002Fcode> (\u003Ccode>kpis:read\u003C\u002Fcode>)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{}\n\u003C\u002Fcode>\u003C\u002Fpre>\n",[12,16,19,22,25,28,31],{"id":13,"text":14,"level":15,"planned":8},"os-list-tasks","os.list_tasks",2,{"id":17,"text":18,"level":15,"planned":8},"os-start-task","os.start_task",{"id":20,"text":21,"level":15,"planned":8},"os-get-run","os.get_run",{"id":23,"text":24,"level":15,"planned":8},"os-hand-off-task-brief","os.hand_off_task_brief",{"id":26,"text":27,"level":15,"planned":8},"os-list-runs","os.list_runs",{"id":29,"text":30,"level":15,"planned":8},"os-kpi-board","os.kpi_board",{"id":32,"text":33,"level":15,"planned":8},"os-list-enterprise-kpis","os.list_enterprise_kpis",1791124519724]