@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.
Files changed (70) hide show
  1. package/CHANGELOG.md +529 -0
  2. package/LICENSE +21 -0
  3. package/README.md +189 -3
  4. package/SECURITY.md +299 -0
  5. package/docs/workflow.md +1344 -0
  6. package/package.json +52 -6
  7. package/scripts/agent.mjs +40 -0
  8. package/scripts/export.mjs +20 -0
  9. package/scripts/mcp.mjs +175 -0
  10. package/scripts/run-debate.mjs +70 -0
  11. package/scripts/server.mjs +28 -0
  12. package/scripts/setup.mjs +182 -0
  13. package/skills/roundtable/SKILL.md +57 -0
  14. package/src/adapters/agy.js +7 -0
  15. package/src/adapters/catalogue.js +49 -0
  16. package/src/adapters/claude.js +6 -0
  17. package/src/adapters/codex.js +6 -0
  18. package/src/adapters/common.js +304 -0
  19. package/src/adapters/config.js +432 -0
  20. package/src/adapters/endpoint.js +178 -0
  21. package/src/adapters/errors.js +69 -0
  22. package/src/adapters/index.js +11 -0
  23. package/src/adapters/models.js +106 -0
  24. package/src/adapters/quota.js +305 -0
  25. package/src/adapters/spawn.js +178 -0
  26. package/src/agent-client.js +108 -0
  27. package/src/cli.js +44 -0
  28. package/src/contract.js +256 -0
  29. package/src/diagnostics.js +133 -0
  30. package/src/doctor.js +101 -0
  31. package/src/engine.js +902 -0
  32. package/src/estimate.js +331 -0
  33. package/src/export.js +307 -0
  34. package/src/fake.js +75 -0
  35. package/src/folder-picker.js +46 -0
  36. package/src/history.js +220 -0
  37. package/src/local-http.js +39 -0
  38. package/src/local-server.js +110 -0
  39. package/src/notes.js +16 -0
  40. package/src/personas.js +49 -0
  41. package/src/preflight.js +126 -0
  42. package/src/progress.js +30 -0
  43. package/src/prompts.js +278 -0
  44. package/src/research.js +113 -0
  45. package/src/review-view.js +157 -0
  46. package/src/seats.js +272 -0
  47. package/src/server.js +928 -0
  48. package/src/settings.js +27 -0
  49. package/src/setup-toml.js +124 -0
  50. package/src/snapshot.js +93 -0
  51. package/src/store.js +303 -0
  52. package/src/terminal.js +77 -0
  53. package/src/terms.js +52 -0
  54. package/src/ui/app.js +1967 -0
  55. package/src/ui/avatars.js +132 -0
  56. package/src/ui/ceremony.js +87 -0
  57. package/src/ui/design/app.css +714 -0
  58. package/src/ui/design/preset-dusk.css +91 -0
  59. package/src/ui/design/tokens.css +129 -0
  60. package/src/ui/diagnostics.js +61 -0
  61. package/src/ui/help.js +122 -0
  62. package/src/ui/icons.js +64 -0
  63. package/src/ui/index.html +272 -0
  64. package/src/ui/loader.js +73 -0
  65. package/src/ui/logo.svg +4 -0
  66. package/src/ui/scan.js +57 -0
  67. package/src/ui/scribe.js +64 -0
  68. package/src/ui/sound.js +80 -0
  69. package/src/validate.js +112 -0
  70. package/src/version.js +5 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,529 @@
