threshold of them accept. A panel below
the threshold sends the work back to the implementer, once.
The file
The third seat runs through the OpenCode command line tool, which is a path you give it.What a run printed
From one real run of this file. The Codex reviewer accepted. The OpenCode seat, on a free preview model, answered with no decision object in its reply, so it counts as not accepting and the panel records it as a finding. Withthreshold: 1 the change still passed. Set the threshold to two and
the same run would have sent the work back to the implementer.
src/double.mjs:
test/double.test.mjs:
The team’s shape
The reviewers run concurrently, one job each.
threshold is a whole number
from one to the number of reviewers. A panel below the threshold is a
revision request aimed at implement, bounded by maxKickbacks.
Gotchas
- The implementer and every reviewer are different families. Two reviewers in one family are refused too. The point of a panel is a second opinion, and two seats of one model are one opinion twice.
- A reviewer’s decision is its reply, not a file. The panel counts the
JSON decision each reviewer returns, and it takes the first object in the
reply even when prose surrounds it. A reply with no object is a non-acceptance with
the reason recorded, which is what the run above shows for
scope. A reviewer may also write notes in the workspace, and the Codex seat did. - A threshold equal to the reviewer count means unanimity. Set it lower when you want a majority.
- A writing seat can write anywhere the process can. The files above start their Claude and Codex seats with permission prompts off, which is what lets a model write files. Run them in a directory you are willing to let a model change, and give a reviewing seat a read-only mode if its plugin has one.
Source
The file isexamples/teams/threshold-panel.ts. The
teams package page lists every input.