@prplkane/roundtable 0.0.0-stage → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +529 -0
- package/LICENSE +21 -0
- package/README.md +189 -3
- package/SECURITY.md +299 -0
- package/docs/workflow.md +1344 -0
- package/package.json +52 -6
- package/scripts/agent.mjs +40 -0
- package/scripts/export.mjs +20 -0
- package/scripts/mcp.mjs +175 -0
- package/scripts/run-debate.mjs +70 -0
- package/scripts/server.mjs +28 -0
- package/scripts/setup.mjs +182 -0
- package/skills/roundtable/SKILL.md +57 -0
- package/src/adapters/agy.js +7 -0
- package/src/adapters/catalogue.js +49 -0
- package/src/adapters/claude.js +6 -0
- package/src/adapters/codex.js +6 -0
- package/src/adapters/common.js +304 -0
- package/src/adapters/config.js +432 -0
- package/src/adapters/endpoint.js +178 -0
- package/src/adapters/errors.js +69 -0
- package/src/adapters/index.js +11 -0
- package/src/adapters/models.js +106 -0
- package/src/adapters/quota.js +305 -0
- package/src/adapters/spawn.js +178 -0
- package/src/agent-client.js +108 -0
- package/src/cli.js +44 -0
- package/src/contract.js +256 -0
- package/src/diagnostics.js +133 -0
- package/src/doctor.js +101 -0
- package/src/engine.js +902 -0
- package/src/estimate.js +331 -0
- package/src/export.js +307 -0
- package/src/fake.js +75 -0
- package/src/folder-picker.js +46 -0
- package/src/history.js +220 -0
- package/src/local-http.js +39 -0
- package/src/local-server.js +110 -0
- package/src/notes.js +16 -0
- package/src/personas.js +49 -0
- package/src/preflight.js +126 -0
- package/src/progress.js +30 -0
- package/src/prompts.js +278 -0
- package/src/research.js +113 -0
- package/src/review-view.js +157 -0
- package/src/seats.js +272 -0
- package/src/server.js +928 -0
- package/src/settings.js +27 -0
- package/src/setup-toml.js +124 -0
- package/src/snapshot.js +93 -0
- package/src/store.js +303 -0
- package/src/terminal.js +77 -0
- package/src/terms.js +52 -0
- package/src/ui/app.js +1967 -0
- package/src/ui/avatars.js +132 -0
- package/src/ui/ceremony.js +87 -0
- package/src/ui/design/app.css +714 -0
- package/src/ui/design/preset-dusk.css +91 -0
- package/src/ui/design/tokens.css +129 -0
- package/src/ui/diagnostics.js +61 -0
- package/src/ui/help.js +122 -0
- package/src/ui/icons.js +64 -0
- package/src/ui/index.html +272 -0
- package/src/ui/loader.js +73 -0
- package/src/ui/logo.svg +4 -0
- package/src/ui/scan.js +57 -0
- package/src/ui/scribe.js +64 -0
- package/src/ui/sound.js +80 -0
- package/src/validate.js +112 -0
- package/src/version.js +5 -0
package/docs/workflow.md
ADDED
|
@@ -0,0 +1,1344 @@
|
|
|
1
|
+
# Using Roundtable
|
|
2
|
+
|
|
3
|
+
Set up providers, run a review, and export a decision record. For data handling and the
|
|
4
|
+
limits of the security controls, see [SECURITY.md](../SECURITY.md).
|
|
5
|
+
|
|
6
|
+
Export into a dedicated project folder. Aliases to protected directories and linked record
|
|
7
|
+
or index files are refused; a refusal leaves the destination's existing contents intact.
|
|
8
|
+
|
|
9
|
+
API endpoints receive the credential you configure. Known echoes of that credential are
|
|
10
|
+
removed from new replies and errors before saving; this cannot prevent a chosen endpoint
|
|
11
|
+
from retaining or deliberately encoding it. Older records are not automatically edited.
|
|
12
|
+
|
|
13
|
+
Replies and discussion notes reach later seats as quoted input records identified by source
|
|
14
|
+
and round. Their original wording is retained. Duplicate contract headers trigger the normal
|
|
15
|
+
format correction; ordinary Markdown inside a reply is allowed. Quoting does not guarantee
|
|
16
|
+
that a model will ignore misleading instructions in another seat's content.
|
|
17
|
+
|
|
18
|
+
## 1. What you need
|
|
19
|
+
|
|
20
|
+
- **Node 22 or newer.** Check with `node --version`.
|
|
21
|
+
- **At least one supported CLI**, logged in with your subscription. CLI seats use that login;
|
|
22
|
+
they do not need an API key. OpenAI-compatible endpoints are optional and use their own
|
|
23
|
+
credentials and billing (section 7b).
|
|
24
|
+
- **A browser**, for the board. Any modern one.
|
|
25
|
+
|
|
26
|
+
Get the code and check it runs:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
git clone https://github.com/prplkane/roundtable.git
|
|
30
|
+
cd roundtable
|
|
31
|
+
npm test
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
There are no dependencies to install.
|
|
35
|
+
|
|
36
|
+
### Connect an assistant for every project
|
|
37
|
+
|
|
38
|
+
Install once with `npm install -g @prplkane/roundtable`, then run
|
|
39
|
+
`roundtable setup --client codex`. To install a local checkout, run `npm pack`, then
|
|
40
|
+
`npm install -g` with the generated `.tgz` filename. Install the archive, since
|
|
41
|
+
`npm install -g .` can create a link to the checkout that breaks when it moves.
|
|
42
|
+
Setup points at the installed package, not the project where you next ask for a review.
|
|
43
|
+
|
|
44
|
+
Choose `--client claude`, `--client agy`, repeat `--client`, or use `--client all` to connect
|
|
45
|
+
all three. This explicitly installs a user-level MCP connection and the bundled Roundtable
|
|
46
|
+
skill. No npm install hook changes assistant settings. Restart the assistant or reload its
|
|
47
|
+
MCP connections after setup, then ask it to use Roundtable from any project.
|
|
48
|
+
|
|
49
|
+
| Assistant | MCP configuration | Workflow skill |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| Codex | `~/.codex/config.toml` | `~/.codex/skills/roundtable/SKILL.md` |
|
|
52
|
+
| Claude Code | `~/.claude.json` | `~/.claude/skills/roundtable/SKILL.md` |
|
|
53
|
+
| Antigravity app / CLI | `~/.gemini/config/mcp_config.json` | `~/.gemini/config/skills/roundtable/SKILL.md` |
|
|
54
|
+
|
|
55
|
+
Codex uses `CODEX_HOME` when set. Claude uses `CLAUDE_CONFIG_DIR` when set, with
|
|
56
|
+
`.claude.json` and `skills/roundtable/SKILL.md` inside that directory. `--home <directory>`
|
|
57
|
+
selects an isolated test home and ignores both overrides. Antigravity's current app, CLI and
|
|
58
|
+
IDE use the [shared configuration directory](https://antigravity.google/docs/mcp);
|
|
59
|
+
the presence of an older `~/.gemini/antigravity/mcp_config.json` does not select it.
|
|
60
|
+
For an older IDE, check the path shown by its MCP manager before configuring it manually.
|
|
61
|
+
Setup preserves unrelated settings and comments in Codex's TOML, including dotted and
|
|
62
|
+
quoted keys and multiline strings. It refuses an existing unmanaged Roundtable entry,
|
|
63
|
+
an edited managed entry or skill,
|
|
64
|
+
invalid configuration JSON, and linked configuration files. Resolve a conflict explicitly;
|
|
65
|
+
setup does not overwrite custom edits. A private receipt under `~/.roundtable/integrations.json`
|
|
66
|
+
records paths and hashes for checking, updating and removal. No configuration contents or
|
|
67
|
+
credentials are copied into it. Missing managed files can be repaired by rerunning setup,
|
|
68
|
+
or removed with `--remove`; present files with custom edits remain protected.
|
|
69
|
+
Rerun setup after a package update to refresh the skill. Changing a profile override requires
|
|
70
|
+
removing the old managed connection with its original profile first.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
roundtable setup --client all --check
|
|
74
|
+
roundtable setup --client codex --remove
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`--check` reads the installed files and verifies their recorded hashes, MCP script and Node executable;
|
|
78
|
+
it makes no model call. To test without a provider, use `--fake` with setup, or run
|
|
79
|
+
`roundtable mcp --fake`. This uses the separate demo board on port 4748. Updates preserve
|
|
80
|
+
the saved mode and port. Use setup's `--live` to switch explicitly to live port 4747, or
|
|
81
|
+
`--fake` to switch to demo port 4748. `--port N` selects another
|
|
82
|
+
loopback port; `roundtable mcp --no-start` requires an already running board. Every server
|
|
83
|
+
needs its own data directory when more than one runs in the same mode (see Local data).
|
|
84
|
+
|
|
85
|
+
The MCP adapter starts the board in the background when a tool needs it and leaves it
|
|
86
|
+
running when a chat disconnects, so question timers and reviews continue. Starting the board
|
|
87
|
+
checks provider status but starts no review. It never opens the browser. Use the returned
|
|
88
|
+
board link to view or stop a review. The existing loopback token protects writes, and the
|
|
89
|
+
adapter never prints it. Normal review content is returned to the assistant that invoked it.
|
|
90
|
+
An unrelated service, incompatible API, different package version or wrong demo/live mode
|
|
91
|
+
on the selected port is refused. An explicit `ROUNDTABLE_DEBATES_DIR` must match the running
|
|
92
|
+
board. A lightweight health endpoint checks this without waiting for provider catalogues;
|
|
93
|
+
temporary readiness failures are retried within 35 seconds, without retrying review writes.
|
|
94
|
+
Configure the host's tool timeout to at least 90 seconds if it supports that setting:
|
|
95
|
+
a wait can include two bounded state reads as well as the requested event wait.
|
|
96
|
+
|
|
97
|
+
If an assistant says Roundtable is unavailable, run setup's `--check`, reload its connections,
|
|
98
|
+
and confirm `roundtable_guide` appears among its tools. The installed skill also explains the
|
|
99
|
+
`roundtable agent` CLI fallback. The repository's `AGENTS.md` does not install anything in
|
|
100
|
+
other projects. Do not substitute ordinary subagents and call their result a Roundtable review.
|
|
101
|
+
|
|
102
|
+
After an update, finish active reviews, run `roundtable server restart` (add `--fake` or
|
|
103
|
+
`--port N` for that board), reload the assistant's MCP connection and refresh the browser.
|
|
104
|
+
`roundtable server status` inspects the board; `stop` stops it. Stop/restart requires the
|
|
105
|
+
launch token and matching server instance, and refuses active reviews or other writes.
|
|
106
|
+
It never cancels a review to perform an update. Older boards without the health API must be
|
|
107
|
+
stopped from their original terminal with Ctrl+C, or by stopping their known server process.
|
|
108
|
+
Refreshing the browser alone does not reload server code.
|
|
109
|
+
|
|
110
|
+
### First connection on Linux
|
|
111
|
+
|
|
112
|
+
Run these steps as the user who runs your assistant. Setup is once per machine and assistant
|
|
113
|
+
profile, not once per project. Roundtable has no separate account or login.
|
|
114
|
+
|
|
115
|
+
1. Check `node --version` and `npm --version`. Node must be 22 or newer.
|
|
116
|
+
2. Install Roundtable globally:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npm install -g @prplkane/roundtable
|
|
120
|
+
roundtable --help
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
This installs a copy; no checkout is required. For a source snapshot before its npm release,
|
|
124
|
+
use `npm install -g https://github.com/prplkane/roundtable/archive/refs/heads/main.tar.gz`.
|
|
125
|
+
If `roundtable` is not found, add the
|
|
126
|
+
`bin` directory under `npm prefix -g` to your shell's `PATH`. Use a user-owned Node/npm
|
|
127
|
+
installation; run assistant setup as your ordinary user.
|
|
128
|
+
3. Install and sign in to the providers you want to seat, using section 2. For Codex:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npm install -g @openai/codex
|
|
132
|
+
codex login
|
|
133
|
+
roundtable doctor
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Finish the browser login. One provider is enough for multiple seats. Doctor checks
|
|
137
|
+
setup without a model call; `--live` additionally makes probe calls.
|
|
138
|
+
4. Register the connection and skill for your assistant:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
roundtable setup --client codex
|
|
142
|
+
roundtable setup --client codex --check
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Replace `codex` with `claude` or `agy`, or use `all`. The check should report
|
|
146
|
+
`"ok": true` and `"connected": true` for the selected client. It verifies files and
|
|
147
|
+
executable paths; the assistant must still load the connection.
|
|
148
|
+
5. Restart the assistant or reload its MCP connections. For Codex, run `codex mcp list`,
|
|
149
|
+
then open Codex in any project and use `/mcp` to check that Roundtable is available.
|
|
150
|
+
Ask it to call `roundtable_guide` and `roundtable_status` without starting a review.
|
|
151
|
+
6. Ask for a first review: "Use Roundtable with two seats and one critique round to review
|
|
152
|
+
this decision. Ask me questions when needed, auto-continue if I do not answer, and wait
|
|
153
|
+
for the chairman." Include your decision, alternatives and constraints.
|
|
154
|
+
|
|
155
|
+
Setup writes the installed Node and MCP script paths into the assistant's user configuration
|
|
156
|
+
and copies the workflow skill. On reload, the assistant launches that script and discovers
|
|
157
|
+
the 11 tools over stdio. The first tool that needs the board starts it locally in the background
|
|
158
|
+
on port 4747. Roundtable invokes the provider CLIs with their existing logins only when the
|
|
159
|
+
requested action needs them. There is no Roundtable cloud connection or API key to enter.
|
|
160
|
+
Keep the provider CLI executables on the assistant's `PATH`; after changing a Node version or
|
|
161
|
+
moving its installation, rerun setup and reload the assistant.
|
|
162
|
+
|
|
163
|
+
Some assistants run commands in a sandbox that forbids opening a local port. A `roundtable`
|
|
164
|
+
command run inside such a shell cannot start the board: it dies with `listen EPERM
|
|
165
|
+
127.0.0.1:4747`, and the command reports that line. Codex on Linux has shown this. Check
|
|
166
|
+
first that the MCP connection itself is loaded (`codex mcp list`, then `/mcp` in Codex), since
|
|
167
|
+
the MCP tools are started by the assistant rather than by its sandboxed shell. If the tools
|
|
168
|
+
still cannot start the board, start it once from a normal terminal:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
roundtable server start
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
It keeps running in the background and `roundtable server status` shows it; the tools then
|
|
175
|
+
only connect to it. Stop it with `roundtable server stop` when no review is active. If a tool
|
|
176
|
+
still cannot reach a board that is running, that sandbox blocks loopback connections too, and
|
|
177
|
+
the assistant cannot use Roundtable from inside it; report it as an issue with the assistant,
|
|
178
|
+
version and OS.
|
|
179
|
+
|
|
180
|
+
To check the workflow without a provider account, use `roundtable setup --client codex --fake`
|
|
181
|
+
before restarting the assistant and request a scripted demo review. This uses port 4748 and
|
|
182
|
+
makes no model calls. Switch back with `roundtable setup --client codex --live` and reload again.
|
|
183
|
+
The browser is optional for MCP: open `http://localhost:4747` after a live tool has started
|
|
184
|
+
the board, or run `roundtable fake` for a foreground demo. If the board is already running in
|
|
185
|
+
the background, open its URL instead of starting a second server.
|
|
186
|
+
|
|
187
|
+
Foreground board startup and top-level help show the app's pixel logo tile in orchid, with
|
|
188
|
+
the wordmark, a blinking block cursor and the installed version beside it. The tile is drawn
|
|
189
|
+
with half-block characters, so it needs a UTF-8 terminal; other locales, and
|
|
190
|
+
`ROUNDTABLE_ASCII=1`, get the wordmark alone. Startup then lists the provider CLIs found on
|
|
191
|
+
`PATH`, each in its seat color; `roundtable doctor` names the missing ones in one line.
|
|
192
|
+
Narrow terminals use a short title, `NO_COLOR=1` removes color, and redirected output, CI,
|
|
193
|
+
`TERM=dumb`, MCP and JSON commands omit the decoration.
|
|
194
|
+
|
|
195
|
+
## 2. Install and log in to each vendor
|
|
196
|
+
|
|
197
|
+
Seat only the vendors you have a subscription for. One vendor is enough: you can seat it
|
|
198
|
+
several times.
|
|
199
|
+
|
|
200
|
+
### Provider availability and network access
|
|
201
|
+
|
|
202
|
+
Some vendors, products or models are unavailable in certain regions or account plans.
|
|
203
|
+
Check the vendor's current requirements for the service you use:
|
|
204
|
+
|
|
205
|
+
- **OpenAI:** [ChatGPT supported countries](https://help.openai.com/en/articles/7947663-chatgpt-supported-countries)
|
|
206
|
+
for a ChatGPT login, or [API supported countries](https://help.openai.com/en/articles/5347006-openai-api-supported-countries-and-territories)
|
|
207
|
+
for an OpenAI API endpoint.
|
|
208
|
+
- **Anthropic:** [supported regions](https://www.anthropic.com/supported-countries).
|
|
209
|
+
- **Google Antigravity:** [geographical availability in the FAQ](https://antigravity.google/docs/faq).
|
|
210
|
+
|
|
211
|
+
Choose a provider available to your account and region. A supported location and successful
|
|
212
|
+
login do not guarantee reliable replies: local networks, proxies, VPN settings or regional
|
|
213
|
+
provider infrastructure can still interrupt a connection. A route-specific failure alone
|
|
214
|
+
does not establish an intentional regional or IP restriction.
|
|
215
|
+
|
|
216
|
+
Roundtable leaves your VPN, proxy and DNS configuration unchanged. For repeated stalls, use
|
|
217
|
+
the [connection checks](#regional-availability-and-stalled-connections) below.
|
|
218
|
+
|
|
219
|
+
### Claude (Anthropic)
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
npm install -g @anthropic-ai/claude-code
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
On Windows you can use `winget install Anthropic.ClaudeCode` instead. Then log in once:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
claude
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Inside the program, type `/login`, finish the sign-in in the browser, then exit with `/exit`.
|
|
232
|
+
|
|
233
|
+
Roundtable reads Claude's remaining quota with `claude -p /usage`, which the CLI answers itself,
|
|
234
|
+
with no model call and no conversation. It reads when the server starts, on **Refresh status**,
|
|
235
|
+
after each Claude reply and when a debate ends, from an empty folder with a seat's lockdown
|
|
236
|
+
(no tools, no MCP servers, safe mode) but with slash commands on, which `/usage` needs. Only the session, weekly and per-model weekly limit lines are kept; the activity summary
|
|
237
|
+
the same answer prints (requests, sessions, skills, MCP servers) is discarded and never saved.
|
|
238
|
+
If a proven-free read has no limit lines, the last known figure or a reply's quota is kept;
|
|
239
|
+
the next normal read can recover without restarting. Missing limits do not establish the
|
|
240
|
+
account's billing method or login state. If no figure is available, the card says **quota unavailable**.
|
|
241
|
+
If an answer is not proven to be a local command with no turn, tokens or cost, or the read
|
|
242
|
+
gets no answer within 30 seconds, Roundtable stops reading Claude quota until the server
|
|
243
|
+
restarts and says so on the console.
|
|
244
|
+
|
|
245
|
+
### Codex (OpenAI)
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npm install -g @openai/codex
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
codex login
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
A browser opens. Sign in with the ChatGPT account that holds your subscription.
|
|
256
|
+
|
|
257
|
+
### Antigravity (Google)
|
|
258
|
+
|
|
259
|
+
**Read this first: your Google account.** Google's
|
|
260
|
+
[Antigravity FAQ](https://antigravity.google/docs/faq) describes headless `agy -p` as meant
|
|
261
|
+
"for direct scripting and CI workflows". It says wrapping `agy` inside third-party coding
|
|
262
|
+
agents or applications is not supported under consumer plans, and that using third-party
|
|
263
|
+
software to access Antigravity violates its Terms of Service and can lead to suspension or
|
|
264
|
+
termination of the account. Roundtable is a third-party application that runs `agy -p` for
|
|
265
|
+
each Antigravity seat, chairman and searcher, and reads `agy models`, `/usage` and `/credits`
|
|
266
|
+
for the board. It cannot tell which plan a login is on. Decide whether that suits your
|
|
267
|
+
account before you continue; Claude, Codex or an API endpoint can take every role instead.
|
|
268
|
+
|
|
269
|
+
So nothing is sent to `agy` until you acknowledge this:
|
|
270
|
+
|
|
271
|
+
- **On the board**, a card set to Antigravity says **Account risk: read before using
|
|
272
|
+
Antigravity**. It opens the notice; **I understand, use it** records your acknowledgment
|
|
273
|
+
in the data folder (`_terms.json`), once for every board and later starts. Until then the
|
|
274
|
+
card's lamp reads **held**, **Open the table** opens the notice instead of the table, and
|
|
275
|
+
the server reads neither Antigravity's model list nor its quota. The same notice, opened
|
|
276
|
+
again from **Account risk acknowledged · review**, has **Withdraw**: no new background read
|
|
277
|
+
starts, and a review already running keeps its calls. When Google's wording is checked
|
|
278
|
+
again and the notice changes, the board asks again.
|
|
279
|
+
- **An agent request** must send `options.acknowledgeTermsRisk: true` whenever a seat, the
|
|
280
|
+
chairman or the searcher is on Antigravity, and only once the person has agreed. An
|
|
281
|
+
acknowledgment on the board does not answer for an agent; the agent cannot record one
|
|
282
|
+
either. `roundtable agent status` shows the notice and its link under `providers[].terms`.
|
|
283
|
+
Without the option, a live server refuses the request, and the Antigravity adapter refuses
|
|
284
|
+
any call made without it.
|
|
285
|
+
- **The diagnostic command** sends nothing to `agy` without `--acknowledge-terms-risk`: no
|
|
286
|
+
model list, no quota read, no live call. Only `agy --version` still runs.
|
|
287
|
+
|
|
288
|
+
A review saved before this notice existed can be resumed once the board has acknowledged it.
|
|
289
|
+
The demo shows and asks the same and records the answer in the demo folder; it calls nothing.
|
|
290
|
+
|
|
291
|
+
Antigravity cannot be fully sealed off: it still loads your shared Antigravity customizations
|
|
292
|
+
and discovers your MCP servers, and its web search cannot be switched off. Roundtable denies
|
|
293
|
+
its file, command, URL and MCP tools and stops the call, without a retry, at the first tool it
|
|
294
|
+
reports. A seat, chairman or searcher card set to Antigravity has a compact **Warnings** control
|
|
295
|
+
(**Review required** before the terms acknowledgment). Expand it to read **Limited isolation**
|
|
296
|
+
and the account notice; choosing Antigravity accepts limited isolation. An agent request must send
|
|
297
|
+
`options.allowLimitedIsolation: true` (also in `roundtable agent --help`), or the server
|
|
298
|
+
refuses Antigravity. Use another provider if that is unsuitable. Claude and Codex require their isolation flags to be supported;
|
|
299
|
+
an older CLI fails with an update instruction instead of a weaker fallback.
|
|
300
|
+
Invalid, incomplete or oversized provider streams also stop that seat for the review;
|
|
301
|
+
reported spending is retained, and the failed session is not reused.
|
|
302
|
+
The optional live diagnostic command uses the separate `--allow-limited-isolation` flag
|
|
303
|
+
for the same consent; without it, `doctor --live` skips Antigravity's model call.
|
|
304
|
+
|
|
305
|
+
The `agy` command comes with the Antigravity IDE. Install the IDE and sign in there. If `agy`
|
|
306
|
+
is not found in a terminal afterwards, let it set up your PATH:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
agy install
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Run `agy --version` to check that the command is available. Roundtable uses `agy` for the
|
|
313
|
+
Google seat.
|
|
314
|
+
|
|
315
|
+
Roundtable reads Antigravity's remaining quota with `agy -p /usage`, which the CLI answers
|
|
316
|
+
itself, with no model call and no conversation (agy 1.1.11 or later), and only once its terms
|
|
317
|
+
notice is acknowledged (above). It reads when the server
|
|
318
|
+
starts, on **Refresh status**, after each Antigravity reply and when a debate ends. A read that
|
|
319
|
+
gives no answer within 30 seconds counts as a timeout. The limits come per model group (Gemini;
|
|
320
|
+
Claude and GPT; Gemini 4 Argon on some plans), each with a weekly window and usually a 5-hour
|
|
321
|
+
one, and a seat counts only the group its model draws on. A seat on the default model counts
|
|
322
|
+
every group. If an answer ever shows a turn, tokens or a conversation, or the read times out,
|
|
323
|
+
Roundtable stops reading Antigravity quota until the server restarts and says so on the console.
|
|
324
|
+
With a successful read it also asks `agy -p /credits`, at most every ten minutes, for the AI
|
|
325
|
+
credits that take over once a group's limits are used up; the usage table shows them as
|
|
326
|
+
"AI credits left". The same check and stop apply to that answer.
|
|
327
|
+
The same groups decide who sits out when a call reports a used-up quota during a debate: only
|
|
328
|
+
the seats whose model draws on that group are skipped, and the others keep answering. A seat
|
|
329
|
+
on the default model, or a CLI that is logged out, takes the whole Antigravity login out.
|
|
330
|
+
|
|
331
|
+
### Check what this machine can seat
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
npm run doctor
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
For each vendor it prints where the CLI was found, its version, the models and thinking levels
|
|
338
|
+
you can pick, and the remaining quota where the vendor reports one. Nothing is spent, but this
|
|
339
|
+
does not test whether a model reply can complete over your current connection. To also check
|
|
340
|
+
each available CLI with one tiny model call, add `--live` (this uses provider quota):
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
npm run doctor -- --live
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Antigravity's model list, quota and live call stay **held** in this output until you add
|
|
347
|
+
`--acknowledge-terms-risk`, which is the same acknowledgment as on the board (see the
|
|
348
|
+
Antigravity notice above); its live call also needs `--allow-limited-isolation`.
|
|
349
|
+
|
|
350
|
+
A vendor that says "logged in NO" needs the login step above again.
|
|
351
|
+
|
|
352
|
+
## 3. Open the board
|
|
353
|
+
|
|
354
|
+
The board is a web page served by a small local server. Its assets load locally. Live debates
|
|
355
|
+
send field notes and relevant replies through the CLIs or API endpoints you selected.
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
npm start -- --no-open
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Open http://localhost:4747. This is the normal launch command for a local checkout. Omit
|
|
362
|
+
`-- --no-open` to open the browser automatically from an interactive terminal. Stop the
|
|
363
|
+
server with Ctrl+C in that terminal; any CLI it started is stopped with it. Once the package
|
|
364
|
+
is published to npm, `npx @prplkane/roundtable` will start it without a clone.
|
|
365
|
+
|
|
366
|
+
**Try it first without spending anything.** The fake board runs the same screens with scripted
|
|
367
|
+
seats:
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
npm run fake -- --no-open
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Open http://localhost:4748. The header and notice say **Demo**: replies and usage are scripted,
|
|
374
|
+
with no model calls. The normal server says **Live** and uses the selected providers' quota
|
|
375
|
+
or billing. Use the demo to learn the flow and show the tool to someone.
|
|
376
|
+
|
|
377
|
+
To use another port, set `PORT` before starting, for example
|
|
378
|
+
`PORT=5000 npm start -- --no-open` (PowerShell: set `$env:PORT='5000'`, then run the normal
|
|
379
|
+
launch command). An existing `PORT` value also overrides the demo port. The startup terminal
|
|
380
|
+
prints the actual address, mode and data folder. **Local data and backups** on the setup screen
|
|
381
|
+
shows the same folder and links to this guide.
|
|
382
|
+
|
|
383
|
+
The first screen lists the debates on this machine, newest first: whether each is live,
|
|
384
|
+
interrupted or finished, what was recommended or accepted, and its size and cost. Click one to
|
|
385
|
+
open its board; **Debates** in the header brings you back, and the browser's Back button works
|
|
386
|
+
too. Each board has its own address, so you can bookmark it. Below the list is a new debate; the
|
|
387
|
+
bar at the bottom shows how many calls and tokens the table you are setting up is projected to
|
|
388
|
+
take, next to **Open the table**.
|
|
389
|
+
|
|
390
|
+
### A first live test drive
|
|
391
|
+
|
|
392
|
+
1. Run `npm run doctor`, then start the live board and check that its header says **Live**.
|
|
393
|
+
Use **Refresh status** and resolve any login or installation errors first.
|
|
394
|
+
2. Use a small, non-sensitive decision with two clear options. Choose two seats with different
|
|
395
|
+
lenses. For the first run, use a provider you have already verified; both seats may use it.
|
|
396
|
+
3. Choose a modest model and low effort, **zero critique rounds**, **stateless** memory and a
|
|
397
|
+
**10-minute** wall clock. Set a token cap with room for two initial replies and the verdict.
|
|
398
|
+
The cap is an admission check, not a billing guarantee. Zero critique rounds still makes
|
|
399
|
+
those three calls, plus any retry.
|
|
400
|
+
4. Open the table, read both positions, add a short note at the human gate and continue to the
|
|
401
|
+
verdict. Accept or override the recommendation, then reload and check the saved decision.
|
|
402
|
+
5. Create an empty folder and export into it. In a separate demo review, try Stop and restart/recovery.
|
|
403
|
+
Use **Save error log** if anything fails, and note the last action you took.
|
|
404
|
+
|
|
405
|
+
The stabilization pass included a live Claude Sonnet review at low effort. Other providers
|
|
406
|
+
have offline test coverage and should get their own small live trial before a larger review.
|
|
407
|
+
|
|
408
|
+
## 4. Run a debate
|
|
409
|
+
|
|
410
|
+
### Write the field notes
|
|
411
|
+
|
|
412
|
+
Fill in:
|
|
413
|
+
|
|
414
|
+
- **Decision**: one question, answerable.
|
|
415
|
+
- **Options**: at least two, one chip each. Press Enter in a chip to add the next, Backspace in
|
|
416
|
+
an empty one to remove it. Each is numbered (opt-1, opt-2) as the seats will see it; a seat may
|
|
417
|
+
still propose its own, written as "other: …".
|
|
418
|
+
- **Constraints**: what any answer must live within.
|
|
419
|
+
- **More context** (folded; its title counts the fields you filled): evidence known, evidence assumed,
|
|
420
|
+
reversibility, deadline, and **Export to**, a folder in your codebase where the decision record
|
|
421
|
+
is written the moment the verdict is ready (see step 6). Seats see only these notes in round 0,
|
|
422
|
+
so include the facts they need to assess the options.
|
|
423
|
+
|
|
424
|
+
### Seat the agents
|
|
425
|
+
|
|
426
|
+
Each card is one seat, an independent agent with its own session. Click any value on a card to
|
|
427
|
+
change it. The card's colour is its vendor's; the small picture shows its mood; the round lamp
|
|
428
|
+
says what is known about its quota (green ready, yellow nearly used, red used up, grey not
|
|
429
|
+
checked yet).
|
|
430
|
+
|
|
431
|
+
| field | what it does |
|
|
432
|
+
|---|---|
|
|
433
|
+
| Vendor | Claude, Codex or Antigravity, or **API endpoint** (section 7b). Pick the same vendor more than once if you like. Next to it, a tag says what kind of seat it is: `CLI · subscription`, `API · local` or `API · pay-per-token`. |
|
|
434
|
+
| Lens | The angle this seat argues from, for example "risk", "cost", "the clinician". Must be unique: it is the only name the other seats ever see. |
|
|
435
|
+
| Mood | How it argues. `grill` (the default) attacks assumptions and demands evidence. `steelman` states each option at its best first. `builder` judges by what it takes to ship. `contrarian` takes the least popular side. `custom` takes your own sentence. |
|
|
436
|
+
| Model | Under the vendor name on the card, with stronger model families first. Names carry only **default** and **lightest** notes; the CLI decides model access. This is a broad capability order, not a benchmark comparison across vendors. Antigravity lists each model once and its effort pips choose the variant. **Custom model ID…** opens a text field and keeps your selection while you edit; enter an ID or choose a listed model before starting. Terra requires Codex CLI 0.159 or later. A retired model is refused with what to use instead. |
|
|
437
|
+
| Effort | The thinking level, as pips: click one to set it, click the last filled one again for the CLI's default. Higher thinks longer and draws more. |
|
|
438
|
+
| Login profile | Behind "Login profile" on the card. Leave empty to use your normal login; fill in only to seat a second account of the same CLI (step 7). |
|
|
439
|
+
|
|
440
|
+
First use starts with **two seats and one critique round**: normally two blind replies, two
|
|
441
|
+
critique replies and one verdict, before any retries. The first status check prefers ready
|
|
442
|
+
default logins; if only one vendor is ready, it fills both seats with different lenses. If no
|
|
443
|
+
vendor is known ready, two editable choices remain and their lamps explain the state. Editing
|
|
444
|
+
a seat stops this automatic first-use selection. Saved seats are preserved.
|
|
445
|
+
|
|
446
|
+
Use **+ Add seat** for more. Two or three seats are enough for most questions. Opening a table
|
|
447
|
+
saves its field notes, seats, limits, memory, chairman choices and budgets in this browser for
|
|
448
|
+
this address. These preferences return on reload; unsent edits are not automatically saved.
|
|
449
|
+
|
|
450
|
+
Added seats start with a distinct, editable lens. Restored seats with an empty lens get a
|
|
451
|
+
starter perspective and a notice to review it. If you clear a lens, reuse another seat's lens,
|
|
452
|
+
or leave a custom mood blank, **Open the table** highlights and focuses that field before
|
|
453
|
+
any model call. Your draft stays in place.
|
|
454
|
+
|
|
455
|
+
Hover over the Lens, Mood, Effort or round-setting label for about a second for an explanation.
|
|
456
|
+
You can also focus the label with the keyboard or tap it. Hints appear after a deliberate delay,
|
|
457
|
+
remain open while you read them, and close with Escape or a tap outside. The Mood hint
|
|
458
|
+
explains the selected approach. New agent replies use a brief text reveal; saved replies
|
|
459
|
+
appear in full. The interface respects your device's reduced-motion setting.
|
|
460
|
+
|
|
461
|
+
Below the seats is the **chairman**: a fresh session that did not argue. It reads every round
|
|
462
|
+
and writes the verdict, sceptically (agreement between seats is not evidence; it recommends
|
|
463
|
+
none when every option rests on assumptions). It does not decide: you accept an option after the
|
|
464
|
+
verdict. It can have its own vendor, model and effort.
|
|
465
|
+
|
|
466
|
+
For a playful board session, choose a custom mood and enter `cat` (or `meow`) or `alien`
|
|
467
|
+
(or `ufo`). These optional personas use the lightest configured model and low effort, with a
|
|
468
|
+
60,000-token seat cap. They keep the reply format but prioritize the character over useful
|
|
469
|
+
analysis. Use the ordinary moods for decision reviews. API clients treat these words as plain
|
|
470
|
+
custom text.
|
|
471
|
+
|
|
472
|
+
### How seats stay independent
|
|
473
|
+
|
|
474
|
+
- Every CLI seat has its own session and working folder, `debates/<slug>/seats/<id>/`.
|
|
475
|
+
Roundtable does not run the seat in the project you are reviewing. CLI-specific discovery
|
|
476
|
+
of instructions and settings still applies; these controls are not a sandbox.
|
|
477
|
+
- Claude seats load no user-level settings (`--setting-sources local`); Codex seats skip
|
|
478
|
+
`AGENTS.md` discovery, the global one included.
|
|
479
|
+
- Other seats and the chairman identify a seat by its lens. Roundtable omits vendor and model
|
|
480
|
+
labels from the prompts; each seat receives its own mood instructions.
|
|
481
|
+
- Still shared: the CLI's own state folder (login, local history) unless the seat has a login
|
|
482
|
+
profile, and whatever the vendor applies to every request from your account.
|
|
483
|
+
- Codex ignores your user configuration, so a default model or effort in that file does not
|
|
484
|
+
control the seat. Choose both explicitly to reproduce a review. CLI resolution follows PATH
|
|
485
|
+
order across native binaries and npm installations, including on Windows.
|
|
486
|
+
- Codex seats use a short decision-review base prompt instead of general coding instructions.
|
|
487
|
+
Parent Codex app routing/session variables are removed before starting CLIs or reading quota.
|
|
488
|
+
Login profiles and inherited network restrictions are preserved. This also applies when a
|
|
489
|
+
coding agent launches Roundtable as a background server.
|
|
490
|
+
- Use different lenses to test different assumptions. Agreement between seats is not evidence
|
|
491
|
+
that their shared assumptions are correct.
|
|
492
|
+
|
|
493
|
+
### Set the limits
|
|
494
|
+
|
|
495
|
+
- **Critique rounds**: rounds after the blind first one. Start with one and increase it only
|
|
496
|
+
when another round is useful.
|
|
497
|
+
- **Review window (s)**: a short correction window between rounds with no questions, including
|
|
498
|
+
the blind first round. The default is 15 seconds; it continues without a click.
|
|
499
|
+
- **Answer window (s)**: when a seat asks a question, wait up to 120 seconds by default, then
|
|
500
|
+
continue with the missing facts still unknown. A countdown is shown beside the questions
|
|
501
|
+
and in the bottom bar. Writing an answer or note, or choosing **More time**, renews this
|
|
502
|
+
window within the overall wall clock. Clicking elsewhere does not hold the review.
|
|
503
|
+
Drafts are never submitted automatically. If an extension fails, the board reports it.
|
|
504
|
+
- **Wall clock (min)**: a hard stop.
|
|
505
|
+
- **Memory**: leave on `stateless`. Each round is a fresh call with the field notes, the seat's
|
|
506
|
+
own last reply and the others' replies. This avoids resending the full conversation, but
|
|
507
|
+
token use and cost still vary. `resume` retains a conversation and can grow the context each
|
|
508
|
+
round. Neither setting controls the provider's logging or retention policy.
|
|
509
|
+
- **Unattended**, off by default: the table never waits for you. The window after the blind
|
|
510
|
+
round is skipped, and the seats are told that nobody answers questions, so they state what
|
|
511
|
+
they would have asked as an assumption instead; the question line leaves their contract, which
|
|
512
|
+
also keeps its tokens out of every call. Turn it on only for a review nobody will watch;
|
|
513
|
+
otherwise leave it off, so the board can collect answers and play its question sound.
|
|
514
|
+
These modes work both in the browser and through an agent. Use unattended for a background
|
|
515
|
+
job with no reply channel; an agent in a live chat can present the questions to its user.
|
|
516
|
+
- **Budget caps**, in the quota panel: an optional token or dollar ceiling per vendor. The
|
|
517
|
+
engine checks projected usage before each round and every provider attempt, including network
|
|
518
|
+
retries, re-prompts and a fallback chairman. It counts reported usage and calls still in
|
|
519
|
+
flight, and keeps room for the verdict. A refused retry fails that seat for the round; a
|
|
520
|
+
refused round stops the debate. Calls can consume more than their estimates, so a cap is an
|
|
521
|
+
admission check rather than a guaranteed final bill.
|
|
522
|
+
A dollar cap needs a dollar estimate; without one it blocks calls. A saved dollar cap stays
|
|
523
|
+
visible so you can clear it and use a token cap while dollar estimates are unavailable.
|
|
524
|
+
If a call omits usable token counts, further calls to that vendor are blocked when it has a
|
|
525
|
+
token cap, including retries, re-prompts and the chairman. This also applies after a restart.
|
|
526
|
+
Calls already in flight can finish. A chairman on another vendor can still write the verdict
|
|
527
|
+
if its own checks pass.
|
|
528
|
+
Every discussion seat also has an automatic limit of 400,000 tokens per review. If its reported
|
|
529
|
+
spend plus the next projected call exceeds the limit, or any earlier call has missing or partial
|
|
530
|
+
usage, that seat sits out. The board says **seat cap** for a projected crossing, or **usage unknown**
|
|
531
|
+
for missing counts, and other seats can continue. When recorded, the earlier timeout or
|
|
532
|
+
interruption is shown. Unknown spending does not mean the cap was measured as exhausted;
|
|
533
|
+
check the earlier failure and provider usage before starting more work. This check
|
|
534
|
+
applies to retries and resumed reviews too. An in-flight call can exceed its projection; the cap
|
|
535
|
+
blocks subsequent calls. The chairman is governed by the vendor budget, not a discussion seat's
|
|
536
|
+
cap. Without a vendor token cap, unknown usage does not block the chairman.
|
|
537
|
+
The board, history and exports label missing counts **unknown** and mixed totals **partial**;
|
|
538
|
+
reported dollar costs remain available even when token counts are missing. Explicit zero
|
|
539
|
+
counts remain zero. Older transcripts that already saved fabricated zeros cannot be repaired
|
|
540
|
+
automatically from those records.
|
|
541
|
+
|
|
542
|
+
### Read the quota picture
|
|
543
|
+
|
|
544
|
+
The **Quota picture** under the seats starts folded; its title lists each account's projected
|
|
545
|
+
tokens. Open it for one card per vendor account: what each seat is likely to draw in this
|
|
546
|
+
debate as one bar segment per seat (seats of one vendor in steps of its colour, the chairman
|
|
547
|
+
hatched), the vendor's live windows where it reports them, and an optional cap. Antigravity's
|
|
548
|
+
windows are named by group ("Gemini 5h", "Claude and GPT 7d"), and its card shows the groups its
|
|
549
|
+
seats' models draw on. When it reports no window, you can track the figure from its credits
|
|
550
|
+
page in its card.
|
|
551
|
+
|
|
552
|
+
On the running board, usage starts collapsed. Each account shows its lowest reported percentage
|
|
553
|
+
remaining and a small bar, with the window and reading age. Missing figures say **not reported**.
|
|
554
|
+
Open **Usage details** for per-seat tokens, costs and timing, grouped by account with each
|
|
555
|
+
account's live windows. A **+** after a total means some calls reported nothing; a dash means
|
|
556
|
+
the CLI reports no cost. Rounds fold once a review finishes, so the conclusion leads.
|
|
557
|
+
|
|
558
|
+
These statistics describe your own agents' calls in Roundtable and are calculated and stored
|
|
559
|
+
on your machine. Roundtable has no telemetry or analytics service and sends no usage data to
|
|
560
|
+
its developers. Provider quota readings describe your account and may also include activity
|
|
561
|
+
outside Roundtable. Your selected providers receive the prompts needed for live reviews;
|
|
562
|
+
their data handling is separate.
|
|
563
|
+
|
|
564
|
+
Codex reports cumulative tokens when resuming a thread. Roundtable charges only the increase
|
|
565
|
+
since that seat's last reading and keeps the original totals under `usage.raw`. A missing or
|
|
566
|
+
decreasing baseline is unknown spending, not zero. Recovering an interrupted review starts new
|
|
567
|
+
provider threads and resets this baseline while retaining earlier spending. Older saved totals
|
|
568
|
+
are not rewritten automatically.
|
|
569
|
+
|
|
570
|
+
### Open the table and take part
|
|
571
|
+
|
|
572
|
+
Press **Open the table**.
|
|
573
|
+
|
|
574
|
+
A small pixel gavel strikes once when a new session opens and once when it ends. The card and
|
|
575
|
+
a quiet sound say which ending it was: a verdict is ready, you stopped the review, the session
|
|
576
|
+
closed without a verdict, or it failed. Stop uses a short descending cue, never the success cue.
|
|
577
|
+
The gavel does not delay requests or block controls. Saved reviews and replayed
|
|
578
|
+
history stay still and silent. Reduced-motion settings show the card without movement.
|
|
579
|
+
**Sound: on** in the header turns the sounds off or back on, and this browser remembers the
|
|
580
|
+
choice. Sounds are generated in the page; no audio files are loaded. When the board is in a
|
|
581
|
+
background tab, only the sound plays, so you hear when a long review finishes. The browser plays
|
|
582
|
+
nothing until you have clicked or typed on the page once. The JSON agent client loads neither the
|
|
583
|
+
animation nor the sounds.
|
|
584
|
+
|
|
585
|
+
1. **Round 0 is blind.** Every seat answers at once without seeing the others. A timed window
|
|
586
|
+
lets you correct a wrong assumption, add a fact, or answer a seat's question, including when
|
|
587
|
+
the seats already agree. Use **Continue** to move on immediately, or let the timer expire.
|
|
588
|
+
Questions get the longer answer window; a round with no question uses the review window.
|
|
589
|
+
Each reply card starts folded to its seat and position, including in the round still coming
|
|
590
|
+
in; click its head to read the reply, and again to fold it. A card you open stays open until
|
|
591
|
+
the review changes.
|
|
592
|
+
2. **Critique rounds.** Each seat sees the others' replies under their lens names and argues.
|
|
593
|
+
Between rounds the countdown runs; writing a note requests more time. A finished final round
|
|
594
|
+
without questions goes straight to the verdict.
|
|
595
|
+
3. **Questions for you.** Answer in one area above the replies. Identical questions share a field
|
|
596
|
+
and list every seat that asked (name, lens and mood); distinct questions stay separate. Send all answers together, add
|
|
597
|
+
a general note, or continue with unknowns left blank. Final-round questions also get the
|
|
598
|
+
answer window before the verdict. With no response, the review continues automatically and
|
|
599
|
+
records that the questions went unanswered; silence never supplies facts or accepts a result.
|
|
600
|
+
The browser tab title and a sound draw attention to questions without taking keyboard focus.
|
|
601
|
+
Explicit no-question placeholders such as `None.` or `none, treat available
|
|
602
|
+
hours as an explicit unknown` do not create an answer window. Ambiguous wording still gets one.
|
|
603
|
+
No extra model call is used to collect or filter questions.
|
|
604
|
+
Every submitted answer is shared with all seats in the next round and with the chairman,
|
|
605
|
+
even if only one seat asked. This gives every seat the same corrections and constraints.
|
|
606
|
+
The initial blind replies stay independent; answers do not rewrite earlier replies.
|
|
607
|
+
4. **Finish with verdict** ends discussion and sends the collected replies to the chairman.
|
|
608
|
+
It becomes available after a complete round has a usable reply. Unfinished seat calls are
|
|
609
|
+
cancelled; their reported usage is kept. With **0 critique rounds**, round 0 still runs, so
|
|
610
|
+
the chairman has the blind replies to assess. Before any round finishes, only Stop is available.
|
|
611
|
+
5. **Stop** aborts all work, including the chairman. So does typing `/stop`.
|
|
612
|
+
|
|
613
|
+
Cards with the same position share an outer box, so agreement is visible at a glance. Each
|
|
614
|
+
card has a small dot for what the seat is doing (grey idle, blinking amber thinking, green
|
|
615
|
+
replied, red failed) and a faint tint for its position (with the majority, against it, its own
|
|
616
|
+
stance, or passed).
|
|
617
|
+
|
|
618
|
+
Each card separates its position, disagreements, new points and assumptions. Red emphasis marks
|
|
619
|
+
literal rejection or negation words inside disagreement sections; green marks agreement.
|
|
620
|
+
The labels and text carry the meaning too. These colors are reading aids, not sentiment scores.
|
|
621
|
+
|
|
622
|
+
The debate also stops by itself when all seats agree, all pass, a round changes nothing, the
|
|
623
|
+
round limit or wall clock is reached, or a budget cap would be crossed.
|
|
624
|
+
|
|
625
|
+
**Stop** saves your note, cancels this review's CLI processes and endpoint requests, and prevents
|
|
626
|
+
all further calls, including the chairman, retries and fallbacks. The button stays available
|
|
627
|
+
while a verdict is being written, including one started later with **Write**. Completed replies
|
|
628
|
+
and reported usage are kept. The board says **Review stopped**. To get a verdict afterward,
|
|
629
|
+
request it explicitly with **Write**. A natural stop such as consensus still writes its verdict.
|
|
630
|
+
Stop saves the general note without submitting question drafts, and works even if the table
|
|
631
|
+
has moved past the questions you were viewing. No verdict is requested without usable replies.
|
|
632
|
+
Cancelled calls say why they stopped. A provider timeout is shown separately from the review's
|
|
633
|
+
overall time limit. Waiting for your input counts toward that limit; the answer area shows the
|
|
634
|
+
remaining time. If it expires, the board says that no answer was assumed.
|
|
635
|
+
|
|
636
|
+
### The verdict
|
|
637
|
+
|
|
638
|
+
The board shows a **Conclusion**: the recommended option first, in bold uppercase, then the
|
|
639
|
+
answer, its reasons, the main reservation and
|
|
640
|
+
what could change it. A missing goal or fact that could change the answer must be stated as a
|
|
641
|
+
condition, with **Clarification needed from you** below it. These questions are for you; a
|
|
642
|
+
finished review does not wait for answers or start another call automatically. Optional further
|
|
643
|
+
exploration, final panel positions and run details are under **Discussion details**. Panel
|
|
644
|
+
positions count the seats' final eligible replies; agreement is not a confidence score.
|
|
645
|
+
|
|
646
|
+
The chairman can give a nuanced or combined answer to a reflective question. If no single
|
|
647
|
+
listed option fits, it can recommend `none` and explain the conclusion. **Record your decision**
|
|
648
|
+
then starts with "none of these" selected. You still make the decision.
|
|
649
|
+
|
|
650
|
+
**Copy result** copies the readable conclusion, reasons, reservations and follow-up questions,
|
|
651
|
+
without the transcript, usage figures or local paths. If clipboard access is blocked, a selected
|
|
652
|
+
text box lets you copy manually. **Export record** keeps the full structured decision record.
|
|
653
|
+
Older saved verdicts still display; their unclassified questions remain visible as **Questions
|
|
654
|
+
for you**. They are not silently treated as optional. Updated wording applies to new reviews;
|
|
655
|
+
opening an old review does not regenerate it or spend tokens.
|
|
656
|
+
|
|
657
|
+
The stored verdict keeps `RECOMMENDATION`, `DISSENT`, `KILL_CRITERIA` and `OPEN_QUESTIONS`.
|
|
658
|
+
The first recommendation line remains an option id or `none`. New question bullets use
|
|
659
|
+
`NEEDED:` or `OPTIONAL:` within `OPEN_QUESTIONS`; an absent item uses `None.`. These are
|
|
660
|
+
presentation hints, not new required fields or retry conditions. The transcript, field notes
|
|
661
|
+
and verdict remain in `debates/<date-and-question>/`.
|
|
662
|
+
|
|
663
|
+
When discussion ends, its comment controls close. The board first says **writing verdict**, then
|
|
664
|
+
**Review finished** or **Review ended · no verdict**. **Record your decision** opens a separate
|
|
665
|
+
form; its note records your choice and is not sent to the agents.
|
|
666
|
+
|
|
667
|
+
If the verdict was skipped or failed, **Write** requests it separately, subject to the existing
|
|
668
|
+
budget. Choosing the original CLI chairman keeps its model, effort and login profile; the
|
|
669
|
+
selector shows those settings. Choosing another CLI vendor uses that vendor's defaults.
|
|
670
|
+
|
|
671
|
+
If the server stops in the middle of a debate, start it again and reopen the same address. The
|
|
672
|
+
board replays what happened and offers **Resume**.
|
|
673
|
+
This includes Ctrl+C and normal server shutdown: they interrupt the review, without recording
|
|
674
|
+
a human Stop. Shutdown closes event streams and waits briefly for cancelled calls to save
|
|
675
|
+
their reported spending. If discussion had already ended, **Write** requests its missing verdict.
|
|
676
|
+
|
|
677
|
+
Resume after an interruption starts fresh provider conversations using completed rounds and
|
|
678
|
+
all saved notes. This avoids reusing unsaved content left in an old provider thread. It can
|
|
679
|
+
resend more input during recovery; ordinary uninterrupted Resume-memory rounds still reuse
|
|
680
|
+
their conversation. Spending from discarded partial rounds continues to count.
|
|
681
|
+
Stopping a verdict records synthesis cancellation separately from why the discussion ended.
|
|
682
|
+
|
|
683
|
+
Every provider call first saves a dispatch record. If the server stops before the result is
|
|
684
|
+
saved, that call's usage is **unknown**, not zero. Resume keeps that uncertainty: vendor caps
|
|
685
|
+
and automatic seat caps can refuse further work. Check the provider's own usage before
|
|
686
|
+
deciding how to continue. Stopping the server first stops its engines, so cancellation cannot
|
|
687
|
+
start a new chairman request.
|
|
688
|
+
|
|
689
|
+
If a storage error stops a running review, fix disk space or permissions and then use
|
|
690
|
+
**Resume**, or **Write** when discussion already finished. The server waits for cancelled
|
|
691
|
+
turns to settle before offering recovery. Recovery never starts a call automatically.
|
|
692
|
+
|
|
693
|
+
A note entered when resuming before round 0 is saved as **Before round 0**. It reaches the
|
|
694
|
+
restarted blind calls, subsequent stateless calls and the chairman, and remains in replay and
|
|
695
|
+
exports. The original field notes stay unchanged.
|
|
696
|
+
|
|
697
|
+
If a write was interrupted in the final line, the board shows the complete records and a
|
|
698
|
+
recovery notice. Opening history does not change the file. Before the next write, Roundtable
|
|
699
|
+
saves a byte-for-byte `transcript.recovery-<id>.jsonl` backup beside the original, then restores
|
|
700
|
+
the complete prefix. The notice remains on replay and in exported records. A valid final row
|
|
701
|
+
without a newline is preserved too. The incomplete row cannot be reconstructed, and any usage
|
|
702
|
+
inside it may be missing; check the provider's own usage before relying on a cap after recovery.
|
|
703
|
+
|
|
704
|
+
A corrupt completed line is different: the list says **needs repair**, names the line, and
|
|
705
|
+
blocks resume and export. Restore `transcript.jsonl` from a known good backup and restart the
|
|
706
|
+
server. Keep the damaged file until you have checked the restored record; recovery never
|
|
707
|
+
silently skips a corrupt completed line.
|
|
708
|
+
|
|
709
|
+
Unreadable pool or calibration settings are also preserved. Restore the affected JSON file
|
|
710
|
+
from a known good copy and restart before saving settings. A failed read is not an empty file.
|
|
711
|
+
History lists reuse small summaries for unchanged transcripts; old replay bodies are evicted
|
|
712
|
+
when no review or connected board needs them. Reopening an evicted review reads it from disk.
|
|
713
|
+
|
|
714
|
+
## 5. Keep the cost low
|
|
715
|
+
|
|
716
|
+
- Start with two seats and zero critique rounds: three planned calls, including the verdict.
|
|
717
|
+
One critique round with three seats makes seven calls before retries.
|
|
718
|
+
- Lighter models (Sonnet, Flash) or lower effort for seats that only need to poke holes.
|
|
719
|
+
- Spend the effort on the chairman instead: one step above the seats is one call's worth of
|
|
720
|
+
extra thinking, on the call that decides.
|
|
721
|
+
- A light chairman: it makes the longest single call.
|
|
722
|
+
- Keep memory on `stateless`.
|
|
723
|
+
- Set a budget cap per vendor when you are near a limit.
|
|
724
|
+
|
|
725
|
+
The prompts ask for roughly 140 words per seat and 220 for the verdict, and discourage repeated
|
|
726
|
+
questions and field notes. These are writing targets, not enforced output limits. Actual usage
|
|
727
|
+
also includes CLI overhead, reasoning and retries. Shorter visible replies do not guarantee the
|
|
728
|
+
same reduction in billed tokens. No reasoning settings or budgets are changed automatically.
|
|
729
|
+
|
|
730
|
+
## 6. Export the decision into your codebase
|
|
731
|
+
|
|
732
|
+
So that your coding agents can read what was decided, even inside a sandbox that only sees the
|
|
733
|
+
repository, export the debate as a decision record:
|
|
734
|
+
|
|
735
|
+
- In the board, press **Export record** on the verdict panel and give a folder, for example
|
|
736
|
+
`C:\code\my-app\docs\decisions` or `~/code/my-app/docs/decisions`. The folder is remembered
|
|
737
|
+
next time. **Choose…** beside the field opens your system's folder dialog instead of typing:
|
|
738
|
+
the Windows folder browser, the macOS folder chooser, or zenity or kdialog on Linux. Without
|
|
739
|
+
one of those on Linux, type the path. The dialog waits up to ten minutes; if it cannot open or
|
|
740
|
+
times out, the board shows an error and you can still enter the path manually.
|
|
741
|
+
- Or set **Export to** in the field notes before the debate; it has the same **Choose…** button.
|
|
742
|
+
- Or from a terminal:
|
|
743
|
+
|
|
744
|
+
```bash
|
|
745
|
+
npm run export -- <debate folder name> <target folder>
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
The folder must already exist. Each debate becomes one markdown file with the question, field
|
|
749
|
+
notes, the final position of each seat, the recommendation, dissent, kill criteria, open
|
|
750
|
+
questions, your notes and the usage. The same folder gets a `README.md` index of every record
|
|
751
|
+
(`DECISIONS.md` instead when the folder already has a README that roundtable did not write).
|
|
752
|
+
Roundtable only ever replaces files it wrote; anything else in the way is refused.
|
|
753
|
+
On Linux and macOS, replacements preserve the existing record and index permission bits.
|
|
754
|
+
New files use normal file permissions filtered by your shell's umask, including in shared folders.
|
|
755
|
+
|
|
756
|
+
A record says **recommended** until you decide. Open **Record your decision** under the verdict. **Your decision** has the
|
|
757
|
+
chairman's pick preselected; choose it, another option or "none of these", add a line on why if
|
|
758
|
+
you like, and press **Accept**. The record then says **accepted**, names your choice and the
|
|
759
|
+
recommendation side by side, and is written again if the debate has an Export to folder.
|
|
760
|
+
Point your agents at that folder in their instructions, for example a line in `AGENTS.md`:
|
|
761
|
+
"Read docs/decisions/README.md before changing anything a decision covers."
|
|
762
|
+
|
|
763
|
+
## 7. A second account for a seat (optional)
|
|
764
|
+
|
|
765
|
+
By default every seat of a vendor uses your one login, the same as two terminal windows would.
|
|
766
|
+
To give a seat a different account, give it a profile name in the **Account** field, then log
|
|
767
|
+
that profile in once:
|
|
768
|
+
|
|
769
|
+
```bash
|
|
770
|
+
npm run doctor -- --profile work
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
It prints the exact commands for each vendor, for example on Windows:
|
|
774
|
+
|
|
775
|
+
```
|
|
776
|
+
set CODEX_HOME=C:\Users\<you>\.roundtable\homes\work\codex
|
|
777
|
+
codex login
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
Run them in a terminal and sign in with the other account. Roundtable never copies your login
|
|
781
|
+
files; each profile is logged in by you. Antigravity has no way to keep a separate profile, so
|
|
782
|
+
its seats always use the IDE's account.
|
|
783
|
+
|
|
784
|
+
## 7b. An API endpoint as a seat (optional)
|
|
785
|
+
|
|
786
|
+
The CLIs on your subscriptions are the main path. If you also want a model the CLIs do not
|
|
787
|
+
offer, or one running on your own hardware, seat an **API endpoint**: any server that speaks
|
|
788
|
+
the OpenAI chat-completions API.
|
|
789
|
+
|
|
790
|
+
| field | what it does |
|
|
791
|
+
|---|---|
|
|
792
|
+
| Endpoint | The base URL, ending in `/v1`. Presets: Ollama (`http://localhost:11434/v1`), LM Studio, vLLM, llama.cpp server, DeepSeek (`https://api.deepseek.com/v1`), Moonshot/Kimi (`https://api.moonshot.ai/v1`; China keys use `api.moonshot.cn`), OpenAI. Any other URL works. Plain `http` is accepted for local names and private IP literals (`localhost`, `10.0.0.5`, `192.168.0.9`, `.local`, a bare LAN name); a hosted API must be `https`. A name such as `10.api.example.com` still requires HTTPS. |
|
|
793
|
+
| Key var | For a hosted API: the **name** of the environment variable that holds your key, for example `DEEPSEEK_API_KEY`. Not the key. Set the variable in the shell you start roundtable from; a preset fills in its usual name. A local server needs none. |
|
|
794
|
+
| Model | Required: the endpoint has no default. Type the id the server knows (`llama3`, `deepseek-chat`, `kimi-k2`...). |
|
|
795
|
+
| Effort | Sent as `reasoning_effort` only when you set a pip; a server without that field answers 400, so leave it on default for most local servers. |
|
|
796
|
+
|
|
797
|
+
Only valid environment-variable names are saved in browser preferences. Invalid values are
|
|
798
|
+
also removed from older saved drafts when the page loads. Keep the actual key in the server's
|
|
799
|
+
environment; the Key var field is never a place to paste it.
|
|
800
|
+
|
|
801
|
+
What is different from a CLI seat:
|
|
802
|
+
|
|
803
|
+
- **Billing is the endpoint's.** A hosted API bills per token to the account whose key you
|
|
804
|
+
named; a local server costs your hardware. The tag on the card, `API · pay-per-token` or
|
|
805
|
+
`API · local`, is there so this is never a surprise. The strip shows tokens but no dollar
|
|
806
|
+
figure (the endpoint does not report one), so a dollar cap is refused for it; a token cap works.
|
|
807
|
+
- **The key is sent to the endpoint you choose.** Roundtable reads the
|
|
808
|
+
variable at call time and sends it as a bearer to the URL you named, with redirects refused.
|
|
809
|
+
Roundtable does not deliberately add it to transcripts, logs or the board. Provider response
|
|
810
|
+
and error text can be displayed and recorded, so use an endpoint you trust not to echo it.
|
|
811
|
+
- **The lamp cannot check reachability.** Before the first call the lamp says only whether the
|
|
812
|
+
URL passes the rules and whether the named variable is set. Roundtable sends no probe: a
|
|
813
|
+
probe would mean this server fetching a URL the page named, with the key attached, which a
|
|
814
|
+
hostile web page could abuse. The first real call is the check; a failure shows on the card
|
|
815
|
+
like a CLI's would (`could not reach`, `401`, and so on).
|
|
816
|
+
- **Stateless requests only.** Roundtable sends a fresh request and does not manage a remote
|
|
817
|
+
conversation for endpoints, so `memory: resume` is refused when an endpoint sits at the table.
|
|
818
|
+
This describes Roundtable's requests, not what the endpoint stores or retains.
|
|
819
|
+
- **One pool per host.** Two seats on `localhost:11434` share a pool; a seat on DeepSeek has
|
|
820
|
+
its own. A host that fails (wrong key, no credit, nothing listening) benches only its own seats.
|
|
821
|
+
The token cap, though, is per vendor: one cap covers every endpoint seat at the table.
|
|
822
|
+
- **A short rate limit is waited out once.** A `429` whose `Retry-After` asks for 30 seconds
|
|
823
|
+
or less (the delay past which `agy` stops waiting on its own server) is waited out, and the
|
|
824
|
+
call is sent once more, provided the wait ends before the review's wall clock does. Stop and
|
|
825
|
+
finish end the wait at once. A `429` with no `Retry-After`, with a longer one, or a second
|
|
826
|
+
`429` after the wait benches the host like no credit does, so a used-up quota is never called
|
|
827
|
+
round after round. A `429` counts as zero tokens, since the server refused the request before
|
|
828
|
+
the model ran. A CLI seat needs none of this: its CLI waits out such delays itself.
|
|
829
|
+
- **No tools are offered** in the request. A reply that carries `tool_calls`, a legacy
|
|
830
|
+
`function_call`, or a tool finish reason stops that seat for the review. Its answer is
|
|
831
|
+
excluded from later discussion; its reported spending still counts.
|
|
832
|
+
- **Response size is bounded.** The complete response body, including JSON metadata, must fit
|
|
833
|
+
within 1 MiB after decompression. A larger success or error response is cancelled and the
|
|
834
|
+
card reports the limit; it is not retried as a network failure. Reduce the endpoint's output
|
|
835
|
+
length if a legitimate reply reaches this limit.
|
|
836
|
+
|
|
837
|
+
The chairman can be an endpoint too; its card takes the same fields. The decision record
|
|
838
|
+
names the endpoint on each seat's line (`API http://localhost:11434/v1`) and on the chairman's.
|
|
839
|
+
|
|
840
|
+
## 8. Run a debate without the browser
|
|
841
|
+
|
|
842
|
+
### Optional searcher before discussion
|
|
843
|
+
|
|
844
|
+
The **searcher** gathers web evidence once, before the blind replies. It never argues or votes.
|
|
845
|
+
Press **+ Add searcher** under the seats to add its card, next to the chairman's; its × removes it.
|
|
846
|
+
By default its visible **Query** follows your question and candidate options. It investigates
|
|
847
|
+
facts for and against them; it does not recommend an answer. Choose **Custom query** to edit
|
|
848
|
+
the draft or enter an exact question. A custom query stays unchanged when you edit the review.
|
|
849
|
+
Only the displayed query goes to the searcher: other context and discussion answers are excluded.
|
|
850
|
+
Review it for private details. The same decision question is useful when you need outside
|
|
851
|
+
evidence; leave the searcher off when you already have the facts you want the seats to reason from.
|
|
852
|
+
The card has its own vendor,
|
|
853
|
+
model, effort and login profile, like the chairman's. Pick the vendor whose pool has room:
|
|
854
|
+
Claude, Codex or Antigravity. There is one searcher and one call, on that vendor only. A new
|
|
855
|
+
searcher, or one moved to another vendor, starts on that vendor's lightest model at low
|
|
856
|
+
effort, since finding and quoting sources needs little reasoning. Each CLI searches with every
|
|
857
|
+
other tool kept off: Codex turns on only its web search, Claude gets WebSearch as its only
|
|
858
|
+
tool, and Antigravity, whose web search is always on, keeps its other tools denied. An
|
|
859
|
+
Antigravity searcher has the same limited isolation as an Antigravity seat, and its card says
|
|
860
|
+
so. It also needs the same terms acknowledgment (see Antigravity under section 2), and an
|
|
861
|
+
agent request with an Antigravity searcher sends `acknowledgeTermsRisk: true` too. An API endpoint
|
|
862
|
+
has no search tool and is not offered.
|
|
863
|
+
This is one additional subscription call, included in the quota projection and vendor budget.
|
|
864
|
+
The setup estimate also reserves 12,000 input tokens for shared evidence in each discussion
|
|
865
|
+
and verdict call. After research, admission checks use the saved source bundle's UTF-8 size
|
|
866
|
+
divided by three as an additive token estimate, including resumed conversations and repairs.
|
|
867
|
+
Measured dollar baselines are adjusted for that extra input. These are conservative planning
|
|
868
|
+
allowances, not exact token counts or guaranteed spending limits.
|
|
869
|
+
|
|
870
|
+
Set its **Limits**: searches (1–8 reported operations) and time (30–600 seconds). An operation
|
|
871
|
+
can contain several queries or page visits, and can begin before the CLI reports it. A Codex
|
|
872
|
+
searcher is asked to make one operation carrying up to that many queries, and another only
|
|
873
|
+
when the first returned nothing usable: each further operation resends everything gathered so
|
|
874
|
+
far and is one more request that can stall, so this keeps its input near a single search's
|
|
875
|
+
(about 22k tokens) instead of growing with each one. Roundtable
|
|
876
|
+
stops the call when a reported operation exceeds the limit; it cannot undo upstream work or
|
|
877
|
+
guarantee a provider billing ceiling. Claude also reports how many searches it ran when the
|
|
878
|
+
call ends, and a count over the limit fails the research. Claude runs each search on a small
|
|
879
|
+
model of its own; those tokens are included in the searcher's usage. Claude's WebSearch returns
|
|
880
|
+
titles, links and that model's summary without opening the pages (WebFetch stays off), so its
|
|
881
|
+
excerpts are shorter than Codex's. Local commands, files, MCP and delegation remain forbidden.
|
|
882
|
+
|
|
883
|
+
While the searcher works, the review state reads **Searcher at work** and the sources panel
|
|
884
|
+
shows its eye moving down a column of results (still, with reduced motion).
|
|
885
|
+
|
|
886
|
+
The board saves up to eight sources with URLs, excerpts, publication dates where reported,
|
|
887
|
+
and the time the bundle was gathered. A date that is not a real `YYYY-MM-DD` date (a month
|
|
888
|
+
only, a year only, "unknown") is saved as not reported; the source itself is kept. Citations and excerpts are supplied by the searcher's provider, not
|
|
889
|
+
independently verified by Roundtable. Every seat and the chairman gets the identical saved
|
|
890
|
+
bundle, with tools disabled during discussion. The source panel, agent state, field-notes
|
|
891
|
+
file and Markdown export include it. Its spending appears as the **searcher** row in Usage
|
|
892
|
+
details and a **searcher** segment in the quota picture.
|
|
893
|
+
|
|
894
|
+
If the searcher repeats a URL, Roundtable keeps one citation in first-seen order. The first
|
|
895
|
+
title and publication date are kept; distinct excerpts are appended only when the complete
|
|
896
|
+
combined text fits 1,200 characters. All entries must still pass validation, including
|
|
897
|
+
duplicates, and the response must contain at most eight entries before deduplication.
|
|
898
|
+
Different query strings and fragments remain distinct URLs. This cleanup is local and makes
|
|
899
|
+
no extra model call; repeated sources do not discard an otherwise usable search result.
|
|
900
|
+
|
|
901
|
+
A Codex search can stop making progress in two ways. Most often one of its requests, the search
|
|
902
|
+
or the answer after it, streams nothing: at low effort (the searcher's default) Codex reconnects
|
|
903
|
+
after 15 seconds of silence, as any light Codex call does (see Error logs), and each reconnect
|
|
904
|
+
resends only that request, so a finished search is kept. Less often a search starts and nothing
|
|
905
|
+
more arrives while its process remains open, so no silence limit fires. Roundtable stops a Codex
|
|
906
|
+
searcher call that makes no progress for 40 seconds (a "Reconnecting" notice counts as progress,
|
|
907
|
+
since those reconnects are bounded) and starts it once more if at least 30 seconds of the
|
|
908
|
+
searcher's time limit remain; a call whose reconnects were all used up is started once more the
|
|
909
|
+
same way. This recovery does not identify or fix the cause of the stall. Both attempts share one
|
|
910
|
+
limit, both are
|
|
911
|
+
recorded, and the stalled one's usage stays unknown, since Codex reports none for it. The retry
|
|
912
|
+
is a fresh call with its own search limit, so one research step can run up to twice the
|
|
913
|
+
configured number of searches; each attempt's row in the record says how many it ran. A stall
|
|
914
|
+
is noticed after 40 seconds and a retry needs 30 more, so a time limit under about 75 seconds
|
|
915
|
+
leaves no room for one. A Codex token cap can also refuse the retry, since the stalled attempt's
|
|
916
|
+
spending is unknown.
|
|
917
|
+
|
|
918
|
+
Research failure or interruption ends the review before discussion. Check the details and
|
|
919
|
+
provider usage before explicitly starting a new review. Resume never repeats unfinished
|
|
920
|
+
research; completed bundles are reused without refetching pages.
|
|
921
|
+
The agent state reports a fixed failure description and safe progress fields; open the board
|
|
922
|
+
for the original provider error details. Saved failures receive the same filtering.
|
|
923
|
+
|
|
924
|
+
For the agent client, add this to the request's `options` (leave it out to keep research off).
|
|
925
|
+
`vendor` (`codex`, `claude` or `agy`; Codex when left out), `model`, `effort` and `account` set
|
|
926
|
+
the searcher; without the last three it runs that vendor's lightest model at low effort on your
|
|
927
|
+
usual login:
|
|
928
|
+
|
|
929
|
+
```json
|
|
930
|
+
{
|
|
931
|
+
"research": {
|
|
932
|
+
"vendor": "codex",
|
|
933
|
+
"query": "Public evidence for a staged release",
|
|
934
|
+
"maxSearches": 4,
|
|
935
|
+
"timeoutMs": 120000,
|
|
936
|
+
"model": "gpt-6-luna",
|
|
937
|
+
"effort": "low"
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
Use the JSON client for coding agents. It returns one compact object per command and exposes
|
|
943
|
+
timed question windows without answering for the person. From a checkout:
|
|
944
|
+
|
|
945
|
+
```bash
|
|
946
|
+
npm start -- --no-open
|
|
947
|
+
node src/cli.js agent status --refresh
|
|
948
|
+
node src/cli.js agent check --input review.json
|
|
949
|
+
node src/cli.js agent start --input review.json
|
|
950
|
+
node src/cli.js agent wait --id <review-id>
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
Installed packages use `roundtable agent` with the same arguments. Add `--port <number>` to
|
|
954
|
+
target another local server. `status --refresh` checks installed CLIs and cached account state;
|
|
955
|
+
`check` validates the request and estimates its size. Neither makes a model call. `start`,
|
|
956
|
+
`answer`, `resume` and `verdict` can cause calls under the review's existing limits.
|
|
957
|
+
|
|
958
|
+
Connected assistants use the same client through MCP. Start with `roundtable_guide` and
|
|
959
|
+
`roundtable_status`, then `roundtable_check` and `roundtable_start` with `{ "review": ... }`.
|
|
960
|
+
`roundtable_wait` takes `{ "id": "<review-id>" }`; after displaying questions it also takes
|
|
961
|
+
`afterRound`. `roundtable_answer` takes `{ "id": "...", "round": 0, "answers": [...] }`.
|
|
962
|
+
`roundtable_hold`, `roundtable_finish`, `roundtable_stop`, `roundtable_resume` and
|
|
963
|
+
`roundtable_verdict` expose the corresponding controls. All tools have typed input schemas
|
|
964
|
+
and return matching JSON text and `structuredContent`. No acceptance or export tool is exposed.
|
|
965
|
+
|
|
966
|
+
MCP replies identify `service: "roundtable"`; a started review has an id and board URL.
|
|
967
|
+
`nextAction` includes tool names and arguments for the question handoff. `completed` is true
|
|
968
|
+
only when the review is done **and** the chairman's verdict is ready. A returned id, completed
|
|
969
|
+
seat turn or timed-out wait is not completion. Keep waiting through `running` and `verdict`.
|
|
970
|
+
If synthesis failed, was skipped or the review was interrupted, report that limitation instead
|
|
971
|
+
of writing a replacement recommendation. `depth` reports planned critique rounds, attempted
|
|
972
|
+
rounds and completed rounds (including separate critique counts). A completed round has a
|
|
973
|
+
reply entry for every seat and at least one usable reply; an all-failed, invalid, PASS-only
|
|
974
|
+
or prohibited-tool round is attempted, not completed. Mixed rounds may still contain failed
|
|
975
|
+
seats, so report those limitations alongside depth. Report actual depth:
|
|
976
|
+
consensus can stop early, and zero critique rounds means the seats did not answer each other.
|
|
977
|
+
|
|
978
|
+
When `nextAction.type` is `ask_user`, the coordinator must actually ask `gate.questions`:
|
|
979
|
+
|
|
980
|
+
1. Use the host's available question/input tool. If there is no form, ask in normal chat.
|
|
981
|
+
Combine overlapping questions when useful, while retaining their IDs. A raw JSON dump
|
|
982
|
+
alone is not the question handoff.
|
|
983
|
+
2. Tell the person when `gate.autoContinueAt` expires and that the review will continue with
|
|
984
|
+
unanswered facts still unknown. Use only supplied facts; do not fill missing answers yourself.
|
|
985
|
+
3. If the person needs more time, send `agent hold --id <review-id> --input file` with
|
|
986
|
+
`{ "round": 0 }`. This renews the configured answer window, bounded by the wall clock.
|
|
987
|
+
Do not use it as a background keepalive. `nextAction.extend` provides the command and input.
|
|
988
|
+
4. With an asynchronous input tool, run `nextAction.waitCommand` while the prompt is pending.
|
|
989
|
+
It uses `wait --after-round <round>` to wait for another step without repeatedly returning
|
|
990
|
+
the same question. A timed-out read returns `nextAction.type: "await_user"`; keep the existing
|
|
991
|
+
prompt and wait again. When its window closes, report the outcome. Silence is not consent.
|
|
992
|
+
5. Before submitting a reply, read `agent status --id <review-id>`. If the round has advanced,
|
|
993
|
+
keep the user's reply and explain that it was not submitted. Do not attach it to different
|
|
994
|
+
question IDs or start another review automatically.
|
|
995
|
+
|
|
996
|
+
`nextAction.answerTemplate` and `nextAction.command` give the answer shape and agent subcommand.
|
|
997
|
+
Prefix subcommands with `node src/cli.js` from a checkout, or `roundtable` when installed.
|
|
998
|
+
Use the current question IDs and round number in an answer file:
|
|
999
|
+
|
|
1000
|
+
```json
|
|
1001
|
+
{ "round": 0, "answers": [{ "id": "q1", "text": "The deadline can move by a week." }], "message": "Keep the trial reversible." }
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
```bash
|
|
1005
|
+
node src/cli.js agent answer --id <review-id> --input answers.json
|
|
1006
|
+
node src/cli.js agent wait --id <review-id>
|
|
1007
|
+
node src/cli.js agent status --id <review-id>
|
|
1008
|
+
```
|
|
1009
|
+
|
|
1010
|
+
Every result with a review id also carries `board`, a link to that review on the local server.
|
|
1011
|
+
A person can open it in a browser to watch the review, answer questions or read the verdict
|
|
1012
|
+
while the agent keeps working. An agent should offer the link, not open it. Use the server that
|
|
1013
|
+
is already running; start one only when `status` cannot reach it.
|
|
1014
|
+
|
|
1015
|
+
`wait` returns at a question or completion, or after 25 seconds (configurable from 1 to 30 with
|
|
1016
|
+
`--seconds`). Reading never extends or continues a round; the server owns the timer. A timed
|
|
1017
|
+
checkpoint with no questions has `nextAction.type: "wait"`; keep waiting instead of asking for
|
|
1018
|
+
an empty confirmation. With `"unattended": true` in `options` the review
|
|
1019
|
+
never pauses: `wait` returns progress or completion, and the seats assume instead of asking.
|
|
1020
|
+
In attended reviews, read `status`, answer only from supplied facts, and ask for missing facts.
|
|
1021
|
+
Empty answers leave questions open. Stale-round answers fail
|
|
1022
|
+
without being sent. Writes are never retried automatically. Use `stop` to abort all calls,
|
|
1023
|
+
`resume` for an interrupted review, or `verdict` to request a missing verdict. Acceptance and
|
|
1024
|
+
export stay explicit user decisions.
|
|
1025
|
+
|
|
1026
|
+
The readable board conclusion does not change the agent response or verdict contract. Read the
|
|
1027
|
+
original verdict sections and option id as before; `NEEDED:` and `OPTIONAL:` inside
|
|
1028
|
+
`OPEN_QUESTIONS` distinguish material unknowns from further exploration. They do not reopen a
|
|
1029
|
+
finished review. Ask the user for missing facts before starting any requested follow-up.
|
|
1030
|
+
|
|
1031
|
+
Use `agent finish` when the user wants to end discussion and get a verdict. It requires a
|
|
1032
|
+
completed round with a usable reply and can start a chairman call. Use `agent stop` to abort
|
|
1033
|
+
everything. The current state's `actions` list tells you when `finish` is available.
|
|
1034
|
+
|
|
1035
|
+
Notes sent through `agent answer`, `agent finish`, `agent stop` and `agent resume` are labelled **Agent note**
|
|
1036
|
+
on the board. Notes you enter there keep **You said**. Prompts and exported records name the
|
|
1037
|
+
source as **Agent coordinator** or **Human**, including after reload. Direct API clients should
|
|
1038
|
+
send `"source":"agent"` with automated notes; an omitted source defaults to `human`.
|
|
1039
|
+
Older notes without a source keep their original human label; their author cannot be recovered.
|
|
1040
|
+
|
|
1041
|
+
The client reads the launch token from the loopback page and holds it in memory, or uses
|
|
1042
|
+
`ROUNDTABLE_TOKEN` when supplied. It never prints or stores the token. `--input -` accepts JSON
|
|
1043
|
+
on stdin. Keep real request and answer files outside a public repository.
|
|
1044
|
+
|
|
1045
|
+
`review.json` uses the same shape as the board. Select providers reported ready by `status`:
|
|
1046
|
+
|
|
1047
|
+
```json
|
|
1048
|
+
{
|
|
1049
|
+
"fieldNotes": {
|
|
1050
|
+
"decision": "Should we ship sync behind a flag?",
|
|
1051
|
+
"options": ["Ship it", "Wait", "Data model only"],
|
|
1052
|
+
"constraints": "One developer, three months."
|
|
1053
|
+
},
|
|
1054
|
+
"seats": [
|
|
1055
|
+
{ "vendor": "claude", "lens": "risk", "mood": { "preset": "grill" }, "model": "sonnet", "effort": "low" },
|
|
1056
|
+
{ "vendor": "claude", "lens": "cost", "mood": { "preset": "builder" }, "model": "sonnet", "effort": "low" }
|
|
1057
|
+
],
|
|
1058
|
+
"chairman": { "vendor": "claude", "model": "sonnet", "effort": "medium" },
|
|
1059
|
+
"options": { "critiqueRounds": 1, "memory": "stateless", "budget": { "claude": { "tokens": 120000 } } }
|
|
1060
|
+
}
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
Attended requests can set `options.autoContinueMs` (default 15000) and `options.questionWaitMs`
|
|
1064
|
+
(default 120000), each from 100 to 600000 milliseconds. Both are ignored in unattended mode.
|
|
1065
|
+
The overall wall clock remains a hard limit, including response windows and extensions.
|
|
1066
|
+
|
|
1067
|
+
### Choose the review depth
|
|
1068
|
+
|
|
1069
|
+
The cost of a review is the number of calls, not the length of the request. Each seat call
|
|
1070
|
+
carries the provider's own overhead before the field notes arrive, so one more seat or round
|
|
1071
|
+
costs far more than one more sentence of context. `agent --help` repeats this recipe:
|
|
1072
|
+
|
|
1073
|
+
- **Size.** Normally use two seats, `critiqueRounds` 1 (the engine default), `memory` stateless
|
|
1074
|
+
and a budget per vendor: up to five calls before any repairs. Use zero critique rounds for
|
|
1075
|
+
a requested quick comparison and disclose that the seats will not respond to each other.
|
|
1076
|
+
Two critique rounds can suit a requested deep review or several consequential trade-offs,
|
|
1077
|
+
within the person's time and budget. Consensus may end early. Do not automatically start
|
|
1078
|
+
a second review or exceed agreed limits because disagreement remains.
|
|
1079
|
+
- **Lenses.** Give every seat a different lens, taken from what the decision could get wrong:
|
|
1080
|
+
risk, cost, evidence, reversibility, long-term effects, user impact. Two seats with the same
|
|
1081
|
+
lens mostly agree, which wastes a call.
|
|
1082
|
+
- **Moods.** Pair one sceptical seat (`grill`) with one practical seat (`builder`). Use
|
|
1083
|
+
`steelman` when the user already leans one way, and `contrarian` when the seats would
|
|
1084
|
+
otherwise agree too early.
|
|
1085
|
+
- **Effort and model.** `effort` low and the lightest model that `status` lists for the seats.
|
|
1086
|
+
Give the chairman one effort step more than the seats (medium when they run low): it judges
|
|
1087
|
+
the arguments rather than counting them, and at low effort it tends to dismiss the hardest
|
|
1088
|
+
objection in a word. Raise one seat, not all, when the decision is hard to reverse.
|
|
1089
|
+
- **Context.** `constraints`, `known`, `assumed`, `reversibility` and `deadline` go into every
|
|
1090
|
+
prompt. Fill them only with facts the user stated. A guess belongs under `assumed`, never
|
|
1091
|
+
under `known`, and an empty field is better than an invented one.
|
|
1092
|
+
- **Agreement.** When `gate.reopenCalls` appears, every seat already agrees. Answers with empty
|
|
1093
|
+
text and no message go straight to the verdict. Any answer text or message runs one more
|
|
1094
|
+
round, at that many calls. Send text only when it could change a position. A fact that only
|
|
1095
|
+
confirms what the seats said can wait for the verdict.
|
|
1096
|
+
|
|
1097
|
+
A seat that writes more bullets than the format allows is trimmed to the limit instead of being
|
|
1098
|
+
asked again. The full reply text stays on the board.
|
|
1099
|
+
|
|
1100
|
+
The older `npm run debate -- --token <hex> < review.json` runner is still available for
|
|
1101
|
+
unattended scripts. It automatically continues through questions; use `agent` for interactive
|
|
1102
|
+
reviews that need answers. The startup line supplies its token, or use `ROUNDTABLE_TOKEN`.
|
|
1103
|
+
|
|
1104
|
+
## 9. When something goes wrong
|
|
1105
|
+
|
|
1106
|
+
Failed Start, Continue, Resume, Stop, acceptance and export requests show an error beside the
|
|
1107
|
+
action. The board keeps your note or target path until the request is acknowledged and blocks
|
|
1108
|
+
duplicate submissions while it is pending. Keyboard focus stays on an effort control when its
|
|
1109
|
+
value changes. The effort squares have larger click targets than their visible marks.
|
|
1110
|
+
|
|
1111
|
+
A connection error or a 15-second action-request timeout does not prove the server rejected
|
|
1112
|
+
the action: it may already be running or saved. Roundtable does not retry these writes
|
|
1113
|
+
automatically. Check the current board or recent history before retrying. This browser timeout
|
|
1114
|
+
does not cancel model work on the server. If the page reports an expired launch token, copy
|
|
1115
|
+
unsent notes and reload. A failed history load says **unavailable**, with **Retry history**;
|
|
1116
|
+
it does not claim your records are gone. A setup-load failure offers **Reload**.
|
|
1117
|
+
|
|
1118
|
+
### Known issues
|
|
1119
|
+
|
|
1120
|
+
Each entry carries the date it was written, so a stale one shows. An entry leaves when a
|
|
1121
|
+
release can show it no longer applies.
|
|
1122
|
+
|
|
1123
|
+
**Codex calls can stall** (noted 2026-11-04; seen since late October 2026). A Codex request
|
|
1124
|
+
sometimes streams nothing for a long time after it is accepted, or a web search starts and never
|
|
1125
|
+
returns. It happens on every Codex model, for seats and the searcher alike, and with a direct
|
|
1126
|
+
`codex exec` call on the same account and network, so it is not specific to Roundtable's
|
|
1127
|
+
settings. What you see: a **Reconnecting** notice on the card, a reconnect count on the reply,
|
|
1128
|
+
a searcher started once more, or a reply that takes 15 to 30 seconds longer than usual.
|
|
1129
|
+
|
|
1130
|
+
What Roundtable does: streams Codex replies over WebSocket, so a response that never starts is
|
|
1131
|
+
caught; reconnects a silent low-effort call after 15 seconds of silence, up to five times;
|
|
1132
|
+
counts a searcher's reconnects as progress and starts the searcher once more when its call made
|
|
1133
|
+
no progress for 40 seconds; asks the Codex searcher for one search call carrying its queries.
|
|
1134
|
+
|
|
1135
|
+
What it cannot do: once the reconnects are used up, Codex falls back to HTTPS, where a response
|
|
1136
|
+
that never starts is bounded only by the call limit. Seats at medium effort and above keep the
|
|
1137
|
+
longer idle limit (95 seconds at the default call limit), so a silent stall there costs more. A
|
|
1138
|
+
seat whose request stays busy without progress has no watchdog; only the call limit ends it.
|
|
1139
|
+
|
|
1140
|
+
If a review keeps stalling: seat another vendor for that round, keep the searcher at low effort,
|
|
1141
|
+
keep the call limit at its default rather than raising it, and follow the connection checks
|
|
1142
|
+
below. Save the error log if you report it.
|
|
1143
|
+
|
|
1144
|
+
### Regional availability and stalled connections
|
|
1145
|
+
|
|
1146
|
+
A provider can accept a connection and then stop delivering the reply. Repeated reconnects,
|
|
1147
|
+
partial replies or timeouts can therefore occur even with a valid login and a green status
|
|
1148
|
+
lamp. Increasing the time limit or retrying does not establish that the connection is healthy.
|
|
1149
|
+
|
|
1150
|
+
1. Check the vendor's current regional availability and service status for your product and
|
|
1151
|
+
account. You can choose another available vendor for a seat or chairman.
|
|
1152
|
+
2. Compare a small direct CLI call using the same account, terminal and network. A real model
|
|
1153
|
+
call uses quota. If it also stalls outside Roundtable, investigate the provider or network
|
|
1154
|
+
path before changing review limits. A successful direct call alone does not rule out an
|
|
1155
|
+
intermittent connection problem.
|
|
1156
|
+
3. If needed, temporarily compare another network you normally use, then restore your settings.
|
|
1157
|
+
Keep this a diagnostic comparison, not a requirement to enable a VPN for every user.
|
|
1158
|
+
Save the Roundtable error log and record the OS, Node and CLI versions, failure time and
|
|
1159
|
+
whether the direct call also failed. Exclude credentials and private review content.
|
|
1160
|
+
|
|
1161
|
+
### Error logs
|
|
1162
|
+
|
|
1163
|
+
Codex calls disable analytics and telemetry exports, shell snapshots and unlimited connection
|
|
1164
|
+
retries for that process only. After a complete answer and valid usage arrive, Roundtable gives
|
|
1165
|
+
the CLI one second to exit and then terminates a stuck process while preserving the result.
|
|
1166
|
+
It continues checking tool policy and stream validity during that grace period. A partial
|
|
1167
|
+
answer, missing usage or a failed turn cannot use this shortcut. Timeouts before completion
|
|
1168
|
+
remain failures with unknown spending where the provider reported none. Ordinary seat and
|
|
1169
|
+
chairman timeouts are not retried automatically; the searcher's bounded restart is described
|
|
1170
|
+
above. Search and reconnect stages in the error details help distinguish these from slow
|
|
1171
|
+
model replies. These controls do not guarantee the provider's availability.
|
|
1172
|
+
|
|
1173
|
+
A Codex reply streams over WebSocket through a provider entry Roundtable names per call, pointing
|
|
1174
|
+
at the same ChatGPT backend with the same login. A response can take minutes to start; over
|
|
1175
|
+
WebSocket the idle limit runs from the moment the request is sent, so that wait is caught like a
|
|
1176
|
+
silent stream. When the stream stays silent for the idle limit, (call limit − 15 s) ÷ 3, between
|
|
1177
|
+
10 s and 300 s: 95 s at the default five-minute call limit, the CLI reconnects and starts the
|
|
1178
|
+
answer again, at most twice; once those are used up the call fails as a stalled connection,
|
|
1179
|
+
before the call limit. The provider may charge interrupted attempts without including them in
|
|
1180
|
+
the reported usage. Raising the call limit also lengthens the idle limit, allowing more time for
|
|
1181
|
+
silent reasoning at high effort. A call at low effort (or none or minimal) answers within
|
|
1182
|
+
seconds once its request streams, so it reconnects after 15 seconds of silence instead, at most
|
|
1183
|
+
five times (the derived limit when a tight call limit makes that shorter). Once the reconnects
|
|
1184
|
+
are used up over WebSocket, the CLI falls back to HTTPS for the rest of the call, where the idle
|
|
1185
|
+
timer starts only after response headers; a WebSocket that does not open within 10 seconds does
|
|
1186
|
+
the same. Roundtable's overall call limit still bounds the process. Every reconnect is counted,
|
|
1187
|
+
including the first WebSocket retry that Codex leaves out of its events (Roundtable reads it from
|
|
1188
|
+
Codex's retry log): a reply that came after one carries a
|
|
1189
|
+
**reconnected ×N** mark on its card, and the count is saved with the attempt, where failure
|
|
1190
|
+
details, error logs and the agent state show it. The markdown transcript does not carry it.
|
|
1191
|
+
|
|
1192
|
+
Provider failure **Details** show whether output arrived, the last observed stage, elapsed
|
|
1193
|
+
and idle time, and the exit code when available. A timeout after reasoning is evidence that
|
|
1194
|
+
the call started; it does not identify why the provider stalled. Save the error log before
|
|
1195
|
+
retrying. A complete usage report received before the stall still counts, while missing
|
|
1196
|
+
usage continues to block capped calls. Ordinary seat and chairman timeouts are not
|
|
1197
|
+
automatically retried.
|
|
1198
|
+
|
|
1199
|
+
Errors include a reference such as `RT-0123456789abcdef`. **Save error log**, available on
|
|
1200
|
+
setup and review screens, downloads a JSON file you can share for diagnosis. Note what you
|
|
1201
|
+
were doing and the reference ID. Nothing is sent to an assistant or maintainer automatically.
|
|
1202
|
+
An assistant working in your local checkout can inspect the same log when you ask it to.
|
|
1203
|
+
|
|
1204
|
+
Server, provider, storage and browser failures are recorded in `_diagnostics/` inside the
|
|
1205
|
+
active data folder. Two rotating files hold up to 512 KiB total; the server accepts at most
|
|
1206
|
+
120 entries per minute and reports omitted entries in the download. Logs survive restarts.
|
|
1207
|
+
They contain fixed error categories, action names, reference IDs, provider names, timestamps,
|
|
1208
|
+
app/runtime versions and source line numbers. They exclude prompts, replies, titles, account
|
|
1209
|
+
names, model IDs, URLs, credentials, raw error messages and personal filesystem paths.
|
|
1210
|
+
Transcripts and terminal output are separate and can contain private review data.
|
|
1211
|
+
|
|
1212
|
+
If the server is unreachable, the browser keeps up to 20 sanitized events in this tab's
|
|
1213
|
+
session storage and retries diagnostic delivery. They survive a reload, but closing the tab
|
|
1214
|
+
can discard unsent entries. A download includes entries still waiting to be saved. If the
|
|
1215
|
+
page says it cannot write the log, check disk space and data-folder permissions. You can
|
|
1216
|
+
delete `_diagnostics/` while the server is stopped without deleting reviews.
|
|
1217
|
+
|
|
1218
|
+
Before a debate, each seat card's round lamp says whether that seat can take a call, checked
|
|
1219
|
+
for free (no model call): green ready, yellow nearly out of quota or unknown, red not installed,
|
|
1220
|
+
not logged in or out of quota (with the reset time), grey not checked yet. **Open the table**
|
|
1221
|
+
names any red seat and asks once more before it starts.
|
|
1222
|
+
|
|
1223
|
+
Use **Refresh status** after signing in or changing an account. It runs free status checks,
|
|
1224
|
+
shows when they finish, and reports a failed refresh. Results are reused for a minute unless
|
|
1225
|
+
you refresh explicitly; repeated explicit refreshes within five seconds reuse the same check.
|
|
1226
|
+
Overlapping requests for one pool share work. At most two pool checks run at once, with twelve
|
|
1227
|
+
running or queued; if busy, try Refresh status again shortly. API endpoint checks validate the
|
|
1228
|
+
URL and key-variable presence without sending a request to the endpoint.
|
|
1229
|
+
|
|
1230
|
+
For local scripts, `GET /api/preflight?pools=claude,codex` only reads cached snapshots: it never
|
|
1231
|
+
launches a CLI, even with `?fresh`. `checkedAt: null` means no check yet; `stale: true` means
|
|
1232
|
+
there is no current snapshot. Refresh with an authenticated JSON `POST /api/preflight`, using
|
|
1233
|
+
`{"pools":["claude","codex"],"fresh":true}` and the launch token in `x-roundtable-token`.
|
|
1234
|
+
|
|
1235
|
+
| what you see | what to do |
|
|
1236
|
+
|---|---|
|
|
1237
|
+
| A seat's lamp is red: "not logged in" | Run the command it names (`claude /login`, `codex login`) in a terminal. |
|
|
1238
|
+
| A seat's lamp is red: "quota used up" | Wait for the reset it shows, use another vendor for that seat, or seat a second account (step 7). |
|
|
1239
|
+
| `doctor` says a CLI is not found | Install it (step 2) or fix your PATH; for `agy`, run `agy install`. |
|
|
1240
|
+
| An API seat's lamp is red: "… is not set in the environment" | Set that variable in the shell you start roundtable from (`set DEEPSEEK_API_KEY=…` on Windows, `export …` elsewhere) and start it again. The board cannot read it for you. |
|
|
1241
|
+
| An API seat shows "could not reach" or an HTTP status | Nothing listens at that URL (start the local server, check the port and the `/v1` suffix), or the endpoint refused the call (`401` a wrong key, `402` no credit, `429` a quota or a rate limit that one short wait did not lift, `404` a model id the server does not know). The seat's card quotes the server's own words. |
|
|
1242
|
+
| A red "out" banner on the board | A vendor ran out of quota or lost its login mid-debate. Its seats are skipped from then on (no call, no tokens). For Antigravity the banner can name one model group ("Antigravity · Gemini 4 Argon out"): only seats on that group's models are skipped. If fewer than two seats are left, the debate stops and the chairman writes from what was said. |
|
|
1243
|
+
| A seat shows "no reply" in red | Its call failed this round; the card gives a next step, with the CLI's own words under "details". Network failures may retry once if the budget and time limit allow it. The others carry on. |
|
|
1244
|
+
| The verdict failed, or was not written | **Write the verdict with** a vendor of your choice, under the bar. If the chairman's vendor ran out, another one is preselected. |
|
|
1245
|
+
| "reconnecting" banner | The board lost the server. The debate keeps running there; the board catches up when the connection is back. The banner clears even while waiting for input with no new events. |
|
|
1246
|
+
| A seat is "re-prompted" | Its reply broke the format. It gets one format repair. Tool activity instead stops the seat without a retry. |
|
|
1247
|
+
| A seat is "reconnected ×1" | Its provider connection went silent for the idle limit and the CLI started the answer again. The reply is complete; the interrupted attempt may have been charged without appearing in usage. Repeated marks on one vendor point at the provider, not at the seat. |
|
|
1248
|
+
| "address already in use" | Another server is on that port. Stop it, or start with a different `PORT`. |
|
|
1249
|
+
| The board says the debate is unknown | The server was restarted. Reopen the address; the board replays from disk and offers Resume. |
|
|
1250
|
+
| A vendor's remaining quota shows nothing | Use **Refresh status**. A free read without limits leaves quota unavailable or keeps the last figure; it does not disable later reads or require a model call. Claude and Antigravity use their CLI's `/usage`; Codex uses its account rate-limit command and may show only a weekly window. Antigravity needs agy 1.1.11 or later, a sign-in and the account acknowledgment. If the console says quota reads are off, restart after checking that the CLI answers its local usage command without a model turn. |
|
|
1251
|
+
|
|
1252
|
+
## Where things live
|
|
1253
|
+
|
|
1254
|
+
| what | where |
|
|
1255
|
+
|---|---|
|
|
1256
|
+
| Live debates (transcript, field notes, verdict) | `live/` in the Roundtable user-data folder, unless `ROUNDTABLE_DEBATES_DIR` is set |
|
|
1257
|
+
| Demo debates | `demo/` in the same user-data folder, unless the override is set |
|
|
1258
|
+
| Retained usage statistics | `_usage.json` in the data folder; counters and model IDs, without review text |
|
|
1259
|
+
| Measured quota rates and entered pool figures | `_calibration.json` and `_pools.json` in the live data folder; demo names include `.fake` |
|
|
1260
|
+
| Your acknowledgment of Antigravity's terms notice | `_terms.json` in the live data folder (`_terms.fake.json` in the demo folder): when, and which notice |
|
|
1261
|
+
| Saved setup preferences | browser local storage, separate for each host and port |
|
|
1262
|
+
| Account profiles | `%USERPROFILE%\.roundtable\homes` on Windows, `~/Library/Application Support/roundtable/homes` on macOS, `~/.local/share/roundtable/homes` on Linux |
|
|
1263
|
+
| Decision records you exported | the folder you chose |
|
|
1264
|
+
|
|
1265
|
+
The user-data folder is `%USERPROFILE%\.roundtable` on Windows,
|
|
1266
|
+
`~/Library/Application Support/Roundtable` on macOS, and `$XDG_DATA_HOME/roundtable` on Linux
|
|
1267
|
+
(or `~/.local/share/roundtable` when XDG_DATA_HOME is unset). It stays the same across checkout
|
|
1268
|
+
changes. On Windows it is not under AppData: Windows redirects the AppData writes of anything
|
|
1269
|
+
started from a packaged app, such as the Claude or Codex desktop app and the terminals they
|
|
1270
|
+
open, into a private copy for that app, so each app would see its own history. An absolute `ROUNDTABLE_DEBATES_DIR` selects another location; use distinct paths for
|
|
1271
|
+
demo and live data. Only one server can use a data folder at a time, even on different ports.
|
|
1272
|
+
|
|
1273
|
+
The live diagnostic check (`doctor --live`) keeps its working files under `_doctor/` in the
|
|
1274
|
+
same live folder. The headless discussion script reads calibration from that folder too.
|
|
1275
|
+
|
|
1276
|
+
### Delete and clear history
|
|
1277
|
+
|
|
1278
|
+
Use **Delete** beside a saved session, then confirm its title. **Clear** confirms the number
|
|
1279
|
+
of finished and interrupted sessions selected (up to 1,000 per batch); running sessions are
|
|
1280
|
+
kept, including those waiting for your answers. The server rechecks the selection, including
|
|
1281
|
+
a session that started writing a new verdict after the list
|
|
1282
|
+
loaded. A stale selection is refused before any selected session is removed.
|
|
1283
|
+
|
|
1284
|
+
Deleting removes the local transcript, recovery copies and seat working files. It does not
|
|
1285
|
+
remove files you exported, quota calibration or usage statistics. Token estimates retain the
|
|
1286
|
+
recorded calls after cleanup and restart. A statistics-write failure prevents deletion. Open
|
|
1287
|
+
tabs showing a deleted session return to the list without a deletion banner. Corrupt records
|
|
1288
|
+
must be repaired first so their reported usage can be retained. Browser preferences and
|
|
1289
|
+
provider histories are separate.
|
|
1290
|
+
|
|
1291
|
+
### Move older history
|
|
1292
|
+
|
|
1293
|
+
Older versions kept history in a checkout's `debates/` folder, and on Windows in
|
|
1294
|
+
`%LOCALAPPDATA%\Roundtable`. A server started from a packaged app wrote that AppData folder into
|
|
1295
|
+
the app's private copy instead, under `%LOCALAPPDATA%\Packages\<app>\LocalCache\Local\Roundtable`,
|
|
1296
|
+
so one machine can hold several copies with different reviews. At startup Roundtable lists every
|
|
1297
|
+
such folder that holds a review the current data folder lacks, in the terminal and under
|
|
1298
|
+
**Local data and backups**. It never moves, merges or deletes them itself.
|
|
1299
|
+
|
|
1300
|
+
To move them, stop every server using an old folder. Move each review folder (the dated ones
|
|
1301
|
+
with a `transcript.jsonl`) into `live/`, or into `demo/` for `debates-fake/` and the old `demo/`
|
|
1302
|
+
folders. If a folder with the same name is already in the destination, do not replace it: leave
|
|
1303
|
+
the old one where it is and compare the two. When the destination has no
|
|
1304
|
+
`_calibration.json`, `_usage.json` or `_pools.json` yet, move the old one too; otherwise keep the
|
|
1305
|
+
destination's. Usage is recounted from the moved reviews at startup, and quota rates relearn as
|
|
1306
|
+
debates run. Start the server and check that the old folders are no longer listed and the
|
|
1307
|
+
saved-session count is right. A folder whose reviews have all been moved is not listed again.
|
|
1308
|
+
You can instead move everything to a new folder and select it with `ROUNDTABLE_DEBATES_DIR`.
|
|
1309
|
+
|
|
1310
|
+
### Back up and restore
|
|
1311
|
+
|
|
1312
|
+
1. Check the actual data folder in **Local data and backups** or the startup terminal. Stop
|
|
1313
|
+
every Roundtable server using that folder with Ctrl+C before copying it.
|
|
1314
|
+
2. Copy the **entire folder** to a private backup location. Include `transcript.jsonl`, any
|
|
1315
|
+
`transcript.recovery-*.jsonl` files, field notes, verdicts, calibration/pool files and seat
|
|
1316
|
+
folders. Keep exported decision folders separately if you need them too. These files can
|
|
1317
|
+
contain private prompts and responses.
|
|
1318
|
+
3. To test a restore, copy the backup into a **new, empty directory**. Keep the original data
|
|
1319
|
+
folder unchanged. Set `ROUNDTABLE_DEBATES_DIR` to the restored copy and use a spare port.
|
|
1320
|
+
|
|
1321
|
+
For a synthetic backup on PowerShell, replace the example path with your restored demo folder:
|
|
1322
|
+
|
|
1323
|
+
```powershell
|
|
1324
|
+
$env:ROUNDTABLE_DEBATES_DIR='C:\roundtable-restore\demo'
|
|
1325
|
+
$env:PORT='4750'
|
|
1326
|
+
npm run fake -- --no-open
|
|
1327
|
+
```
|
|
1328
|
+
|
|
1329
|
+
For bash or zsh:
|
|
1330
|
+
|
|
1331
|
+
```bash
|
|
1332
|
+
ROUNDTABLE_DEBATES_DIR='/path/to/restored-demo' PORT=4750 npm run fake -- --no-open
|
|
1333
|
+
```
|
|
1334
|
+
|
|
1335
|
+
Open http://localhost:4750. Confirm the data folder, open a saved debate, check its notes,
|
|
1336
|
+
verdict and human decision, then export to a new test folder. A live backup uses
|
|
1337
|
+
`npm start -- --no-open` instead. Reading history does not start model calls; Resume and
|
|
1338
|
+
Write the verdict can. Stop the restore server when finished. Use a fresh terminal for normal
|
|
1339
|
+
launches so the temporary environment settings do not redirect your next session.
|
|
1340
|
+
|
|
1341
|
+
Browser preferences and provider logins are not part of this backup. The restored debates
|
|
1342
|
+
contain their own saved configuration. A new browser address starts with fresh preferences;
|
|
1343
|
+
sign in through the vendor's own CLI if its login is missing. Do not copy login files as part
|
|
1344
|
+
of a debate restore.
|