1
+ # Changelog
2
+
3
+ ## 0.6.4
4
+
5
+ ### Terminal
6
+
7
+ - Report only the provider CLIs found on this machine: `roundtable doctor` lists missing ones
8
+ in a single line instead of a block each (`--vendor <name>` still shows the full block), and
9
+ foreground startup prints a `providers:` line in the seat colours instead of a failed quota
10
+ read for every CLI that is not installed.
11
+ - Always print how to open the board and that Ctrl+C stops it, including with `--no-open`.
12
+ - Say plainly when the port cannot be taken: in use, or a sandbox that forbids a local server
13
+ (`EPERM`), with the `roundtable server start` way out. The MCP tools and `roundtable server
14
+ start` report that last line within seconds instead of waiting out the readiness timeout,
15
+ while two hosts starting the board at once both get the one that won the port.
16
+ - Blink the block cursor beside the wordmark where the terminal allows blinking text, and show
17
+ vendor names in their seat colours.
18
+
19
+ ## 0.6.3
20
+
21
+ ### Assistant integration
22
+
23
+ - Add `roundtable setup` to connect user-level MCP tools and a workflow skill for Codex,
24
+ Claude Code and Antigravity across projects. Include checks and removal, preserve unrelated
25
+ settings and refuse to overwrite edited entries. No automatic npm install hook is added.
26
+ - Add a dependency-free stdio MCP adapter using the existing JSON client. Start a hidden
27
+ local board on demand, expose questions and bounded extensions, and keep reviews running
28
+ when the host disconnects. Report completion only after a ready chairman verdict.
29
+ - Recommend one critique round for normal agent reviews and reserve zero for quick
30
+ comparisons. Report actual completed rounds so agents cannot mistake blind positions
31
+ for a discussion. Bundle the skill in the npm payload and test installation outside a checkout.
32
+ - Count attempted rounds separately from rounds with usable replies, so failed critiques do
33
+ not inflate review depth. Share the HTTP client and validation bounds between MCP and CLI;
34
+ remove the subprocess watchdog that could interrupt a valid long wait.
35
+ - Check server health without waiting for provider catalogues; retry transient readiness
36
+ errors and refuse incompatible versions, modes or explicit storage directories. Add idle-only
37
+ server status/start/stop/restart commands for installed updates.
38
+ - Preserve all unmanaged TOML declaration forms, literal dollar strings, selected modes and
39
+ ports. Honor Claude profile overrides, check the Node executable and repair missing managed
40
+ files. Test a real npm archive installation after moving its source checkout.
41
+
42
+ ### Review workflow
43
+
44
+ - Make attended checkpoints finite in both the browser and agent client: 15 seconds for a
45
+ correction window and two minutes for a question by default, configurable separately.
46
+ An unanswered window continues with unknowns intact; it never supplies an answer or accepts
47
+ the recommendation. The hard wall clock still applies.
48
+ - Replace permanent holds on incidental browser clicks with bounded extensions while writing
49
+ or requesting More time. Show question countdowns, draw attention in the tab title, and
50
+ retain automatic-continuation notices after reload.
51
+ - Return an explicit question handoff, answer template, deadline and commands to coordinating
52
+ agents. Add `agent hold` for a bounded extension and `wait --after-round` to await a response
53
+ without asking the same question again. Empty checkpoints need no user confirmation.
54
+
55
+ ### Documentation
56
+
57
+ - Add Linux first-connection steps, including a direct GitHub archive install, assistant
58
+ registration, discovery checks and a provider-free demo.
59
+ - Show the app's pixel logo tile in interactive help and foreground startup, drawn with half
60
+ blocks in the orchid and aubergine of the board header, with the wordmark and installed
61
+ version beside it. Respect terminal width, UTF-8 support and `NO_COLOR`; keep redirected
62
+ output and machine protocols undecorated.
63
+ - Add a Known issues entry to the guide, linked from the README: Codex calls can stall, what
64
+ Roundtable does about it and what it cannot do.
65
+
66
+ ## 0.6.2
67
+
68
+ - Simplify model names to default and lightest annotations, removing inferred plan restrictions.
69
+ - Let Claude's next quota refresh recover after a free `/usage` answer without limits.
70
+ Keep the safeguards for answers that may have called a model.
71
+ - Show the latest quota on every provider card and replace the first-call promise with
72
+ "quota unavailable" when no figure is known.
73
+ - Make Clear include interrupted sessions as well as finished ones. Running reviews and
74
+ reviews waiting for input remain protected, with the full selection checked before deletion.
75
+ - Remove deletion success banners from the history list.
76
+ - Clarify that usage statistics describe your own agents' Roundtable calls, stay on your
77
+ machine, and are not sent to Roundtable's developers. Document restarting after updates.
78
+ - Take the version shown in the board footer and sent in the Codex app-server handshake from
79
+ `package.json`; both still said 0.6.1.
80
+
81
+ ### Review fixes
82
+
83
+ - Stream Codex replies over WebSocket, so a response that never starts is caught. A request
84
+ can be held for minutes before its response starts (one traced call: 173 seconds). Over SSE,
85
+ Codex starts its idle timer only once response headers arrive, so that wait had no limit short
86
+ of Roundtable's call limit; over WebSocket the timer starts when the request is sent. Against a
87
+ local server that never answers, SSE waited until it was killed, while WebSocket reconnected at
88
+ each idle limit. On the real backend, 18 WebSocket calls at low, medium and high effort all
89
+ answered, with no reconnect on a healthy call; the three stalls were resent at their idle
90
+ limit. After its reconnects Codex falls back to HTTPS for the rest of the call, where the wait
91
+ for response headers is again bounded only by the call limit, and a WebSocket that does not
92
+ open within 10 seconds does the same. Reconnects are now counted from Codex's retry log too,
93
+ since its events leave out the first WebSocket retry.
94
+ - Reconnect a silent Codex request after 15 seconds instead of up to 95. Each request a Codex
95
+ call makes either streams within a few seconds or stays silent, on every model and search mode
96
+ tried, through `codex exec` and `codex app-server` alike, with or without Roundtable's
97
+ settings. A Codex seat, chairman or searcher at low effort (or none or minimal) now reconnects
98
+ after 15 seconds of silence, up to five times, and a reconnect resends only the silent request.
99
+ This does not make stalls rarer (in testing, 15, 35 and 60 second limits each saw one or two
100
+ slow calls in eight); it makes a silent one cost about 15 seconds instead of 95 for a seat at
101
+ the default call limit, where stalled low-effort seats took 101 to 220 seconds. Other efforts
102
+ keep the limit derived from the call limit, since a request that reasons longer may stay silent
103
+ while healthy (GPT-6.1 Sol at high effort sent no stream events for 15 to 17 seconds).
104
+ - Count a Codex searcher's reconnect notices as progress, and start once more a searcher call
105
+ whose reconnects all failed. The reconnects are bounded, and a reconnect keeps a finished
106
+ search, so stopping the call at a reconnect threw that search away. The fresh attempt follows
107
+ the 0.6.1 rules: at least 30 seconds must remain, and both attempts share the time limit.
108
+ - Keep a search whose sources include a date the searcher could not give as a real `YYYY-MM-DD`
109
+ date. One such date (a month only, a year only, "unknown") used to reject the whole source
110
+ bundle and stop the review before discussion; that source's date is now saved as not reported
111
+ and the other sources keep theirs.
112
+
113
+ ### Security and usage
114
+
115
+ - Ask a Codex searcher for one search call carrying several queries. Each further call is another
116
+ request that can stall, and it resends everything gathered so far: input grew from about 22k
117
+ tokens for one search to 103k for four. In testing, one call returned as many sources (3 on
118
+ average) at 23k input tokens on average instead of 35k, with a median of 13 seconds instead of
119
+ 41. The search limit is unchanged: a second call is still allowed when the first returned
120
+ nothing usable. Claude and Antigravity search one query per call and get no such hint.
121
+
122
+ ## 0.6.1
123
+
124
+ ### Security and usage
125
+
126
+ - Require acknowledgment of Antigravity's account-risk notice before provider calls, model
127
+ lists or quota reads. Google's [FAQ](https://antigravity.google/docs/faq) says third-party
128
+ wrappers are unsupported under consumer plans and third-party access can lead to account
129
+ suspension or termination. The board records the acknowledgment locally; it can be
130
+ withdrawn and is requested again when the notice is updated.
131
+ - **Upgrading Antigravity workflows:** agent requests now need
132
+ `options.acknowledgeTermsRisk: true`, after the person agrees. `doctor` needs
133
+ `--acknowledge-terms-risk` for anything beyond `agy --version`. These are separate from
134
+ limited-isolation consent. See the [setup guide](docs/workflow.md#antigravity-google).
135
+
136
+ ### Review fixes
137
+
138
+ - Restore GPT-6.1 Terra in the Codex picker and order model families from stronger to lighter,
139
+ keeping plan restrictions visible. Custom model IDs remain editable instead of reverting to Default.
140
+ - Align card controls and effort indicators; put provider warnings in an expandable row.
141
+ Refresh the status after an account notice is acknowledged or withdrawn.
142
+ - Start the searcher query from the question and options, with a preview and an editable custom query.
143
+ Other context and discussion answers stay out of research.
144
+ - Put the chairman's recommended option above its answer in bold uppercase. Rename history's
145
+ cleanup action to Clear; its confirmation still identifies the finished sessions to remove.
146
+
147
+ - Stop a Codex searcher call after 40 seconds without progress and allow one fresh attempt
148
+ when at least 30 seconds remain. Both attempts share the searcher's time limit and are
149
+ recorded. Reconnect notices do not count as progress. Missing usage from the first attempt
150
+ remains unknown and can block the second under a token cap. Each attempt has its own
151
+ search-operation limit. This bounds recovery; it does not repair a failing network route.
152
+
153
+ ### Documentation
154
+
155
+ - Explain provider regional availability, the limits of login/status checks, and how to
156
+ investigate stalled connections. Clarify that Roundtable leaves VPN, proxy and DNS settings
157
+ unchanged; network comparisons are optional diagnostics.
158
+ - Clarify that Codex's stream-idle timer does not cover every connection stage. Roundtable's
159
+ overall call limit still applies while the CLI waits for a response to begin.
160
+
161
+ ## 0.6.0
162
+
163
+ ### Review fixes
164
+
165
+ - Keep successful research when the searcher repeats a source URL. Repeated URLs become one
166
+ citation, with distinct excerpts combined when they fit the existing limit. Every record
167
+ still passes URL, date and length checks; no extra model call is made to repair duplicates.
168
+ - Offer each Codex model only the effort levels it takes. The Luna models stop at `max`
169
+ (`codex debug models`), but every Codex model was offered `ultra`. The pips, the chairman's
170
+ effort list and the server's check now follow the chosen model, and picking a model that
171
+ does not take the chosen level returns the seat to the CLI's default.
172
+
173
+ ### Security and usage
174
+
175
+ - Read Claude's remaining quota with `claude -p /usage`, which the CLI answers itself with no
176
+ model call, at start, on Refresh status, after each Claude reply and when a debate ends. Claude
177
+ no longer shows "not reported" until its first reply after every server start, and its
178
+ per-model weekly limit (for example "7d Fable") now appears beside the session and weekly
179
+ ones. Only the limit lines are kept; the local activity summary in the same answer is
180
+ discarded. A reply's own figure stands in when the read gives nothing. An answer that shows a
181
+ turn, tokens or a cost, one with no plan limits (API-key billing), or a read that times out
182
+ stops further reads until restart. Calibration now treats reset times a few minutes apart as
183
+ the same window, since `/usage` prints them to the minute.
184
+ - Read Antigravity's remaining quota with `agy -p /usage`, which the CLI answers itself with no
185
+ model call. Its limits come per model group (Gemini; Claude and GPT; Gemini 4 Argon on some
186
+ plans), and the seat lamps, the quota line and the quota picture show the windows of the
187
+ group each seat's model draws on, with the used share and the reset time. An answer that
188
+ shows a turn, tokens or a conversation, or a read that times out, stops further reads until
189
+ the server restarts, so a CLI change can cost one call, never one per reply. Measured quota
190
+ rates for Antigravity are kept per model and only against that model's group.
191
+ - Bench only the used-up Antigravity model group, not the whole login: when an Argon seat
192
+ reports a used-up quota, the Gemini and Claude seats on the same login keep answering. A
193
+ seat on the default model, whose group cannot be told, and a logged-out CLI still take the
194
+ whole login out, as for every other vendor.
195
+ - Keep Roundtable's calls out of each CLI's own history. Claude seats now pass
196
+ `--no-session-persistence` and Codex seats `--ephemeral`, so a stateless seat, chairman or
197
+ searcher call no longer leaves a session, prompts included, under `~/.claude/projects` or
198
+ `~/.codex/sessions`. Only seats in resume memory, whose next round continues the session,
199
+ still save it. Antigravity has no such flag.
200
+ - Read Antigravity's AI credits with `agy -p /credits`, which the CLI answers itself with no
201
+ model call, beside the `/usage` read and at most every ten minutes. The usage table shows
202
+ "AI credits left", which you previously had to type in from the credits page.
203
+
204
+ ### Local operation and interface
205
+
206
+ - Keep Windows history and login profiles in `%USERPROFILE%\.roundtable` instead of
207
+ `%LOCALAPPDATA%\Roundtable`. Windows redirects the AppData writes of anything started from a
208
+ packaged app, such as the Claude or Codex desktop app and their terminals, into a private copy
209
+ per app, so each app saw its own history and its own one-server lock. At startup Roundtable
210
+ now lists every older folder that still holds a review the data folder lacks: a checkout's
211
+ `debates/`, the earlier AppData folder and each packaged app's copy of it. It never moves them
212
+ itself. A login profile made under the earlier AppData default keeps working until it is moved.
213
+ - Stream Codex replies over SSE with an idle limit that fits inside the call limit and two
214
+ reconnects, through a provider entry named per call that points at the same ChatGPT backend
215
+ with the same login. The built-in provider offers no idle or reconnect setting, and the CLI's
216
+ documented stream-idle default equals the default call limit, so a stalled reply ran the full
217
+ five minutes before failing; it now reconnects after 95 seconds at that limit and fails sooner
218
+ once the reconnects are used up. That a custom provider may use the ChatGPT login is not documented;
219
+ `SECURITY.md` names both ways a future CLI could react. Every reconnect is counted into the
220
+ attempt's saved progress and shown as a "reconnected ×N" mark on the reply card, in failure
221
+ details, error logs and the agent state, so a recovered stall stays visible.
222
+ - Wait out an API endpoint's short rate limit once instead of benching its host for the rest of
223
+ the debate. A `429` whose `Retry-After` asks for 30 seconds or less, the delay `agy` itself
224
+ waits out, is retried once after that wait when it ends before the wall clock does. Without
225
+ `Retry-After`, with a longer one, or at a second `429` the host is benched as before; `402`
226
+ and every other status are unchanged. A `429` now counts as zero tokens, since the server
227
+ refused the request before the model ran, so a seat's token cap no longer blocks the retry or
228
+ later rounds as unknown spending. Stop, finish and the wall clock end a retry's wait at once,
229
+ for this wait and a network failure's, and a retry is skipped when another seat benched the
230
+ same login during the wait. The limited attempt is recorded with the kind `throttled`.
231
+
232
+ ## 0.5.0
233
+
234
+ ### Security and usage
235
+
236
+ - Fix the Antigravity tool guard for CLI 1.4, which reports each tool as a `step_update` with
237
+ the tool inside it. The guard read only the older shapes, so a tool that no Antigravity
238
+ permission rule can deny, its web search, went unnoticed. Any reported tool step now stops
239
+ the seat at once, as it does for Claude and Codex.
240
+
241
+ ### Local operation and interface
242
+
243
+ - Move a reply card as it opens and folds: the body under its seat and position unrolls over
244
+ the board's base motion time and rolls up a little faster before the card folds. Reduced
245
+ motion opens and folds it at once. The card head is also a button, so Enter or Space opens
246
+ and folds it, and focus stays on it while other replies land.
247
+ - Codex calls disable analytics/telemetry uploads and unlimited connection retries. A valid
248
+ completed answer with measured usage survives a CLI that hangs during shutdown; incomplete
249
+ answers still fail without a timeout retry. Search and reconnect stages appear in diagnostics.
250
+ - Treat Codex warning items as diagnostics instead of tool use, and surface a failed turn's
251
+ provider error promptly. Unknown tools remain blocked. Resolve npm and native CLIs in PATH
252
+ order so a later desktop binary cannot replace the terminal's selected installation.
253
+ - Stop presenting Codex defaults from user configuration that isolated calls ignore. Keep
254
+ model and effort choices explicit when reproducibility matters.
255
+ - Keep parent Codex app routing and session variables out of child CLIs and quota reads.
256
+ Use a shorter decision-review base prompt for Codex instead of its coding-agent prompt;
257
+ the tool restrictions remain unchanged. The temporary instruction file is removed after
258
+ each call, including failures.
259
+ - Charge Codex resume calls by the increase in session token counters. Previous rounds are no
260
+ longer counted again against usage and budget caps. Missing or decreasing baselines remain
261
+ unknown; fresh sessions start their accounting from zero.
262
+ - Show the chairman at work: while the verdict call runs, the Conclusion panel draws a pixel
263
+ sheet being written under a quill instead of staying hidden. Reduced motion shows a still page.
264
+ - Keep a round or detail the person folded or opened across redraws; before, every server
265
+ event reopened the latest round and closed everything else.
266
+ - Give the option columns their own grid, so two options fill the row with no blank third
267
+ column beside them when a note or the thinking strip is present.
268
+ - Move reported quota to one quiet line above the board; the question now heads the review
269
+ state, the conclusion and the rounds directly.
270
+ - Show a plain boot screen when setup takes longer than a moment: the logo in pixels, its
271
+ ring breathing slowly in and out while a light runs round the seats, and one line of text.
272
+ - Box only the main controls. Row Delete appears on hover or focus (always on touch), Show all
273
+ and Clear finished are quiet text at the foot of the debates list, the review state and CLI
274
+ seats are unboxed, recommended states take their colour, and partial token sums show "+".
275
+ - Fewer controls in the header: Compact is gone; each reply card starts folded to its seat and
276
+ position, even in the round that is still coming in, and opens by a click on its head;
277
+ theme and sound are pixel icons; Save error log moved to the status line. The debates list
278
+ folds and the browser remembers it.
279
+ - Lead the board with the question as its heading and the review state as a small tag beside
280
+ it. Usage details is a toggle that never moves; its table groups seats under one line per
281
+ account, right-aligns numbers and marks partial sums with "+" as the debates list does.
282
+ - Start every fold closed: debates, More context, the Quota picture, login profiles, and rounds
283
+ once a review is finished. More context spans the panel; run settings take the width they
284
+ need. Quota cards share one layout, with a shade per seat and a hatched chairman in the bar.
285
+ - Rework the paper theme on night's structure: a faint plum page, white fields with visible
286
+ borders, seat colours closer to night's hues at text contrast, softer position tints.
287
+ - Make research a visible role, the **searcher**: a card added with **+ Add searcher** beside
288
+ the chairman, with an open pixel eye as its mark. It has its own vendor, model,
289
+ effort and login profile instead of borrowing the first Codex seat's. Pick Claude, Codex or
290
+ Antigravity on its card; it starts on that vendor's lightest model at low effort, and agent
291
+ requests may set all four in `options.research` (Codex when no vendor is named). Claude
292
+ searches with WebSearch as its only tool, and its own search count and search-model tokens
293
+ are included; on Antigravity any tool but its web search stops it. It
294
+ replaces the research panel and its switch, and is named on the board, in Usage details and in
295
+ the quota picture. While it works the review state reads "Searcher at work" and the sources
296
+ panel shows its eye moving down a column of results, lighting the ones it keeps; with reduced
297
+ motion the picture stays still. Its card title and Effort carry a help tip, the README's
298
+ "How a review works" names it as an optional step, and the chairman's Effort has the tip too.
299
+ - Show Antigravity's limited isolation on the card that runs on it, seat, chairman or searcher:
300
+ one warning line whose tip says in three sentences what cannot be sealed off, what Roundtable
301
+ denies and stops, and that choosing Antigravity accepts it. Choosing it there is the consent
302
+ the board sends, so there is no separate switch and no refusal when the table opens. Agent
303
+ requests still send `allowLimitedIsolation: true`; without it the server refuses Antigravity.
304
+ - Fix a stray brace in the stylesheet that dropped the quota readout grid, and debate titles
305
+ squeezed to one letter at medium widths.
306
+
307
+ ## 0.4.0
308
+
309
+ - Add optional Codex web research before discussion, with an explicit public search question,
310
+ time limit and reported search-operation limit. Save one cited evidence bundle for every
311
+ seat, recovery and export; show research spending separately. Failures stop before discussion,
312
+ interrupted research never automatically reruns, and debate tools remain disabled.
313
+ Project safe research fields in agent snapshots, including older saved failures. Include
314
+ shared source context in setup estimates and admission checks for discussion and verdicts.
315
+
316
+ - Save safe provider progress on timeout, cancellation and failure, including first output,
317
+ last stage, idle time and byte counts. Show it in failure details and diagnostic downloads;
318
+ preserve complete usage received before a stalled exit without retrying unknown spending.
319
+
320
+ - Enforce the provider tool guard on every discussion and verdict call, including recovered
321
+ reviews. Stop reported tool activity without a repair; retain spending and exclude rejected
322
+ text from later prompts. Inspect bounded CLI streams while running, strengthen Claude and
323
+ Codex isolation flags, send Antigravity prompts on stdin and require explicit consent to
324
+ Antigravity's remaining isolation limits with session-only tool denial rules.
325
+ Invalid, incomplete or oversized streams stop the seat without retry or session reuse.
326
+ Agent help documents Antigravity's explicit consent option and remaining isolation limits.
327
+
328
+ - Clear the board's reconnecting state as soon as its event stream reconnects, including
329
+ while waiting for human input with no new events to replay.
330
+
331
+ - Explain when an earlier timeout or interruption left a seat's spending unknown. Show that
332
+ cause on the blocked reply and distinguish unknown usage from a projected cap crossing.
333
+
334
+ - Recover interrupted discussions in fresh provider sessions seeded with completed rounds
335
+ and saved notes, retaining earlier spending and deadlines. Preserve discussion completion
336
+ reasons when a later verdict is cancelled.
337
+
338
+ - Resolve protected export directories through filesystem aliases, refuse linked record/index
339
+ files, and exclusively create temporary files. Public exports now require an empty staging
340
+ directory (an existing `.git` is preserved) and never delete destination contents.
341
+ Preserve existing export/index permission bits on POSIX; new files respect the process umask.
342
+
343
+ - Redact known endpoint credentials from decoded replies and error excerpts before recording
344
+ them. Endpoint configuration continues to belong to the trusted local user.
345
+
346
+ - Quote peer replies, repair text and discussion notes as attributed input records. Reject
347
+ duplicate reply and verdict headers while preserving ordinary Markdown in content.
348
+
349
+ - Preserve Resume on server shutdown without recording a human Stop; close event streams and
350
+ retain cancelled-call spending. Accept emphasis around whole reply and verdict header lines
351
+ while preserving punctuation inside option labels.
352
+
353
+ ### Review fixes
354
+
355
+ - Normalize replies, verdict headers, option punctuation and persona parentheticals in linear
356
+ time, including adversarial whitespace and Unicode input. Preserve exact option labels
357
+ ending in quotes, stars or punctuation before applying formatting tolerance.
358
+ - Flush a dispatch intent before every provider call; unfinished attempts remain unknown
359
+ after restart and cannot bypass admission caps. Settled calls are counted once.
360
+ - Stop engines before cancelling server calls and refuse dispatch during shutdown.
361
+ - Rebuild failed reviews after cancelled turns settle so repaired storage can resume without
362
+ restarting the server. Keep unknown spend and transcript-recovery warnings.
363
+ - Read history summaries asynchronously, cache unchanged records, bound inactive replays and
364
+ avoid adding global pool/quota events to idle finished records.
365
+ - Remove invalid key-variable values before saving or restoring browser preferences.
366
+ - Preserve unreadable pool/calibration files, report their failure and block writes until
367
+ repair and restart; replace valid settings atomically.
368
+
369
+ ### Security and usage
370
+
371
+ - Require HTTPS for hosted endpoints, including names with private-address-like prefixes.
372
+ Limit decoded API responses, including errors, to 1 MiB.
373
+ - Check budgets before every provider attempt, including retries and fallback chairmen.
374
+ Reserve for concurrent calls and the verdict; refused calls add no usage.
375
+ - Recheck the wall-clock deadline after a retry delay, before dispatching another provider call.
376
+ - Carry the saved cumulative cost into resumed CLI calls so a server restart does not charge it twice.
377
+ - Keep missing token counts unknown and block further calls to that vendor under a token cap,
378
+ including after restart. Show unknown or partial totals while retaining reported costs.
379
+ - Make preflight reads cached-only. Authenticate refreshes, share overlapping checks, and
380
+ bound concurrent work, queue size and cache size.
381
+ - Send a Content-Security-Policy, `nosniff` and a no-referrer policy with every response, so
382
+ only the server's own scripts can run in the page that holds the launch token.
383
+ - Pin CI actions to commit IDs and make the dependency-update cooldown explicit.
384
+
385
+ ### Records and recovery
386
+
387
+ - Treat an expired input pause as final even when its timer fires before the overall deadline
388
+ timer. Do not start a chairman call after the pause expires.
389
+
390
+ - Add Delete and Clear finished with confirmation and protection for active sessions. Keep
391
+ exported files and usage statistics after cleanup. Default history to the OS user-data folder,
392
+ outside the checkout, and allow one server per data folder.
393
+ - Make Stop cancel the whole review, including automatic and manually requested verdicts.
394
+ Keep Stop visible during synthesis and distinguish cancellation from successful completion.
395
+ Cancel active calls even if a transcript write fails; fatal engine errors cancel them too.
396
+ - Add Finish with verdict after the first usable round, so ending discussion and aborting the
397
+ whole review are separate choices in the board and agent client.
398
+ - Keep agent-submitted notes distinct from human notes in the board, prompts, replay and exports.
399
+ - Ignore explicit no-question placeholders when deciding whether to pause. Preserve the blind
400
+ round pause and questions that still need an answer, without another model call.
401
+ - Recover an incomplete final transcript line with an exact backup before appending.
402
+ Show recovery notices; keep corrupt completed records visible and block further writes.
403
+ - Preserve Resume notes before the first round and Stop notes entered during a round.
404
+ Honor Stop without waiting for another input gate and prevent further seat retries.
405
+ - Retain the original chairman's model, effort and profile when requesting a missing verdict.
406
+ Restore the human decision and reason on reload.
407
+
408
+ ### Local operation and interface
409
+
410
+ - Present the final answer and its reasons before supporting detail. Distinguish material
411
+ clarifications from optional questions, and collapse panel positions and run metadata.
412
+ - Add Copy result with a manual clipboard fallback. Keep the agent verdict contract and full
413
+ exports unchanged; old reviews remain readable without another model call.
414
+ - Ask for a direct, conditional conclusion when important facts are missing, and allow a
415
+ nuanced synthesis for reflective questions. Do not manufacture questions or thresholds.
416
+
417
+ - Keep optional cat and alien personas in the public build, with their prompts and artwork in
418
+ a readable catalogue. The public-tree test checks the catalogue before publication.
419
+ - Add preview status and clear feedback and support links to the README.
420
+ - Lay out a round as one column per option, in option order, from the first reply on. A reply
421
+ lands at the foot of its column and nothing else moves; seats still thinking wait in a strip
422
+ under the columns. Before, cards regrouped as each reply arrived and the page jumped.
423
+ - Tint a card against the majority as soon as replies arrive (provisional, "so far" in the
424
+ tooltip) and settle the tint at the end of the round, instead of colouring only then.
425
+ - Show one banner with a **Reload** button when the board belongs to an earlier server
426
+ session, and stop retrying from that page. Before, a board left open across a restart
427
+ reported a page error and retried its diagnostics every 15 seconds, refused each time.
428
+ - Tell the chairman of an unattended review that any seat question is still open, so it lands
429
+ under its open questions instead of reading as agreement.
430
+ - Recommend the chairman one effort step above the seats, in the agent recipe and the guide:
431
+ the verdict is the call that decides, and a low-effort chairman dismisses the hardest
432
+ objection in a word.
433
+ - Play a distinct rising cue when the table stops for you (after the blind round and for a
434
+ seat's question), so a review left in another tab can call you back. The gavel sounds stay
435
+ for opening and ending.
436
+ - Add an **Unattended** switch to the round settings, off by default: the review skips every
437
+ pause, and the seats are told to state what they would have asked as assumptions instead of
438
+ asking, since nobody answers; the question line leaves their contract, so its tokens leave
439
+ every call too. For a review nobody will watch. The JSON client takes it as
440
+ `options.unattended`.
441
+ - Explain each mood on hover: the mood list, the mood on a reply card and the mood of a seat
442
+ that asked a question all carry its one-line description.
443
+ - Add a **Compact** switch in the header: every card folds to its seat and stance, so a round
444
+ reads as who chose what; a click on a card opens that reply. The switch is remembered.
445
+ - Name every seat that asked a question above its answer field (name, lens and mood, with a
446
+ persona's avatar), not only the lens. Seats still see each other by lens only.
447
+ - Show the effort a blank seat really runs at when the CLI's own default is known:
448
+ "default (max)" for Codex, read from its config.
449
+ - Optional personas on Antigravity run on the lightest Gemini the account lists (Flash Lite
450
+ where offered, otherwise Flash at low), instead of a fixed id.
451
+
452
+ - Seats and the chairman reply in the language of the decision; section headers stay English.
453
+ - Add **Choose…** beside both export fields: it opens the system's own folder dialog, so the
454
+ folder no longer has to be typed.
455
+ - Give a chairman whose first attempt held no recommendation the whole question again on its
456
+ retry. Before, a stateless retry carried only the format errors, so it could not know the
457
+ decision it was judging.
458
+ - Use the same external data folder for live diagnostic workspaces and headless calibration
459
+ reads as for saved reviews. Respect `ROUNDTABLE_DEBATES_DIR` in both commands.
460
+ - Reduce the demo quick start to clone, enter the folder and start the board.
461
+
462
+ - Mark session opening and completion with the chairman seat's pixel gavel and a quiet generated sound, with
463
+ separate endings for a verdict, no verdict and a failure. Add a sound toggle. Keep the gavel out
464
+ of saved-review replay and the JSON agent client, and keep the card still under reduced motion.
465
+ Events a board missed while its connection was down now arrive as new, so a review that ends
466
+ during the drop still shows its ending.
467
+ - Give the JSON agent client a `board` link in every result with a review id, so an agent can
468
+ hand a person the page to watch. Add a small-review recipe for lenses, moods, effort, model
469
+ and context fields to `agent --help` and the workflow guide.
470
+ - Redraw the grill, steelman, builder, contrarian and chairman icons, and the session gavel with them.
471
+ - Add per-seat token limits. Missing or partial usage blocks further calls for that seat,
472
+ including retries and resumed reviews; other seats can continue.
473
+ - Select Haiku 4.5 by its explicit model id instead of the `haiku` alias.
474
+ - Keep the folder picker available while its dialog is open, and distinguish cancellation from
475
+ a timeout or launch failure. Errors are visible beside the export field.
476
+ - Trim a reply with too many DISAGREE or NEW bullets to the limit instead of re-prompting the
477
+ seat; the extra call cost more than the lost bullet. Show agents `gate.reopenCalls` when the
478
+ seats already agree at round 0, so answering only reopens the table when it could change a
479
+ position.
480
+ - Put delayed hover explanations on text labels. Separate positions from arguments, emphasize
481
+ rejection words, and collapse usage into quota bars with expandable details.
482
+ - Collect questions and answers in one area, combine identical questions without a model call,
483
+ and wait for final-round answers before the verdict. Reject stale-round submissions.
484
+ - Close discussion controls when rounds end. Explain Stop, provider timeout and review expiry
485
+ separately, including expiry while waiting for input; retain those reasons on replay.
486
+ - Add JSON agent commands for setup checks, estimates, start, bounded waits, answers and recovery.
487
+ Keep launch tokens in memory and require explicit actions for calls. Shorten response targets.
488
+ - Give added seats distinct starter lenses and recover empty lenses in saved drafts. Highlight
489
+ and focus missing or duplicate lenses and empty custom moods before a review starts.
490
+ - Explain lenses, moods and round settings with delayed, keyboard-accessible hints. Add a
491
+ gentle reveal for hints and new replies, respect reduced motion, and keep replays still.
492
+ - Add local, rotating diagnostic logs and a **Save error log** download. Give failed actions
493
+ reference IDs and next steps; keep pending browser diagnostics through reloads. Exclude
494
+ review content, credentials, URLs and personal paths from the diagnostic data.
495
+ - Report failed quota saves and distinguish provider failures from malformed verdicts.
496
+ - Show Demo or Live mode, the active data folder, and backup guidance. Default to two seats
497
+ and one critique round; remember saved settings and prefer ready logins on first use.
498
+ - Retain drafts after failed requests, explain errors, and prevent duplicate pending actions.
499
+ Add setup/history retries and explicit status refresh; confirm pauses after acknowledgement.
500
+ - Improve keyboard focus, effort targets, narrow layouts and space for the action bar.
501
+ Keep saved dollar caps editable when no dollar estimate is available.
502
+ - Serve the guide and fonts locally. Clarify setup, billing, tool restrictions and provider
503
+ retention in the documentation and doctor output.
504
+
505
+ ## 0.3.0
506
+
507
+ First public release.
508
+
509
+ - **Debates between the coding agents you already pay for.** Claude, Codex and Antigravity seats
510
+ on their own subscriptions, any number per vendor, each with its own lens, mood, model and
511
+ thinking level. A blind first round, critique rounds with a fixed reply format, stops for
512
+ consensus, no movement, round limit, wall clock, budget or you.
513
+ - **You take part.** The board waits after the blind round, stops for any question a seat asks
514
+ you, and carries your notes into every later round.
515
+ - **A sceptical chairman.** A fresh session writes the verdict: a recommendation, the dissent,
516
+ kill criteria and open questions. It recommends; you accept an option on the board.
517
+ - **Usage tracking.** Per account: remaining quota where the vendor reports it, the projected
518
+ draw per seat, and token or dollar caps checked against available usage estimates.
519
+ - **Failures you can read.** Each seat card has a lamp (ready, nearly used, out, not checked)
520
+ from a free pre-flight check. A used-up quota or a lost login benches that account for the
521
+ debate instead of failing every round.
522
+ - **API endpoint seats.** An OpenAI-compatible endpoint can take a seat: a local server (Ollama,
523
+ LM Studio, vLLM, llama.cpp) or a pay-per-token API (DeepSeek, Moonshot, OpenAI). Every card and
524
+ record says whether a seat is a CLI on a subscription or an API.
525
+ - **Decision records.** Export a debate as a markdown record and an index into any codebase, so
526
+ your coding agents can read what was decided.
527
+ - **The `roundtable` command** starts the board and opens it in your browser (as
528
+ `npx @prplkane/roundtable` once the package is published); `doctor` shows what your machine
529
+ can seat.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 prplkane
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.