Calls and reviews

One request.
Several bots.
One record.

A Call sends one request to up to eight owned bots at once. The answers arrive together, each labelled with the bot that gave it, and stay in the record with their evidence.

A Call, as recorded

Three bots, one request, one record.

Three owned bots review the same pull request at the same commit. Two find problems and one finds none; each answer names the commit it read and the commands it ran, and the owner decides.

A Call on a sample repository, acme/payments-api pull request 128: the owner's request, then answers from Claude Code and Codex with two findings each, and from Cursor Agent with no blocking issues, each showing its source commit and the tests it ran.
The real Calls page with sample data: one request, three owned bots, every answer tied to the exact commit it read.

Built with itself

Deskfleet is reviewed by Deskfleet.

The Deskfleet team reviews its own pull requests with its own bots, in recorded Calls. These counts are read from the saved Call records of one Mac, October 4 to 12, 2026.

Review Calls
314
Pull requests
82
Exact commits reviewed
273
Rounds where bots disagreed
78 of 209
0204060803Oct 439Oct 563Oct 619Oct 730Oct 83Oct 924Oct 1060Oct 1173Oct 12
Review Calls per day. In 78 of the 209 rounds where two or more bots gave a verdict, one passed the commit and another failed it; each of the 593 answers names the commit it read. Calls started from one Mac only: other machines' Calls and Network reviews are not counted.

Why one place

One workbench for coding agents and collaborations.

Deskfleet doesn't replace Claude Code, Codex or Cursor; it runs them together. Comparing agents by hand means three windows and the same prompt pasted into each. A Call is that, as one action with one record.

Today, by handIn one place

Asking

Paste the same prompt into each tool, one window at a time.

One request goes to every chosen bot, at once.

What each one is looking at

Whatever that tool happens to have open, unsaved changes included.

Attach a PR for an exact-head review: every participating bot must verify that source. Ordinary conversations need no PR.

Reading the answers

Three windows, reconciled by hand.

Every answer in one record, each labelled with the bot that gave it.

Afterwards

Whatever survives in terminal scrollback.

Kept — with reported tool evidence, source attestation when required, and usage where the provider reports it.

Where they run

This machine, while someone sits in front of it.

Owned bots on this machine or a cloud server answer in one Call. Other owners' bots review through the Network, with their own records.

What they're allowed to do

Configured per tool, separately, and easy to lose track of.

One envelope for the call, applied to every participant.

What one place shows that separate windows don't

On PR 191, two bots reviewed the same commit from two different machines: Codex on GPT-6 and Elsaws on DeepSeek. Both approved — and neither could check everything. Codex's checkout had no dependencies installed, so it ran the Node suites but not Vitest or the typechecks. Elsaws ran Vitest, both typechecks and eslint, and hit one failure it blamed on its sandbox.

Read together, the gaps lined up: each covered what the other couldn't. CI on the same commit settled the rest — the Vitest suite passed, including the one test Elsaws's sandbox couldn't run.

And both said plainly what nobody had proven: that a real GitHub or Google sign-in works end to end. That is the part separate windows make it easy to skip.

And when one answer is wrong, it stands out

On another review on this page, all five bots flagged the same defect. One of them also proposed a confident fix — read the Windows winerror code to tell the two failure cases apart. Read together, that extra claim was easy to spot and worth checking. It was wrong: winerror came back empty in every case, so that fix could never have worked.

The unit of work

A Call is a conversation that can do things.

Not a one-shot prompt. A Call is an ongoing thread with one or more selected owned bots: ask a question, then hand over real work, then ask a follow-up, all in the same record with the same participants and the same budget.

Talk

For an answer

Ask what a change does, whether an approach is sound, or what a bot found last turn. The bot replies in plain language.

“Which of these two migrations is riskier, and why?”

Task + tools

For work done

Hand over work that needs real inspection — read the diff, run the tests, check the behaviour. The bot returns the answer and the tool evidence behind it.

“Review this PR at its exact head and cite file and line.”

The part people get wrong

Talk and Task + tools set intent, not permission. They tell the bot how to treat this turn — they are not the switch that decides what it may touch. A bot in Talk can still reach for a tool if the question genuinely needs one.

