Skip to content

Unattended runs and the morning report

When an assignment fires, nobody may be there: it is two in the morning. That squad is unattended: the assignment’s run and every agent under it. Kedalio treats it differently in two ways, so a night’s work neither waits until morning for a harmless command nor does something you did not allow.

An unattended run may read without asking, on top of its delegation:

  • the engine’s own read tools (Read, Glob, Grep, LS);
  • commands that only read: cd, pwd, ls, cat, head, tail, wc, echo, grep, find;
  • git status, log, diff, show, rev-parse, ls-files, and the listing forms of git branch.

A command made of several parts (cd app && git status | head) passes when every part does. What these commands can do beyond reading (find -exec, find -delete, git log --output) is still asked, unless the delegation allows it. A deny anywhere still wins, and serious requests stay serious.

Anything else is a request, as by day: it climbs to the parents first, then reaches you as a notification. If you do not answer within 30 minutes, it is refused by itself, and the agent is told:

This run is unattended (an assignment’s): nobody is there to answer, and no answer came within 30 minutes, so this is refused. Go on without this action if you can; otherwise stop, and say in your final message what you could not do and why.

A «no» lifts nothing, so a serious request is refused the same way. The brief of every firing also asks the agent to say, at the end, what it did and what is left.

Every morning at 07:30 on your time zone (change the hour from Claude or ChatGPT with kedalio.squad_settings), the server writes the report of everything since the last one:

  • Waiting for you: requests still open;
  • Failed: firings that failed or were missed;
  • Skipped: nobody was there to answer: each request refused by itself, as «… refused by itself after 30 minutes without an answer»;
  • Assignments: each firing, with what it pushed and its summary;
  • Squads touched, Scheduled by agents, notifications Held during the quiet hours;
  • Cost, from the ledger.

The facts are gathered by the server. A short run of a small model (Haiku, through a Claude Code login; no tools, at most $0.50) writes them as prose in your language. With no host, or no prose within fifteen minutes, the facts go out alone.

You get it three ways:

  • a notification, «Morning report»;
  • a line in the diary of your memory: «Morning report: 3 firings, 2 squads, 1 waiting for you, $4.10.»;
  • the card This morning’s report on Today, for a day, when the report has its prose.

Each failed or missed firing also becomes a task («Look at «nightly backup»: it failed»), so it stays on your list until you deal with it. From Claude or ChatGPT, tasks.report reads the report.

  • Quiet hours (from–to, across midnight if you like) hold ordinary notifications and requests until they end; they are counted in the report. Serious requests still arrive, without a sound. The report itself arrives at its hour even inside quiet hours: you chose that hour.
  • The global pause stops new firings (recorded as skipped) and new squads everywhere; squads at work go on unless you stop them all. From Claude or ChatGPT, pause turns it on (and stopAll stops every squad); Today shows a banner while it is on, with Resume.

Both are in System → Preferences: the quiet hours (from, to, or none), the global pause, and the hour of the report. The pause also has Pause and stop all agents. The report’s notification opens Today, which shows this morning’s report when its prose was written (without it, the notification carries the facts), with a History of the earlier ones; it is also in the diary and in tasks.report.

Not built yet: a small model that judges requests for unattended runs.