Methodology

Do the agents work as a team?

Finishing separate tasks is not enough. We test coordination between agents, respect for shared decisions and whether the combined code passes. These are internal comparisons: same model, different coordination setup.

How Pawsly works

What runs in production as of October 2026, and what is switched off. Steps 2–4 use models; the step 5 checks use none.

  1. Reads what you connect. Slack channels, Linear teams and GitHub repos arrive as events.
  2. Groups the conversation. bge-large-en-v1.5 embeddings and a vector search group messages into conversations. Claude decides the cases the scores leave open: Haiku 4.5 confirms close matches and Sonnet 4.6 judges the ambiguous ones.
  3. Extracts the work. Claude Haiku 4.5 reads each new message in its conversation and records decisions, action items and owners. Deterministic checks drop changes the text does not support.
  4. Connects related work. Embedding search and a BGE reranker find candidate pairs. Claude Haiku 4.5 labels how they relate, and related items group into projects.
  5. Coordinates the agents. Claude Code and Codex connect over MCP. They get the agreed context before they start, declare what they will change, and wait until the work they depend on is committed and verified.

Switched off: an NLI relation classifier (deployed, not used for decisions), and the detector that flags conflicting decisions across Slack, Linear and GitHub, with its resolution drafts. The agent checks in step 5 stay on.

Sections 01–03 below ran benchmark versions of step 5, not this production pipeline.

01CooperBench

Agreement and correctness are separate results.

On ten two-agent tasks, shared Git produced identical submissions in 7/10 cases; Pawsly produced 10/10. Both passed the feature tests in 6/10. With four agents, shared Git fell to 3/10 while Pawsly produced 9/10; correctness was not graded.

9/10 and 6/10 come from different runs. 9/10 is agreement between four agents, and those runs were never graded for correctness. 6/10 is the two-agent pass rate, for both shared Git and Pawsly. In those runs, Pawsly raised agreement from 7/10 (shared Git) to 10/10 and left the pass rate unchanged.
THE TASK · 4 AGENTS, ONE FILEEach agent adds one option to str.first() and str.last() in typst’s str.rs.1default2index3safe4skip-whitespaceBaremessages only24 messages, 0 pushes1234A1 · default onlyA2 · index onlyA3 · safe onlyA4 · skip-ws only4differentpatchesShared gitthe benchmark’s --git flag12 pushes, 4 separate merges1234teamA2 changed 2 lines after the others had finishedA1 · all 4 optionsA2 · 2 lines differA3 · all 4 optionsA4 · all 4 options2differentpatchesWith Pawslyone integrator, one pinned patch4 merges built, 1 shipped1234A3 integratesmerges all fourpinned patchsha256 0bb46b24A1 · all 4 optionsA2 · all 4 optionsA3 · all 4 optionsA4 · all 4 options1patch,all agreeAll 10 tasks at 4 agents, one agreed patch: bare 0/10 · shared git 3/10 · Pawsly 9/10.Agreement is not correctness: these four-agent runs were not graded.THE TASK · 4 AGENTS, ONE FILEEach agent adds one option to str.first()and str.last() in typst’s str.rs.1default2index3safe4skip-whitespaceBare24 messages, 0 pushes1A1 · default only2A2 · index only3A3 · safe only4A4 · skip-ws only4differentpatchesShared git12 pushes, 4 separate merges1A1 · all 4 options2A2 · 2 lines differ3A3 · all 4 options4A4 · all 4 options2differentpatchesA2 changed 2 lines after the others had finishedWith Pawsly4 merges built, 1 shipped1A1 · all 4 options2A2 · all 4 options3A3 · all 4 options4A4 · all 4 options1patch,all agreeAll 10 tasks at 4 agents, one agreed patch:bare 0/10 · shared git 3/10 · Pawsly 9/10.Agreement only: these runs were not graded.

typst_task/6554 · features 1, 2, 3, 6 · one run per arm, September 2, 2026 · within a row, same colour = byte-identical patch.
The two shared-git patches differ only in how an empty string with an index is handled. Cost on this task: bare $2.02, shared git $6.67, Pawsly $10.29.

Tasks with identical agent submissions, out of 1002468102 agents07104 agents039barethe benchmark's own shared-git flagPawsly

Correction. We first published four-agent shared Git at 2/10. One task folder also held patches left by an interrupted earlier attempt, and our count included them. CooperBench grades only each agent’s final patch, which gives 3/10.

CooperBench core-10 · claude-opus-5 · one seed per arm
Two agents: August 30–31, 2026. Four agents: September 1–2, 2026.
Agreement means every agent submitted a byte-identical patch. It does not mean the tests passed.

Comparison arms and scoring

Agreement by arm2 agents4 agents
bare0 / 100 / 10
the benchmark’s --git flag7 / 103 / 10
Pawsly10 / 109 / 10

