One page for everything to do with the AI agent workforce. It replaced the AI Agents tab that used to sit inside the Systemisation page (moved 24 Aug 2026, Kevin's ruling). On 25 Aug 2026 the three scrolling zones became three tabs, and the CEO Brief moved here from its own shell tab.
The Approvals and Check these tabs carry a count badge, so you can see there is something waiting without opening the tab. Building an agent's SOP from a video stays on the Systemisation page. This page is where agents are managed and judged.
Today's brief from the morning robot: what the board flagged, what to ignore today, what was handed off, and the "safe to act today" money figure. Read straight from the CEO Briefs table, newest first. Two things worth knowing:
Every login the robots use: the sites on their main browser, and each Utilita flat on its own. Each line says where it stands and when it was last looked at:
| State | What it means | What to do |
|---|---|---|
| Signed out | A robot looked and found no login. | Press Sign in on your Mac. The Robot sign-in app opens that site. Sign in, then press Cmd+Q. |
| Not checked yet | Nothing has looked at it since it was added. | Sign in if a robot needs it today. Otherwise the 06:40 check looks tomorrow. |
| You signed in | You closed a sign-in window after the last check. | Nothing. The robot confirms it at its next check. |
| Signed in | The last check found the robot signed in. | Nothing. |
| When needed | A short login (GOV.UK, HMRC, GoCardless, American Express) that lapses within the hour. | Sign in when a task asks for it. |
+ Add a new site opens the same app's add dialog: paste the site's sign-in page, name it, sign in. The robots can use it from then on, and it joins this list. Sites the robots hold a login for but have no sign-in page on file are named under Show all; add each one once the same way.
The buttons are Mac only, because the robots' browser lives on your Mac. On a phone the panel shows the states with no buttons. The list comes from the robot-signins row of the Estate Status table, which scripts/estate-status.py rewrites every ten minutes from the 06:40 keep-alive, the robots' own session checks, the hourly Utilita read and the sign-in log. The app rewrites it straight after each sign-in, so the line changes within a minute.
This panel is the list of sites, nothing else (8 Oct 2026). Anything to do with a task is an approval card in the queue below: a task waiting on a sign-in keeps its Sign in now button; a robot blocked on a sign-in, or on a site missing from its list, comes to the queue as its own card with Sign in or + Add this site and an I can't do this box; and a step only you can take is a Your step card with Your turn on it. Sign in on the card and the robot picks the task up by itself; the card leaves the queue at the next check. A Your step card shows Your turn as soon as it arrives when the robot's plan has passed its check.
Anything that does not need you, the robots do behind the scenes. When a step needs you on a website (buy a policy, pay online, file a confirmation statement, sign, answer declarations), the robot does every step before yours and, once you have approved its card, the task comes back to your queue as a Your step card with a Your turn button on it. Have ten free minutes, then press Your turn on your Mac:
On the card itself the box under your step takes your proof: type it, press Attach, or drop a file on the box (a receipt or screenshot alone is enough). Done, here is the proof puts the files on the task and the robot checks them within half an hour. When you cannot do the step (a portal that opens on a login you have no account for), say why in the box and press I can't do this: within half an hour the task goes back to its agent as Request changes with your reason, the agent has to find a way that does not need you, and it comes back as a fresh card that answers your reason. Added 8 Oct 2026.
If the robot gets stuck on a page, the bar says so and the window is still yours to finish by hand. It also stops, on purpose, before anything worded like the last step (buy, pay, confirm, accept, order, submit, file, sign) before any answer (a tick box, a Yes/No, a dropdown) to a question worded like a declaration, and before a box that asks for your name as a signature, so a plan whose option reads "Pay monthly" stops there and leaves that choice to you. Each plan lives privately on your Mac in ~/knowledge-os/handover/ (it holds your details), and the robot proves it with a practice run before the card reaches you.
The queue shows ONLY loop-raised work: tasks at Status Approval that carry a Sent For Approval By agent link. Legacy records parked at Approval status never appear. Cards are ordered tier 1 first, then priority, then longest waiting. Each card leads with the one-line ask (the agent's own "Carrying this out will involve" line), then the agent's full work, the brief it was given, and the age it has been waiting. Tier 1 items carry a red banner: read those fully before deciding. Where the task came from an email, the card links straight to the original thread.
Above the cards: All, one chip per agent with its count, and a Tier 1 toggle for the work touching your private legal and financial matter. The two combine, so they can narrow to nothing (an agent with no tier-1 work) – when that happens the page says so and offers Clear filters rather than looking like an empty queue.
This page is the third face of ONE mechanism. It writes the same fields as the Tasks drawer and the Slack loop, so the three surfaces can never disagree.
| Action | What it means | What is written to the task |
|---|---|---|
| Approve | Release the work. The agent carries it out, then completes the task itself. | Approval Outcome = Approved as-is · Approved At = now · Approved By = Kevin · Status = Today · Due Date = today · Completion Date cleared · task handed back to the agent (Team Member + Sent For Approval By = the agent, Assignee cleared) |
| Approve with minor edits | Release the work, but with the change you describe applied first. Your comment is an EDIT INSTRUCTION: the agent makes only that change, then carries out the edited version. Still counts as accurate work. Until 26 Aug 2026 this carried out the ORIGINAL text and ignored your comment; it now refuses to complete until the edit has been applied. For anything bigger than a small edit, use Request changes. | Same as Approve, with Approval Outcome = Approved with minor edits · Approval Feedback = your edit. The agent then rewrites Agent Output via agent-dispatch.py revise, which archives the text you approved into Notes so what went out can be compared with what you read. |
| Request changes | Back to the agent to redo. A comment is required; your words are the instruction. | Approval Outcome = Changes requested · Approval Feedback = your comment · Approved At/By stamped · Status = Today, due today, handed back to the agent |
| Reject and close | Kill the work entirely. A reason is required and a confirm dialog stands in the way. Counts against the agent's accuracy. | Approval Outcome = Rejected · Approval Feedback = your reason · Status = Completed · Completion Date = now · agent links set as above |
| Not yet — bring it back in… (later today / tomorrow / 3 days / a week / 2 weeks / a month, or a date you pick) | The one that is not a verdict. Use it when the work is fine but you cannot act on it yet — a confirmation statement waiting on an authentication code in the post, a renewal that is not due, a reply that depends on someone else. The task leaves your queue, the sidebar badge, your Slack DM and the CEO brief, and comes back on that date with the agent’s work exactly as it is now. Nothing is approved, nothing is sent, and it does not count against the agent. Everything parked is listed at the top of the Approvals tab with its return date, and “Bring back now” undoes it in one click. Added 28 Aug 2026 at Kevin’s request. Later today (added 28 Oct 2026) brings it back at the next of 9am, 1pm or 5pm, London time (Airtable’s clock can run a few minutes behind, so by about 1:05pm for 1pm, never early); the button names the time, and after 5pm it is not shown, so Tomorrow comes first. It leaves your queue, the sidebar badge, the front-page count, the Tasks page counts and the count above every chat. The AI team panel and the robots still count it as waiting for those few hours. | Deferred Until = the date, or for Later today Back At = the time, plus your note appended to Feedback History. Nothing else — no Approval Outcome, no status change, no hand-back. There is no job that brings it back: all four surfaces filter on the date themselves, so the morning it passes the task is simply there again. The Slack worker replies in the existing thread with the return date, clears the message timestamp, and posts a fresh card on the day. |
| Remember this (tickbox beside the note, ticked by default) | The one control that makes anything permanent. It is read with ANY verdict that carries words (it does not apply to a knock-back, which decides nothing and teaches nothing, and a decision with no note never reads it): your note becomes a standing rule in that agent's own instruction file, applied to every future task. Untick it for a one-off: Request changes still fixes that one task, but the agent will not remember why. From 7 to 24 Sep 2026 the box sat in the reject row and was read for rejections only, so notes given on approvals were never kept. In Slack the equivalent is reacting :brain: instead of :x:. | Remember This = ticked. Within 30 minutes agent-dispatch.py lessons appends a dated line to ~/.claude/agents/<agent>.md under "Lessons from Kevin", mirrors it to the register Learning Log, and stamps Lesson Written At. The dispatch run FAILS if a ticked lesson is still unwritten 90 minutes later. |
| Your note may apply to other cards (24 Sep 2026) | Seconds after you save a decision with a note, the page checks your note against every other card still waiting (the standard AI model reads them all). Each card it fits gets a strip: your note, the card you wrote it on, and why it may fit. Send back with my note sends that card back to its agent with your words (a rejection's copy closes it for the same reason). Not this one removes the strip. A line at the top of the queue offers to send them all back at once. Nothing moves until you tap, nothing is approved for you, and if the check fails the line says so. Not run for a decision with no note, for "Duplicate", or from the bulk bar. | Only when you tap: the same fields as Request changes (or Reject with the same Verdict Reason), with Approval Feedback reading "Same as my note on another card (…): your note". Remember This is never set on the copy: the card you wrote on carries the rule. |
Every decision also leaves an Airtable comment on the task, and the optional "Kind of work" picker sets the Task Type used to score the agent per job type.
Six lanes, each reporting absence. A lane that cannot be read shows a fault line, never a clean slate. When all six run clean the tab says: "Nothing needs you – all agents moving."
| Lane | What it flags | Why |
|---|---|---|
| Approvals | Loop-raised work waiting more than 24 hours for a decision | An agent is blocked on you; the queue is the bottleneck |
| Stuck tasks | Tasks at Today/Overdue owned by an AI agent, past their due date | Work that should have been done and has not moved |
| Inbound | Open inbound reply tasks older than 24 hours | The 24-hour reply promise is at risk |
| Daily logs | Built or Live agents that wrote nothing to the AI Agent Daily Log today | Silence means the agent did not run, or its log write broke |
| Guardrails | Any automatic guardrail tightening in the last 7 days | The system pulled a leash in on falling accuracy; you should know |
| Duplicates | Two or more open tasks with the same owner and the same subject | Your standing rule is one subject = one open task. A chaser should update the existing task, not raise a sibling |
Everything that has been built and everything that is running, in one place, kept up to date by the system rather than by hand. Open it from the Track record tab, or link straight to it with #tab=track-record.
scripts/built_inventory.py, carried by the built-inventory row that scripts/estate-status.py writes to the private Estate Status table.The sync bar at the top of the page runs these checks, among others. The sidebar dot in the shell mirrors the worst of them.
| Check | If it fails |
|---|---|
| Track record list fresh | The built-inventory row is missing, failed, or older than 30 minutes, so the Track record tab's running list may be out of date. Its detail says why (for example a source that read nothing). The estate-status job writes it every ten minutes. |
| Robot sign-ins listed | The robot-signins row is missing, failed or unreadable, so the Robot sign-ins panel cannot say which logins are live. Its detail says why. The estate-status job writes the row every ten minutes. |
| Approvals queue read | Airtable auth or a broken formula. Hit Refresh; if it persists, the Status or Sent For Approval By field name changed. |
| Legacy Approval records excluded | A task with no raising agent leaked into the queue. The filter broke; do not decide legacy records here. |
| Agents register read | The AI Agents or Team Members read failed, or the Is AI Agent / Active fields were renamed. |
| Daily log read | The AI Agent Daily Log table could not be read; the daily-log lane is blind. |
| Accuracy stats control | Zero approval history matched. On a platform with weeks of decisions, zero means a field rename, not a quiet week. |
| Inbound Comms Response metric fresh | That agent's register row lost its Metric Score. Its runtime stopped publishing; check the triage job. |
| Check zones computed | One or more lanes could not run. Treat those lanes as unknown, never as clear. |
| CEO Briefs table reachable | The CEO Briefs table could not be read, so the Dashboard brief is blind rather than empty. |
| Latest brief is complete | The newest brief is still a 07:30 stub. The 9am robot did not finish it: the money figure and the reasoning are missing. |
| Morning robot ran within the last week | No FINISHED brief in the last six days. The 9am robot has stopped; a run of 07:30 stubs cannot mask this. |
js/ceo-brief.js was deleted.