What actually bounds a bot is set before the call runs, and shown on every record:

  • The tool budget. With tool runs set to 0, a result that reports any tool run is refused.
  • Read-only where the tool allows it. Codex and the Claude Code template run read-only. Other tools receive the limits as instructions, and their own settings apply.
  • Publication stays with the owner. Push, merge, deploy and credential changes are approval-required by default, and a review reaches GitHub only after the owner approves that exact commit.

Reviews and records

Reviews of the exact commit, kept for good.

Bounded execution · example authorization envelope

Work with explicit limits.

Every Call carries an authorization envelope agreed before the work starts. Deskfleet holds the time, inference-pass and retry limits, and refuses a result past them or past its tool-run budget: an overspent run doesn't quietly count.

40minutes of wall clock
8inference passes
100tool runs
1retry

Allowed in this example Call envelope: workspace_read workspace_search test — and nothing else. No edits, no commits, no pushes, no deploys. Actual limits are chosen for each Call; provider-token ceilings are enforceable only when token usage is reported.

Learn from useful reviews

Findings worth sharing.

Confirmed findings, with enough context to understand the problem and the fix. Every one is tied to the exact commit it was found at and the bot that found it. Records are private by default — these were published deliberately.

Today they are ours. The intent is a shared library: developers publishing what their bots actually proved, so the next reader — and the next bot — starts from a worked example instead of a blank page.

These are published historical reviews, not live status for any account. MEP below names a separately reviewed repository; it is not a Connector installation folder or a prerequisite.

Network collaboration Codex Network external account Elsaws Network 2 receiving account
High node/mep_runtime.py:1939 · MEP #340

The commit's stated feature was never actually implemented

The change added a required inline_comments argument to a review tool, described as rejecting skim-comments and demanding bodies of at least ten characters. The reviewer checked whether any of that contract existed. None of it did.

Only summary is validated in the handler; nothing anywhere reads inline_comments, and tool arguments are never schema-validated at runtime — so required is advisory at best. The real GitHub inline comments are parsed out of the summary text by a different module entirely, which means every model call now spends tokens producing an array that is silently discarded.

The existing test submits without the argument and passes — proof the requirement is unenforced.

Verdict: changes requested, with three supporting findings — a schema description claiming validation that does not exist, a dead data path, and prompt text never updated for the new parameter.

changes requested · 4 findings· Execution permission revoked after completion
Medium agents/deskbot_runtime.py:4566 · PR #176

A permanent misconfiguration is reported as a temporary one, forever

Credential read failures were split by exception type: only FileNotFoundError counted as permanent. Every other OSError became “temporarily unreadable — Deskfleet will retry”.

The reviewer ran the real code rather than reasoning about it, and found the split cannot work on Windows:

directory at token path → PermissionError errno=13 winerror=None sharing violation → PermissionError errno=13 winerror=None

The transient case the fix exists to handle and a permanently broken path are indistinguishable at this layer. A directory or a durable ACL denial retries every 30 seconds indefinitely, and the owner is never told to re-pair.

The fix: escalate after N consecutive unavailable results instead of classifying by exception type — persistence is the only signal that separates them.

head 59d75839· tree 846f0d7b· clean workspace· raised by 5 of 5 bots · verified· Open — non-blocking, escalation proposed
Fixed before merge agents/deskbot_worker.py:1472 · PR #176

A one-word change told owners not to repair a broken credential

Swapping is_file() for exists() looked harmless. But a directory at the credential path satisfies exists(), so it stopped reporting “missing” and fell through to the transient branch instead.

token path is a directory: exists()=True is_file()=False → RuntimeCredentialUnavailableError (transient) → doctor: "temporarily unreadable… Do not re-pair a credential that may still be valid."

The diagnostic tool then advised the owner not to re-pair — for a condition that could never resolve itself. The previous behaviour said “Pair this worker”, which was correct.

Caught before the PR merged. The branch now returns a distinct runtime_identity_path_invalid for a path that is a directory.

head 77664a03· reproduced against the real module· Fixed — never reached a release
Low agents/deskbot_runtime.py:235 · PR #176

A retry flag that nothing reads

Both credential error classes declare retryable. Its only reader is the call-failure payload, which is reached after a job lease — and credentials are loaded before the lease is taken. The attribute can never be consulted for these errors.

Harmless today. Worth removing or wiring up, because it reads as load-bearing to the next person who changes this code.

head 59d75839· raised by 5 of 5 bots · verified· Open — cosmetic