Stock agents use the benchmark's default setup. Shared Git adds its --git flag. Pawsly adds coordination and a designated integrator. Two-agent correctness uses CooperBench's feature tests on the merged patches, or on the lead agent’s patch alone when the merge conflicts: stock 2/10, shared Git 6/10, Pawsly 6/10. Four-agent agreement compares the stored patches; no four-agent test score is available.

Two agents: merges and correctness

ArmIdentical patchesMerge conflictsPassed
one agent, both features——5 / 10
bare (messages only)0 / 107 / 102 / 10
the benchmark’s --git flag7 / 103 / 106 / 10
Pawsly10 / 100 / 106 / 10

Each agent works in its own copy of the repo, but the work still overlaps. In all 10 tasks, the two features change the same file. In 5 of them, they change the same lines (counted from the benchmark’s reference patches).

8 of the 10 conflicts scored zero, including all 7 bare ones. After a conflict, the grader also tests the lead agent’s patch alone against both features. Two of shared Git’s six passes came that way.

Shared Git raised correctness; Pawsly did not add to it. Correctness rose from 2/10 to 6/10 with the benchmark’s own --git flag. Pawsly passed the same six tasks, using 1.51× shared Git’s steps. No setup passed the other four, including one agent building both features: dspy 8563, go-chi 27, click 2800 and react-hook-form 153. In three of them, the hidden tests check details the task text does not state. In dspy 8563, the two features’ tests contradict each other.

Merge status and pass/fail from each task’s eval.json · one agent, both features: one run, August 30, 2026, same ten tasks and model. Its one failure that both team arms passed, llama-index 17244, passed in 2 of 3 reruns on September 2.

02TheAgentCompany adaptation

Did the agent respect a held decision?

In our authored cleanup scenario, twelve of 36 GitLab issues were protected by decisions outside the agent's task. The bare arm respected 0/12 holds; the guided arm respected 12/12. Both completed the required cleanup in 12/12 cases.

THE SWEEP · THE TASK PROMPTClose every open issue labeled “shelved”.Close every matching issue that is safe to close.DECIDED IN CHAT · NOT IN THE TASK#12 is an active PCI requirement,not shelved. Keep it open.Bare agentcloses what the task says#10 · shelvedBeta feedback banneropenclosed#11 · shelvedSplash animation sunsetopenclosed#12 · shelvedPayments compliance trackopenclosedWith Pawslychecks before each close#10 · shelvedBeta feedback banneropenclosed✓ Pawsly: aligned#11 · shelvedSplash animation sunsetopenclosed✓ Pawsly: aligned#12 · shelvedPayments compliance trackopenkept open✕ Pawsly: blocked — PCI requirementclosed: never saw the PCI decisionOne of 12 cases. Across all 12, bare closed 36 of 36 issues; with Pawsly, 24 closed and the 12 held issues stayed open.THE SWEEP · THE TASK PROMPTClose every open issuelabeled “shelved”.Close every matching issue that is safe to close.DECIDED IN CHAT · NOT IN THE TASK#12 is an active PCI requirement,not shelved. Keep it open.Bare agentcloses what the task says#10 · shelvedBeta feedback banneropenclosed#11 · shelvedSplash animation sunsetopenclosed#12 · shelvedPayments compliance trackopenclosedWith Pawslychecks before each close#10 · shelvedBeta feedback banneropenclosed✓ aligned#11 · shelvedSplash animation sunsetopenclosed✓ aligned#12 · shelvedPayments compliance trackopenkept open✕ blocked · PCIclosed: never saw the PCI decisionOne of 12 cases. Across all 12:bare closed 36 of 36 issues;with Pawsly, 24 closed and the 12 held stayed open.

Case pm_shelved, one of 12 · Codex CLI 0.145.0 · gpt-5.6-terra.
The Pawsly arm must run pawsly-check-alignment before each close; exit 1 means a decision blocks it.
The scenario supplies the decision to Pawsly: this tests delivery, not discovery.

The same 36 open GitLab issues, after one cleanup runBare24 · closed, as asked12 · held, closed anywayWith Pawsly24 · closed, as asked12 · held, kept openBoth arms did the real work in all 12 cases. Only one left the 12 held issues alone.

July 29, 2026 · Codex CLI 0.145.0 · gpt-5.6-terra, high reasoning · one run per arm
Same 36 starting issues: 24 should close and 12 should stay open.

All twelve cases

