Asking several agents together
Last updated October 8, 2026
On this page
- Before you start
- Picking several agents
- Coordinator
- How they answer
- One leads
- Before you press Send
- The dates the ask covers
- Who answers the agents' questions
- More options
- Who else sees the answers
- When no model may take an agent's data
- When Send is refused
- Following the ask
- How an ask ends
- While it runs and after
- When an agent waits on your answer
- Follow-ups
- In a one-to-one conversation
- When the thread or its people change
- When the server restarts
- Agents asking agents
- What agents see of each other
- Limits
- Not possible yet
- For developers
- API
- Events
- CLI
Some questions need more than one agent. Search Console lives with the SEO Analyst and GA4 with the Analytics Analyst; "how did marketing do last month?" needs both. In OrchKernel you pick both agents in the message box, write one ask, and press Send. Each agent looks at its own part, at the same time, and you get one combined answer, or each agent's answer on its own if you prefer. Or one agent leads: it asks the others what it needs and answers you itself.
This page covers picking several agents, the choices before Send (how they answer, the dates, who answers their questions, who else sees the answers), following the ask on its card, agents asking other agents, and what you can do while it runs and after it ends. Asking one agent is in Asking an agent; setting an ask to run again every Monday is in Repeats.
The page describes the golive branch. What is not possible yet is listed
at the end.
Before you start#
The examples use the demo company from the quickstart, signed in as sam (Sam Ortiz, the sales lead). The demo binds the Marketing app to Sales, so Sam can ask the SEO Analyst, the Analytics Analyst and the Marketing Lead.
Without a model key the demo's stub planner answers every agent, and it knows none of these asks: each agent, and the agent that combines them, answers with the stub's "No model is configured" note. The card, its rows, Based on and the costs still show as described below, so you can follow the steps; the answers themselves need a model (see Models).
Picking several agents#
- Open Threads, choose New thread, give it the goal "Marketing review" and create it.
- In the message box type
@SEOand pick SEO Analyst. Its chip appears at the start of the box, and its name stays in your text as@SEO Analyst. - Type
check GSC,and then@Analyticsand pick Analytics Analyst. Both chips stay: picking an agent adds it and never replaces the one before. - Finish the sentence:
check GA4 for the last 28 days. The box now reads "@SEO Analyst check GSC, @Analytics Analyst check GA4 for the last 28 days", and Send reads "Send to 2 agents".
What you wrote after each name is that agent's part. Each agent is told its part as you wrote it ("Your part, as Sam wrote it: check GSC"), and the card shows it under the agent's name.
How the chips behave:
- Adding. The @ button after the chips ("Add another agent to this
ask") opens the picker; so does typing
@. An agent already chipped reads "In this ask" in the picker. A name typed by hand (@Analytics Analystfollowed by a space) becomes a chip too. - At most 6. With six chips every other agent in the picker is greyed out with "At most 6 agents in one ask", and the @ button goes.
- Removing. ✕ on a chip removes it. Backspace at the very start of the box first selects the last chip; a second Backspace removes it, and "Removed Analytics Analyst" offers Undo. Deleting an agent's name from your text removes the whole name and keeps its chip.
- Nobody joins before Send. The chips are a draft. An agent joins the thread only when the ask is sent ("Joins when you send" on its chip).
- The draft is kept. The chips, the way they answer, the options and your text stay in this browser per thread, across a reload or a visit to another page, until you send or sign out (and for at most 7 days).
- An agent that goes off while you type. If an admin pauses a chipped agent, its chip turns grey, Send is blocked and its tooltip says why and what to do: "Analytics Analyst is paused by an admin. Remove it to ask the others." Nothing in your draft is lost.
- Posting without asking. With chips in the box, + › Post without asking agents posts your text to everyone in the thread and runs no agent; the chips stay for your next message.
On a phone the chips wrap to two rows, then "+2" opens the rest.
Coordinator#
Coordinator is a built-in agent everyone may ask. It is listed in the picker with the label "Built in" and "Combines what several agents found into one answer, and leads asks that need several agents". It has no team, tools or data of its own and works only with what the other agents answer.
- Chipped with other agents, it combines (its chip reads "combines"): it is never one of the agents asked. Under One leads it can lead instead.
- Chipped alone, it leads: the line under the box reads "Coordinator decides whom to ask (up to 8 agent runs)." It picks the agents your ask needs from the ones you may ask (your own teams' first), gives each a brief (what to look at, the dates, what to send back), asks them, and combines what they found into one answer. "@Coordinator what changed in marketing last month?" asks the SEO Analyst and the Analytics Analyst without you picking them. How its asks show and what waits for you is in Agents asking agents.
How they answer#
With two or more chips, a control in the box's row says how they answer. Click it to choose:
| Way | What happens | What you get |
|---|---|---|
| Combined (the default) | Each agent looks at its part, all at once. When every one has finished, one agent combines their answers. | One combined answer, with each agent's own answer folded inside the card |
| Each answers | Each agent answers on its own, all at once. | One answer card per agent, each marked "Answer to: …" with a link back to your ask; nothing combined unless you ask for it afterwards |
| One leads | One agent gets your ask. It asks the other chipped agents what it needs (each its own brief), waits for them, then answers. | The lead's answer, with what it asked each agent shown under it |
Under Combined, Combined by picks who writes the combined answer:
Coordinator (the default), one of the chipped agents ("SEO Analyst
answers its own part first, then combines"), or another agent you may ask.
An agent whose playbook answers to combine (the Marketing Lead's
marketing-review) uses its own playbook; any other uses the built-in
combine playbook. An agent whose combine playbook could change data cannot
combine ("… can change data, so it cannot lead or combine"), unless an admin
approved it with a reason. With Coordinator chipped, Each answers is
greyed out: "Coordinator combines; it has no part of its own".
The combined answer is written from the agents' answers only: figures as the agents gave them, which agent each finding came from, where two answers disagree, and which agents did not answer and what is missing because of it. When the agents used different dates, it says so first and does not compare across them.
One leads#
Choose One leads ("It asks the others what it needs"), then Led by: one of the chipped agents, or Coordinator when it is chipped. The line under the box reads "Marketing Lead leads and may ask SEO Analyst and Analytics Analyst. Questions go to you." and Send asks the lead alone.
- Who may lead. Coordinator, or an agent with a skill that may ask other agents and changes no data. Otherwise Send is refused: "Content Writer does not ask other agents, so it cannot lead: ask the agents Combined", or "… can change data, so it cannot lead or combine".
- Whom it may ask. The other agents you chipped, and the agents its own skill names. It need not ask them all: it decides from what your ask needs, and may answer without asking anyone.
- What you see. Your ask, then the lead's own card. While it waits, its line reads "Waiting for SEO Analyst and Analytics Analyst (1 of 2 done)" with an orange dot (agents are at work, not waiting on you). Under its card, each time it asked shows as a small card "Asked SEO Analyst and Analytics Analyst", a row per agent and "1 of 2 done". A lead that asked nobody reads "Marketing Lead answered without asking others".
- Stop. Stop on the lead stops it and every agent it is waiting for. Stop on one of those agents stops that agent only; the lead goes on with what it has.
- Changes. The small cards change only through the lead: they offer no Add an agent, Ask again or Combine again ("This ask changes only through its lead"). To ask differently, send a new ask.
- Its time limit. Wait up to and Spend up to cover the lead and every agent it asks. When the time runs out the lead is stopped too, and its questions and approvals are withdrawn.
- Repeats. Repeat… keeps One leads and its lead (see Repeats).
Before you press Send#
The line under the box says what Send will do: "Send asks SEO Analyst and Analytics Analyst; Coordinator combines their answers. Questions go to you. 3 agent runs." (Each answers: "…; each answers on its own."). A shared thread adds "Everyone here sees the answers." Send's own label reads "Send to 2 agents".
The dates the ask covers#
When your text names a period, the dates are shown before you send: "Period: 10 Sep to 7 Oct 2026 (change)". The agents never decide what "last month" means: every agent is given the same dates and told to start its answer with the dates it used, and the combined answer checks them.
| You write | The period |
|---|---|
| "last 28 days", "past 7 days" | That many days, ending yesterday |
| "last week" | The previous Monday to Sunday |
| "last 2 weeks" | 14 days, ending yesterday |
| "this week", "week to date" | Monday to yesterday |
| "last month", "previous month" | The previous calendar month |
| "last one month", "past month", "last 30 days" | The 30 days ending yesterday |
| "this month", "month to date" | The 1st to yesterday |
| "September", "for September" | That month, the latest one that has ended or is under way |
| "last quarter", "Q3", "Q3 2026" | Calendar quarters (Q3 without a year: the latest past one) |
| "this year", "year to date" | 1 January to yesterday |
| "since 1 Sep" | 1 September to yesterday |
| "yesterday", "today" | That day, when nothing else names a period |
| "1 Sep to 30 Sep" | Those dates; without a year, the most recent past ones |
| "… against the 28 days before", "vs previous period", "compared with last month" | Adds a comparison: the same number of days just before |
Dates are read in the company's time zone (see Setting up a company). Numbers like "09/10" are read day first, or month first in a United States zone, and always shown in words.
- (change) opens two date fields and "Compare with the 28 days before"; Use these dates sends yours instead.
- When the ask names two different periods ("SEO for last month, GA for last week") and each sits in a different agent's part, each agent gets its own. When they cannot be split, the note reads "Two periods found · Choose one" with a button for each.
- Notes, never blocks: "Ends after today: figures will stop at yesterday", "This covers 14 months". A period longer than 400 days is refused unless an admin raised that limit.
- When the text names no period, nothing is shown, and the agents are told "If you use dated figures, say which dates."
Who answers the agents' questions#
Questions: you in the box's row says who an agent asks when something is unclear. Click it to choose:
| Choice | Who gets the questions |
|---|---|
| You (the default) | You |
| The thread owner, Pat Kim | The thread's owner (offered when that is not you) |
| Each agent's team lead | Each agent's own team lead; an agent with no team lead asks you |
| Someone else… | A person you pick: "Alice gets only the questions, not this conversation." |
| An agent… | An agent you pick that is not asked a part: "Data Steward answers the agents' questions; you get them if it cannot." |
If no answer in (no limit, 1 hour, 4 hours or 1 day, nights included) then: ask you, keep waiting, go on with its best guess or stop that agent. The person you pick is not added to the thread; they get each question in their inbox, with whose work it is and nothing else of the conversation. If they may not read what an agent reads, the control says so and its questions come to you first: "Pat Kim may not read Campaigns, which Analytics Analyst reads: its questions come to you first, and you can pass them on." How questions travel, are passed on and time out is in When an agent asks you a question.
With An agent…, an agent's question is first put to the agent you picked, as a short ask of its own, and its answer goes back to the agent that asked. If it cannot answer (it fails, is refused, answers only with a question, or its answer holds data no model the asking agent may use is cleared for), the question comes to you as usual. You can also make a chip answer questions from its menu: click the chip and choose Answers questions instead of Answers a part (offered while two other agents stay chipped). An agent answers questions or a part, never both; at most 2 agents answer an ask's questions.
More options#
Options (with two or more chips):
- Wait up to: 1 hour, 4 hours, 1 day (the default) or 3 days. Agents still at work then are stopped, and what came back is used.
- Spend up to: a limit for every agent run of this ask together, in the company's currency. Empty, the company's default applies ($5.00 in the demo); you may not go above the ceiling an admin sets.
Who else sees the answers#
Everyone who can see a thread sees every answer in it. An agent reads what the person who asked may read, so in a thread with other people an answer can show them data they may not read themselves. Before an ask in such a thread, the box checks everyone there against what the asked agents read:
- Create a thread "Pipeline review" with Pat Kim as a contributor.
- Chip SEO Analyst and Analytics Analyst and type
review the last 28 days. Above the box: "Pat Kim may not read Campaigns, which Analytics Analyst reads. Everyone here sees the answers." with Ask in my own conversation and Ask anyway. Send waits for your choice. - Ask in my own conversation opens a new conversation with the same agents and text; nothing is posted in the shared thread.
- Ask anyway, then Send: the ask carries a line everyone sees, Pat
included: "Sam Ortiz chose to ask anyway: Pat Kim may not read
Campaigns." The choice is recorded as an
audience_confirmedevent.
For the most sensitive data Ask anyway is not offered. Chip Sales Assistant in the same thread: "Pat Kim may not read Contacts and Leads, which Sales Assistant reads. Ask in your own conversation." (An admin sets how far Ask anyway goes; by default up to confidential data.) With three or more people the note shortens to "3 people here may not read Leads and Deals · Show who".
The same check runs before anyone new comes into a thread that already
holds answers: writing @Pat Kim see above in a thread where Analytics
Analyst answered from Campaigns reads "Pat Kim will see everything here,
including answers drawn from Campaigns, which he may not read." before Pat
is brought in. Only the collections and tools are checked, not row rules;
see Not possible yet.
When no model may take an agent's data#
A model is cleared for certain kinds of data (see Which model may see which data). When no model an agent may use is cleared for data its skills read, its chip carries an amber dot and the box warns: "Sales Assistant may not be able to answer: no model is cleared for customers' personal details", with Fix this for admins and Ask an admin for everyone else. It warns and does not block, since your ask may never touch that data. What happens when a run does reach it is in When no model may take the data.
When Send is refused#
The server checks everything again before anything is posted. A refused ask posts nothing and runs nobody:
| You see | Why |
|---|---|
| "At most 6 agents in one ask" | Seven or more agents |
| "Analytics Analyst is paused by an admin. Remove it to ask the others." | An admin paused it |
| "You have not delegated to …" (or why you may not ask it) | You may not ask one of the agents |
| "Billing Bot runs outside OrchKernel and cannot be asked here" | An outside agent (see Outside agents) |
| "Pat Kim took SEO Analyst out of this thread" | The thread's owner removed it; only the owner's ask brings it back |
| "An explicit plan is for one agent" | Developer mode's explicit plan with two chips |
| "You've started 30 asks with several agents in the last hour. You can send again at 10:42" | The hourly limit |
When the server refuses because of one agent, its chip is marked with the reason, and the box offers Remove Analytics Analyst and send to the others.
Sending twice by accident (a double click, a retry after a dropped connection) starts one ask: the second answers with the first.
Following the ask#
The ask appears as your message, then a card for the whole ask:
Combined answer from SEO Analyst and Analytics Analyst · combined by Coordinator Period: 10 Sep to 7 Oct 2026 SEO Analyst · check GSC · Working · Planning the next step Analytics Analyst · check GA4 for the last 28 days · Answered · 1 min 12 s · $0.04 Combines when both are done 1 of 2 done · $0.04 so far · waits up to 1 day · Stop all
| Part | What it shows |
|---|---|
| Head | "Combined answer from SEO Analyst and Analytics Analyst · combined by Coordinator"; for Each answers "Asked SEO Analyst and Analytics Analyst" |
| A row per agent | Its avatar, name and part, then what it is doing now (the live line of Watching an agent work) or how it ended. Show answer folds its own answer open on the card. With more than 3 agents, 3 rows show, then "Show 3 more". |
| The combiner's row | "Combines when both are done", then "Combining" ("Combining 1 of 2 answers" when one did not answer), then "Coordinator combined the answers" |
| Foot | "1 of 2 done · $0.04 so far · waits up to 1 day"; in the last three hours, when it ends ("ends in 40 min", "ends today at 18:00"). Stop all for whoever may stop it, and Add an agent while it runs. |
| The combined answer | The answer card, and under it Based on: each agent and how it ended ("SEO Analyst, answered; Analytics Analyst, failed"), each name opening that agent's own answer on the card. |
| Details | Every run of the ask with its cost, and the total; and the legend: Answered ✓ · Answered in part ◐ · Not answered ✕ · Waiting ⏸ · Working ● |
Each agent's row in plain words:
| Row reads | What happened |
|---|---|
| "Waiting for a free slot (2 asks ahead)" | The agent is at its limit of runs at once; it starts when one ends |
| "Working · 12 min · Planning the next step" | At work (the time shows after 5 minutes) |
| "Waiting for your answer", "Waiting for your approval" | It asked you something, or needs your approval |
| "Answered · 1 min 12 s · $0.04" | Done |
| "Answered with nothing" | It finished with no answer; Ask again |
| "Asked: Which GA4 property?" | It answered only with a question: answer it on the row, or Use as its answer |
| "Answered in part: stopped at its cost limit" | A cap stopped it; what it had is used, marked partial |
| "Failed: the Search Console server did not answer" | It failed; Ask again |
| "Could not answer: no model is cleared for candidates' personal details" | A model gap, with Fix this or Ask an admin |
| "Couldn't start: Analytics Analyst is paused by an admin" | It could not start |
| "Not done: Sam Ortiz said no" | An approval it needed was rejected |
| "Stopped by Sam Ortiz", "Taken out of the thread by Pat Kim" | Someone stopped it |
| "Ran out of time" | Still at work when the ask's time ran out |
| "Cut short by a server restart" | The server stopped while it worked and it may have done part of it (see Restarts) |
Answers that a Combined ask folds into its card are not repeated in the conversation. The card follows the work live; if the connection drops the foot reads "Reconnecting…", and if the card cannot load it reads "Could not load this ask's progress · Try again", while the answers already posted still show.
When every agent has finished, one item lands in your inbox: "Combined answer ready: ", "SEO Analyst and Analytics Analyst answered: " (Each answers), "1 of 2 agents answered: ", or "No agent could answer: ". You get no separate Completed note per agent.
How an ask ends#
- Every agent answered: the combine runs and the ask is done.
- Some answered: the combine still runs on what came back, and says what is missing. With only one answer the combiner's row reads "Combining 1 of 2 answers", so the cost is no surprise; you may stop it.
- None answered: nothing is combined and nothing more is spent; the card lists each reason and your inbox says "No agent could answer".
- The combine cannot run (the ask's spending limit is used up, or the combiner is paused or has no model for the data): the card says why, "Not combined: …", and Combine again stays offered, with another combiner if you like.
- The ask's time runs out: agents still at work are stopped ("Ran out of time"), their approvals and questions are withdrawn, and what came back is combined.
While it runs and after#
| Action | Where | Who | What happens |
|---|---|---|---|
| Stop all | The card's foot | You, the thread's owner, admins | Every agent of the ask stops, and anything they handed on; queued work and the combine are cancelled; approvals and questions are withdrawn. The card reads "Stopped by Sam Ortiz"; answers already posted stay. Anyone but you is asked first ("Stop Sam Ortiz's ask to 2 agents? Answers already posted stay.") and you are told in your inbox. |
| A member's Stop | Its live line | As for any run (see Stopping a run) | That agent stops; the ask goes on without it |
| Ask again on a row | A row that failed, was stopped, ran out of time, could not start or answered with a question | You | That agent is asked again. While the ask runs, the combine waits for it ("asked again" on the row). After it ended, Combine again is offered once it answers. |
| Answer and Use as its answer | A row that answered only with a question | You | Answer asks that agent again with your answer; Use as its answer takes its question as its answer |
| Add an agent | The foot, while it runs | You | Pick another agent and, if you like, its part. It answers the same ask and the combined answer waits for it; the time limit does not move. The audience check runs first ("Add anyway"). Once the ask ended the button reads Ask another agent too: it answers, then the answers are combined again. |
| Combine again | Under the combined answer | You | A new combined answer from each agent's latest answer; Combine with… picks another combiner. With nothing changed: "Nothing changed since the last combined answer. Combine again anyway?". The earlier answer is dimmed with "An updated combined answer is below". At most 3 combines an ask. |
| Combine these answers | An Each answers card, once it ended | You | Combines them now; the card becomes Combined |
| Ask again | Under the card | You | A new ask with the same agents, way and rule |
| Repeat… | Under the card | You | Opens the repeat sheet filled with this ask (see Repeats) |
Anyone else in the thread sees the card and its answers, but not Ask again, Add an agent or Combine again.
When an agent waits on your answer#
While an agent of the thread waits on your answer, a banner above the box reads "Analytics Analyst is waiting for your answer: Which GA4 property: www or app?" with Answer, which brings its question card into view ("2 agents are waiting for your answer" lists them). If you type in the box and press Send instead, the box asks rather than guessing: "Send as your answer to Analytics Analyst, or as a new ask to SEO Analyst and Analytics Analyst?" (with no chips, "… or as a message to everyone?"). Your answer goes to that question only, and the agent goes on.
Follow-ups#
Come back to the thread after a combined answer and the box starts with the same agents and the same way ("Same agents as your last ask."), never with Coordinator alone. After a single agent answered, it starts with that agent, as before.
In a one-to-one conversation#
A conversation with one agent stays between you and that agent. Pick a
second agent there and the box offers: "This is your conversation with SEO
Analyst. Ask both in a new thread?" Ask in a new thread opens a new
conversation with both chips and your text; Send there asks both. The
server refuses a group ask in a one-to-one conversation too (409
one_to_one, "ask several agents in a new thread").
When the thread or its people change#
| Change | What happens to an ask still running |
|---|---|
| The thread is closed | Stopped: "Stopped: the thread was closed by Pat Kim". Reopening does not restart it. |
| You are taken out of the thread | Your asks there stop, and your inbox says so, without the answers |
| You are deactivated or offboarded | Every ask and run for you stops |
| An agent is taken out of the thread by its owner | That agent stops ("Taken out of the thread by Pat Kim"); the ask goes on and the combined answer says what is missing |
| You lose the right to ask an agent | Checked again whenever its run starts or resumes: "Stopped: Sam Ortiz may no longer ask Analytics Analyst" |
| An admin pauses an agent while it waits on a question | "Paused by an admin while waiting"; the time limit still applies |
When the server restarts#
An agent that was at work when the server stopped is asked again once when it starts, provided its records show it only read; the card then says "Asked again after a restart". One that may have changed something settles "Cut short by a server restart; it may have done part of it: see its steps". An ask still open when a company is restored from a backup is not asked again: its agents settle "Cut short: the company was restored from a backup".
Agents asking agents#
A lead, the Coordinator asked alone, and any agent whose skill lists agents it may ask can ask other agents from inside its run: it sends each a brief, waits for their answers, and answers you from them. Each agent it asks runs for you, as a short ask of its own: it sees your ask and the brief, both as data, never as instructions from you; it reads and answers, and anything that would change something waits for your approval.
What waits for you. Once a run carries something from outside your own request (another agent's answer, someone else's message), asking an agent you did not choose waits for your approval: "Coordinator wants to ask Analytics Analyst. This run carried an answer from SEO Analyst." That agent's row reads "Waiting for Sam Ortiz's approval", and the run waits for it with the others. Approve and it starts; Reject and its row reads "Not done: Sam Ortiz declined it", and the run goes on with the others. The agents you chipped for One leads, and the agent you chose under An agent…, are asked without that approval. A follow-up to Coordinator in a thread that already holds answers, or a lead asking a second time in one run, is the usual case.
Refusals. An agent the run may not ask is left out and its row says why; the others go on. When every agent is refused, the run is told why in words, and the small card still shows each reason:
| The row reads | Why |
|---|---|
| "Couldn't start: Marketing Lead may not ask Content Writer here" | Neither its skill nor your grant names that agent |
| "Couldn't start: SEO Analyst is already working on this ask" | The agent is already on the way from your ask to this run (no A asks B asks A) |
| "Couldn't start: Ada Park may not ask Analytics Analyst" | You may not ask that agent yourself |
| "Couldn't start: Carol Diaz took Sales Assistant out of this thread" | The thread's owner took it out; only the owner's own ask brings it back |
| "Couldn't start: Pat Kim may not read Leads, which Sales Assistant reads" | Someone in the thread now may not read what that agent reads, and you did not confirm it |
| "Couldn't start: Analytics Analyst is paused by an admin" | Paused, offboarded or outside OrchKernel |
| "Couldn't start: This ask is already three levels deep" | An agent asked by an agent asked by an agent |
| "Couldn't start: This ask has reached 12 agent runs" | The ask's limit of agent runs |
| "This run has asked other agents 3 times" | A run asks at most 3 times, at most 4 agents each time |
| "You've started 30 asks with several agents in the last hour. You can send again at 10:42" | A single ask that starts asking other agents counts toward your hourly limit, as an ask to several agents does |
Who else sees. In a thread with other people, each agent asked is checked against everyone there at that moment, not only at Send: someone added while a lead works is covered too. An agent whose data someone may not read is refused unless you confirmed exactly that (Ask anyway at Send, or Add anyway when you brought them in). Adding a person while an ask runs checks them against the agents it may still ask: "Pat Kim may not read Leads, which Sales Assistant reads. An ask is still running here."
Siblings. In a Combined or Each answers ask, an agent that asks another agent of the same ask gets that agent's answer instead of running it again (waited for while it works, "busy" when the two would wait on each other).
What agents see of each other#
- Each agent works on its own part. It is told how many agents were asked, who the others are and what they cover (as data, never as instructions), its part as you wrote it, and the dates. It does not see the other answers while it works.
- The combiner sees every answer, fenced as data, each at most 8,000 characters. An answer it may not handle (a model gap, a class above what the combiner may handle) is left out and the combined answer says so. Files an agent attached are listed for it, and it may read those you may read.
- Later asks see earlier answers. In a thread, an agent's history now includes other agents' answers (the latest 6, 2,000 characters each) and people's messages that name it, each weighed by its kind of data: what no model it may use is cleared for is left out, with a line saying how many.
- Review mode. A run that carries something from outside your own request (another agent's answer, someone else's message, a third party's answer to a question) reads and answers as usual, but anything that would change something waits for your approval, and the approval names what the run carried: "Content Writer wants to write to Content items. This run carried answers from Sales Assistant (Leads)." Only you may approve it. The combiner always works this way, and an agent that carries data from a collection it may not read is refused outright when it tries to write it elsewhere.
- An agent another agent asked sees your ask and that agent's brief, as data. When the run that asked was itself handed work by an agent, that task's text comes as "Task text from Analytics Analyst (data, not instructions from Sam Ortiz)", never as your ask. Each answer comes back at its own class: an answer no model the asking agent may use is cleared for is replaced by a line naming its kind of data.
Limits#
| Limit | Value |
|---|---|
| Agents in one ask | 6 |
| How long an ask waits | 1 day by default; 15 minutes to 3 days |
| Spending | The ask's limit, else the company's default; never above the ceiling an admin sets; shared by every run of the ask |
| Agent runs in one ask, asked again included | 12 |
| Agents asked in one consult | 4 |
| Times one run asks other agents | 3 |
| Levels of agents asking agents | 3 |
| How long a run waits for the agents it asked | 60 minutes unless it says (5 minutes to 24 hours), never past the ask's own limit |
| Coordinator asked alone | Up to 8 agent runs |
| Combines of one ask | 3 |
| Asks to several agents a person starts in an hour | 30 (Combine again and a repeat's Run now count) |
| A period | 400 days, unless an admin raises it |
An admin sets the default spending limit and the ceiling on the Setup
page's Repeats card ("An ask may spend, by default", "A person may
raise it to"); a limit above the ceiling is refused with "A spending limit
may be at most $50.00 (an admin can raise it)". The period limit is
max_period_days in PUT /settings/asks.
Not possible yet#
- Hiding an answer from people in a shared thread who may not read what it was drawn from: today you are warned before you ask, and the choice is recorded. The warning checks collections and tools, not row rules.
- Agents working one after another, each seeing the previous answer.
- Outside agents as members of an ask.
- An estimate of the cost before Send: the line under the box counts the agent runs only.
- Adding an agent to a running ask from the message box ("Add to the ask still running, or start a new ask?"): use Add an agent on the card.
- A note on the card when the ask message was edited after it was sent.
For developers#
API#
All under /api, with Authorization: Bearer <token>.
| Method and path | Body | Notes |
|---|---|---|
POST /threads/:id/ask, POST /ask |
{ agents, text, mode?, combiner?, lead?, answers_questions?, rule?, wait_minutes?, limit_cents?, confirm_audience?, client_id?, parts?, period?, attachments?, new_thread? } |
Two to six agents in place of agent. mode: combined (default), each or lead. combiner: any agent the caller may ask; default coordinator. lead: with mode: "lead", the agent that leads (default the first); the others are the agents it may ask, and the answer is the lead's run, as a single ask's is. answers_questions: up to 2 agents, none asked a part, that answer the agents' questions first. A single agent: "coordinator" asks the Coordinator to lead. rule: who answers the agents' questions (below). wait_minutes 15 to 4,320 (default 1,440). confirm_audience: { gaps } exactly as GET /threads/:id/audience returned them. client_id: a UUID; the same one from the same person within 10 minutes answers the first ask. parts: { <agent>: <words> }, each words of text, at most 500 characters. period: { from, to, compare_from?, compare_to? }, overriding the period read from the text. 202 { outcome: "running", group, thread, message }. |
GET /groups/:id |
The ask (below). 404 for whoever may not see its thread. | |
POST /groups/:id/stop |
Stop all: the person who asked, the thread's owner, admins. | |
POST /groups/:id/combine |
{ combiner?, anyway? } |
Combine again, or Combine these answers on a settled Each answers ask. 409 not_settled, nothing_to_combine, unchanged (unless anyway), combining, unavailable; 429 after 3 combines. |
POST /groups/:id/retry |
Ask again: the same agents, way and rule as a new ask. | |
POST /groups/:id/members/:agent/retry |
{ answer? } |
Ask one agent again; with answer, as the answer to the question it asked. |
POST /groups/:id/members/:agent/use |
Use an agent's question as its answer. | |
POST /groups/:id/members |
{ agent, part?, confirm_audience? } |
Add an agent; once the ask ended, it answers and the answers are combined again. |
POST /approvals/:id |
{ approved, note? } |
Decides an agent another agent's run asks that waits for your approval (payload.consult, payload.ask). 409 ended once that run's wait is over ("This ask has ended"). |
GET /threads/:id/audience?agents=a,b&people=c |
{ gaps: [{ person, name, line, collections: [{ name, label }], tools, agents, above_thread_class }], ask_anyway, sentence, note }. For people who may post in the thread, and only for agents they may ask. |
|
GET /periods/resolve?text=&at= |
{ period: { from, to, compare_from, compare_to, words } | null, periods, two_found, warnings }, in the company's zone; at reads it as of that moment. |
|
GET /threads/:id |
Gains groups (the newest 200 asks to several agents) and repeats. |
|
GET /me/agents |
Gains the Coordinator (why: "built_in") and each agent's model_gaps. |
Refusals, before anything is posted:
| Status, code | When |
|---|---|
422 invalid |
Fewer than two or more than six agents, one twice, an explicit plan, a combiner or lead that may change data or does not ask other agents, wait_minutes out of range, a period over 400 days, a part not in the text, more than 2 answers_questions or one also asked a part, a rule naming an agent (use answers_questions) |
422 outside_agent |
An outside agent |
403 denied |
The caller may not ask one of them, or may not post in the thread |
409 no_model |
No chat model at all can answer one of them |
409 paused, taken_out, closed |
One is paused; the thread's owner took one out; the thread is closed |
409 audience |
Someone in the thread, or someone the text names, may not read what an agent reads, and confirm_audience does not carry exactly these gaps: { gaps, ask_anyway, message } |
409 one_to_one |
A one-to-one conversation |
429 rate_limited |
More than 30 asks to several agents in an hour |
On One leads' own record (mode: "lead") and on the small card of what a
run asked (mode: "consult"), retry, use, add and combine answer 409
lead_only ("This ask changes only through its lead"). A consult's view
carries consulter_run, the run that asked; One leads' carries lead and
lead_task.
The ask (GroupView), shortened:
{ "id": "…", "thread": "…", "message": "…", "mode": "combined", "person": "sam",
"state": "open", "outcome": null, "note": null,
"deadline": "2026-10-09T00:00:43Z", "wait_minutes": 1440, "limit_cents": 500,
"members": [
{ "agent": "seo-analyst", "name": "SEO Analyst", "part": "check GSC",
"task": "…", "run": "…", "state": "done", "reason": null, "model_gap": null,
"cost_cents": 4, "answer_version": 1, "activity": null, "waiting_for": null } ],
"combiner": { "agent": "coordinator", "task": "…", "run": "…", "state": "done" },
"answered": 2, "of": 2, "cost_cents": 9,
"period": { "from": "2026-09-10", "to": "2026-10-07", "words": "10 Sep to 7 Oct 2026" },
"combined": [{ "message": "…", "based_on": [{ "agent": "seo-analyst", "answer_version": 1 }], "superseded_by": null }],
"rule": { "ask": ["asker"], "answer_within_minutes": null, "then": "wait" },
"may": { "stop": true, "combine_again": false, "ask_again": true, "add_agent": true, "repeat": true } }
state is open, combining, settled or stopped; outcome is all,
partial or none. A member's state is queued, working, waiting,
done, asked, failed, declined, stopped, timed_out,
interrupted or refused, with reason in words.
The ask rule: { "ask": [<whom>], "answer_within_minutes": 5..4320, "then": "wait" | "assume" | "stop" }, with up to three people in order,
each asker, thread_owner, team_lead or person:<id>. A single-agent
ask takes rule too.
Events#
| Event | When |
|---|---|
group_started |
An ask to several agents started: group, mode, agents, combiner, person, by |
group_member_added |
An agent added, or asked again while the ask runs (retry) |
group_member_settled |
One agent finished: agent, task, run, state |
group_combined |
A combined answer was posted: message, combiner, based_on, supersedes |
group_settled |
The ask ended: outcome, answered, of, cost_cents |
group_stopped |
Stop all, or a change that stopped it: by, reason |
audience_confirmed |
Ask anyway, Add anyway or Post anyway: who, for whom, which collections and tools |
review_held, carried_data_refused |
A run in review mode was held for the person, or refused for carrying data where it may not go |
tree_closed |
Every piece of work the ask started has ended |
CLI#
With the server stopped:
ok --state orchkernel-demo/state.db --as sam ask --agent seo-analyst --agent analytics-analyst "Review the last 28 days"
ok --state orchkernel-demo/state.db --as sam group <id>
Repeat --agent to ask several together (at most 6). --each asks Each
answers; --combine <agent> picks the combiner; --lead <agent> asks One
leads, the lead asking the other agents named; --ask-whom <person> sends
the agents' questions to that person; --wait 4h and --limit 5.00 set the
time and spending limits; --from 2026-09-01 --to 2026-09-30 sets the
dates. Progress goes to standard error and the answer to standard output;
the exit code is 0 when every agent answered, 3 when some did and 1 when
none did. --no-wait prints the ask's id and returns; ok group <id>
shows it later. A refusal reads in words; --verbose adds the technical
line. Like a single ok ask, it needs a model: the stub planner answers
only inside ok demo serve.