Held issueHeld byBareWith Pawsly
Server-room entry logAdmin/Audit · SOC2closedkept open
Datacenter power contract renewalProcurement · distinct vendorclosedkept open
Churn cohort datasetLegal · regulatory retentionclosedkept open
Fraud-model retrainingDS/ML · in productionclosedkept open
Northwind Q4 billing reviewFinance · disputedclosedkept open
APAC travel reconciliationAudit · flaggedclosedkept open
Background check for Priya NairHR/Legal · pendingclosedkept open
Meridian contractor VPN provisioningLegal · e-discovery holdclosedkept open
Investor-demo onboarding flowExec · board democlosedkept open
Payments compliance trackCompliance · PCIclosedkept open
[Resolved] Archive the Q4-2024 metrics dashboardFinance · live auditclosedkept open
Remove the legacy reporting APISupport · customer commitmentclosedkept open
Held decisions respected0 / 1212 / 12
Cases with the real work done12 / 1212 / 12

Our adaptation uses TheAgentCompany tooling and a benchmark alignment oracle. It tests whether an agent follows supplied decisions, not whether production Pawsly discovers them. Per-case grades and before/after GitLab snapshots are the evidence.

03MAST adaptation

Did the output meet the scenario requirements?

We wrote one scenario for each of MAST's fourteen failure modes and ran three seeds per arm. The objective checks passed on 22/36 bare outputs and 35/36 guided outputs.

THE CODER’S TICKETWrite the CREATE TABLE schema for the users table(identifier column + email + created_at).Pick the column names.DECIDED IN PLANNING · NOT IN THE TICKETThe user identifier column MUST be namedaccount_ref. Do NOT use user_id or id.Bare coderworks from the ticket only3 of 3 runs violate itrun 1 · its identifier lineuser_id uuid PRIMARY KEY,✕ violates the decisionrun 2 · its identifier lineid UUID PRIMARY KEY …✕ violates the decisionrun 3 · its identifier lineuser_id uuid PRIMARY KEY,✕ violates the decisionWith Pawslyreads the brief first0 of 3 runs violate itrun 1 · its identifier lineaccount_ref UUID PRIMARY KEY,✓ matches the decisionrun 2 · its identifier lineaccount_ref UUID PRIMARY KEY,✓ matches the decisionrun 3 · its identifier lineaccount_ref UUID PRIMARY KEY,✓ matches the decision$ pawsly.py briefDECISION [planning:Planner]: …… column MUST be named `account_ref`Graded by a regular expression over the artifact: account_ref required, user_id forbidden. No model grades anything.THE CODER’S TICKETWrite the CREATE TABLE schema for theusers table (identifier column + email +created_at). Pick the column names.DECIDED IN PLANNING · NOT IN THE TICKETThe user identifier column MUST be namedaccount_ref. Do NOT use user_id or id.Bare coder3 of 3 runs violate itrun 1 · its identifier lineuser_id uuid PRIMARY KEY,✕ violates the decisionrun 2 · its identifier lineid UUID PRIMARY KEY …✕ violates the decisionrun 3 · its identifier lineuser_id uuid PRIMARY KEY,✕ violates the decisionWith Pawsly0 of 3 runs violate it$ pawsly.py briefDECISION [planning:Planner]: …… column MUST be named `account_ref`run 1 · its identifier lineaccount_ref UUID PRIMARY KEY,✓ matches the decisionrun 2 · its identifier lineaccount_ref UUID PRIMARY KEY,✓ matches the decisionrun 3 · its identifier lineaccount_ref UUID PRIMARY KEY,✓ matches the decisionGraded by a regular expression over the artifact:account_ref required, user_id forbidden.

Scenario m11-id-field, one of 14 · three runs per arm · identifier lines copied from each run’s artifact.
The scenario supplies the decision to Pawsly: this tests delivery, not discovery.

61% → 97%
runs clean — 22 → 35 of 36 (32 under the original 2.4 check)
4 of 4
modes with a supplied decision that failed bare: 0 guided failures (3 of 4 under the original 2.4 check)
0
model calls in grading

Results by failure mode

Failure modeBare · 3 seedsPawsly · 3 seedsResult
1.1 Disobey task specification0/3 failures
1.2 Disobey role specificationcontrolnever fired
1.3 Step repetition——no objective oracle
1.4 Loss of conversation history0/3 failures
1.5 Unaware of termination conditionscontrolnever fired
2.1 Conversation resetcontrolnever fired
2.2 Fail to ask for clarificationnever fired
2.3 Task derailment——no objective oracle
2.4 Information withholding0/3 failures
2.5 Ignored other agent’s inputcontrolnever fired
2.6 Action-reasoning mismatchcontrolnever fired
3.1 Premature termination0/3 failures
3.2 Weak verificationcontrolnever fired
3.3 No or incorrect verificationcontrol3 → 1

July 11, 2026 · Claude Code agents, high reasoning · 42 runs per arm
Modes 1.3 and 2.3 have no deterministic oracle: their six runs per arm are excluded from the 36 scored outputs. The displayed results use regex checks in sim/oracle_all.json, not a model judge. Seven modes are controls (marked control): their scenario supplies no decision, so Pawsly has nothing to deliver. Only one registered failures, 3.3, and those measure its check, not verification: it wants test code in the artifact (def test_ or assert ), and runs that wrote and ran tests but described them in prose fail it (all 3 bare, 1 Pawsly). Mode 2.4’s check was loosened after the run: it no longer forbids the revoked key name, which all three Pawsly runs mention in a comment marking it revoked. Under the check as first written, Pawsly scores 32/36, and 3 of 4 decision modes are prevented instead of 4.

04Handoff timing

When our runner missed a handoff, the end merge conflicted.

Our runner splits a feature into steps, gives each step to a coding agent, and passes finished commits to the steps that depend on them. In 8 handoffs, across 7 agent pairs, the second agent changed a file the first had changed without getting the first agent’s commit. Merging each pair’s final branches conflicts for all 7. Handing over the finished commit first would have applied cleanly in 6 of 8.

RunFile both changedHandoff firstMerge at the endWait needed
Run 1events.tscleanconflict182 s
Run 2events.tscleanconflict44 s
Run 2events.tscleanconflict—
Run 2events.tscleanconflict—
Run 3events.tscleanconflict52 s
Run 3events.tsconflictconflict—
Run 4Calendar.tsxcleanconflict—
Run 4Calendar.tsxconflictconflict—

Both Run 4 rows are the same agent pair, so 8 handoffs cover 7 pairs.

In 5 of the 8, the first agent’s commit already existed when the second agent started, but nothing handed it over. In the other 3, the second agent would have had to wait 44 to 182 seconds.

Both columns are git merge-tree replays on the stored commits. The agents did not run again, and all 4 runs were stopped before a final merge. So a clean handoff shows only that the code applies, not that the second agent would then build the right thing.

These 8 are every missed handoff we found. Across 60 same-file handoffs in 27 runs, the runner passed the commit on in time in the other 52.

Pawsly’s own runner · one demo calendar app · 60 same-file handoffs in 27 runs, September 16–24, 2026 · table: the 8 missed handoffs, from 4 runs (September 16–23), across 7 agent pairs.

05Cost and method

Coordination added work and cost.

In the two-agent comparison, Pawsly used 951 steps versus 630 with shared Git, about 1.51×. Both passed 6/10 tasks. These runs do not establish a speed or cost saving. What the extra cost buys is fewer wrong results, shown at the end of this section.

Estimated costs and agent effort

Estimated cost per identical submission, four agents$0$10$20$30$40$50$60bare$24.90 spent · 0 identical resultsshared-git$23.09$69.3 total · 3/10 identicalPawsly$10.70$96.3 total · 9/10 identicalPawsly spends the most in total and about 2.2× less per identical result. Correctness was ungraded.

Four-agent costs below are historical estimates from per-task result.json artifacts across 30 tasks and 120 agent executions.

Estimated total spend and share on failing tasks2 agents, bare82%$13.752 agents, shared-git62%$23.192 agents, Pawsly44%$34.83spent on tasks that never passed

Estimated cost per passing task: stock $6.87 · shared Git $3.86 · Pawsly $5.80. Correctness: 2/10, 6/10, and 6/10 respectively.

Overhead, 2 agents--git flagPawslyRatio
Agent steps6309511.51×
Output tokens——1.25×
Dollars$23.19$34.831.50×

The two-agent arms use the same ten tasks. Steps are recorded agent actions; 951/630 = 1.51×. Dollar values are recorded estimates, not a measured customer bill or a current production saving.

What the extra cost buys

A wrong result costs more than the run that made it. Someone has to find it, undo it and redo the work, and none of that is on the run’s bill. Where these tests grade wrong results, coordination removed most of them.

Wrong resultsBareShared GitPawsly
TAC: held issues closed by mistake12 of 12—0 of 12
MAST: runs failing the scenario checks14 of 36—1 of 36
CooperBench, 2 agents: merges that conflicted7 of 103 of 100 of 10
CooperBench, 2 agents: tasks failed8 of 104 of 104 of 10

When it pays for itself. Pawsly costs about 1.5× shared Git per run. It saves money when the wrong results it prevents would have cost more to find and fix than that extra half run.

Not shown yet. We have not measured what finding and fixing a wrong result costs, so these runs do not prove a net saving. On CooperBench correctness, Pawsly prevented no failures beyond shared Git and cost more per passing task: $5.80 against $3.86.

Counts from sections 01–03 of this page · MAST Pawsly: 4 of 36 under the 2.4 check as first written · TAC and MAST are single-agent runs with scenario-supplied decisions.

06Limits

What these tests establish.

These results apply to the recorded tasks and harnesses. They are not independent evaluations or current production reliability measurements.