@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/README.md CHANGED
@@ -1,3 +1,189 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # Roundtable
2
+
3
+ Roundtable runs structured decision reviews with multiple AI models. Provide a question,
4
+ options and constraints; the models take independent positions, critique the alternatives
5
+ and produce a recommendation. You can answer questions, add context and record your own
6
+ decision alongside the result.
7
+
8
+ Use it to compare technical approaches, review a product decision or examine a plan from
9
+ different perspectives. The browser interface runs locally, and a JSON command-line client
10
+ supports the same workflow for agents and scripts.
11
+
12
+ Usage statistics describe your own agents' calls in Roundtable and stay on your machine.
13
+ Roundtable has no telemetry or analytics service and sends no usage data to its developers.
14
+
15
+ **Requirements:** Node.js 22 or newer. No runtime dependencies. Live reviews use installed
16
+ Claude, Codex or Antigravity CLIs, or an OpenAI-compatible endpoint for a local or hosted model.
17
+
18
+ **Provider availability:** some vendors or models are unavailable in certain regions. Regional
19
+ network paths can also interrupt replies even when login succeeds. Check the
20
+ [availability and network guidance](docs/workflow.md#provider-availability-and-network-access)
21
+ before your first live review.
22
+
23
+ **Status:** early preview for developers. Feedback from real workflows is welcome. What does not
24
+ work well yet is listed under [Known issues](docs/workflow.md#known-issues).
25
+
26
+ ## How a review works
27
+
28
+ 1. **Define the decision.** Add the alternatives, known facts and constraints. Choose two to
29
+ eight participants, called seats, and give each a perspective such as risk, cost or evidence.
30
+ Seats can use different models or share the same provider.
31
+ 2. **Gather sources first (optional).** Add a searcher: one extra call, on the provider you
32
+ pick. Its query starts from your question and options; review it or write a custom query.
33
+ Every seat and the chairman then read the same cited sources. Other context and discussion
34
+ answers stay out of research. The searcher never argues or votes.
35
+ 3. **Collect independent positions.** Each seat answers before seeing the others' responses.
36
+ The board then pauses for your input.
37
+ 4. **Discuss the differences.** A critique round lets seats review the previous replies and
38
+ revise their positions. Questions appear together so you can answer them in one place.
39
+ 5. **Review the recommendation.** A designated chairman summarizes the discussion and its
40
+ disagreements. Accept the recommendation or record a different decision, then export the
41
+ record as Markdown.
42
+
43
+ ## Quick start
44
+
45
+ ### Connect your assistant once
46
+
47
+ Install Roundtable globally, then connect your assistant:
48
+
49
+ ```bash
50
+ npm install -g @prplkane/roundtable
51
+ roundtable setup --client codex
52
+ ```
53
+
54
+ Use `--client claude`, `--client agy`, or `--client all` for the other supported assistants.
55
+ Restart the assistant or reload its MCP connections. In any project, ask **"Use Roundtable
56
+ to review this decision."** The installed MCP tools start the local board as needed, return
57
+ questions to the coordinating assistant, and wait for the chairman's recommendation.
58
+ You do not need to open this repository or start a browser for each review.
59
+
60
+ Setup installs a user-level workflow skill and MCP connection. `roundtable setup --client codex
61
+ --check` checks it; `--remove` removes its unchanged entries. After updating Roundtable, rerun
62
+ setup to refresh the skill, and use `roundtable server restart` once active reviews finish.
63
+ No checkout is needed. To install a local checkout instead, run `npm pack` there and
64
+ `npm install -g` with the printed `.tgz` filename; `npm install -g .` can create a link
65
+ back to the checkout that breaks when it moves.
66
+ See [assistant setup](docs/workflow.md#connect-an-assistant-for-every-project)
67
+ for paths, demo mode and troubleshooting, or the [Linux walkthrough](docs/workflow.md#first-connection-on-linux).
68
+ For a source snapshot before its npm release, use
69
+ `npm install -g https://github.com/prplkane/roundtable/archive/refs/heads/main.tar.gz`.
70
+
71
+ Interactive `roundtable --help`, `roundtable` and `roundtable fake` show the app's pixel logo
72
+ tile in orchid, with the wordmark, a blinking cursor and the installed version beside it, then
73
+ the provider CLIs found on this machine in their seat colors. Narrow terminals and terminals
74
+ without UTF-8 use a short title; `NO_COLOR=1` disables color. Redirected output, CI, dumb
75
+ terminals, MCP and JSON commands omit the decoration.
76
+
77
+ ### Try the demo
78
+
79
+ The demo uses scripted replies. It needs no provider account and makes no model calls.
80
+
81
+ ```bash
82
+ git clone https://github.com/prplkane/roundtable.git
83
+ cd roundtable
84
+ npm run fake
85
+ ```
86
+
87
+ The board opens at [localhost:4748](http://localhost:4748/). If no browser window appears,
88
+ open that address yourself. The header identifies the session as **Demo**. Press Ctrl+C in
89
+ the terminal to stop the server.
90
+
91
+ ### Run a live review
92
+
93
+ Install and sign in to a supported CLI, or configure an OpenAI-compatible endpoint using
94
+ the [provider setup guide](docs/workflow.md). CLI seats use your existing logins; hosted API
95
+ endpoints have separate billing.
96
+
97
+ **Antigravity and your Google account:** Google's [Antigravity FAQ](https://antigravity.google/docs/faq)
98
+ says wrapping `agy` inside third-party applications is not supported under consumer plans,
99
+ and that third-party access can lead to suspension or termination of the account. Roundtable
100
+ runs `agy -p` in that way. It sends nothing to `agy`, not even a model-list or quota read,
101
+ until you acknowledge this once on an Antigravity card; an agent request must send
102
+ `options.acknowledgeTermsRisk: true` itself. Check your plan's terms, or use another provider.
103
+
104
+ ```bash
105
+ npm run doctor
106
+ npm start
107
+ ```
108
+
109
+ Open [localhost:4747](http://localhost:4747/). The header identifies the session as **Live**.
110
+ Start with two seats and one critique round; see the [first test-drive checklist](docs/workflow.md#a-first-live-test-drive)
111
+ for a complete walkthrough. `npm run doctor` checks setup without making model calls.
112
+
113
+ After updating, stop the running server with Ctrl+C, run `npm start` again and refresh the
114
+ page. Refreshing the browser alone does not load an updated server or model list.
115
+
116
+ ## Controls and limits
117
+
118
+ | Control | Behavior |
119
+ | --- | --- |
120
+ | Answer questions | Add context before the discussion continues. Agent notes and your notes are labelled separately. |
121
+ | Finish with verdict | End the discussion and request a recommendation from the completed replies. Available after a usable round. |
122
+ | Stop | Cancel the discussion and any active chairman call. Saved replies and reported usage remain. |
123
+ | Delete / Clear | Remove finished and interrupted history while protecting running sessions. Exports and local usage statistics are retained. |
124
+
125
+ Set round, time and provider budget limits before starting. Budget checks run before each
126
+ attempt, including retries. If a provider omits token usage while a token cap is set, further
127
+ calls to that provider are blocked. Calls already running can exceed estimates; these checks
128
+ are not guaranteed billing ceilings.
129
+
130
+ ## Records and privacy
131
+
132
+ - **Local storage:** history is saved outside the checkout in the OS user-data folder, with
133
+ separate live and demo directories. The board shows the active location under **Local data
134
+ and backups**. Stop the server before copying or moving that folder.
135
+ - **Recovery and export:** saved reviews can be reopened after a restart. Interrupted writes
136
+ retain a backup before recovery. Markdown exports include the recommendation, dissent,
137
+ human decision, notes and reported usage.
138
+ - **Provider access:** live reviews send relevant notes and replies to the selected providers.
139
+ Local storage and stateless requests do not control provider retention. CLI tool restrictions
140
+ depend on the installed CLI and are not an operating-system sandbox.
141
+
142
+ Records, exports and browser preferences may contain private context. See [SECURITY.md](SECURITY.md)
143
+ for credentials, billing, endpoint restrictions and the local HTTP boundary. If a request
144
+ fails, use **Save error log** and keep its reference ID; diagnostic logs stay local and omit
145
+ review text, credentials and personal paths.
146
+
147
+ ## Automation and commands
148
+
149
+ ```bash
150
+ node src/cli.js agent --help
151
+ ```
152
+
153
+ The JSON client provides `status`, `check`, `start`, `wait` and `answer` commands, plus controls
154
+ to finish or stop a review. Questions remain paused until answered, explicitly skipped or
155
+ their answer window expires (two minutes by default). Silence continues with unknowns intact.
156
+ See the [agent workflow](docs/workflow.md#8-run-a-debate-without-the-browser)
157
+ for request examples and response fields.
158
+
159
+ | Command | Purpose |
160
+ | --- | --- |
161
+ | `npm run fake` | Open the scripted demo on port 4748. |
162
+ | `npm start` | Open the live board on port 4747. |
163
+ | `npm run doctor` | Check installed providers and available status without model calls. |
164
+ | `roundtable setup --client all` | Connect MCP tools and the skill across projects for Codex, Claude and AGY. |
165
+ | `roundtable server status` | Inspect the background board; `stop` and `restart` refuse active reviews. |
166
+ | `roundtable mcp` | Serve the agent workflow over MCP stdio. |
167
+ | `npm run export -- <debate> <folder>` | Export a decision record and update its index. |
168
+ | `npm test` | Run offline unit and integration tests, without vendor CLIs or model calls. |
169
+
170
+ ## Documentation
171
+
172
+ - [User guide](docs/workflow.md): setup, providers, limits, backup, recovery and troubleshooting
173
+ - [Security](SECURITY.md): data handling and private vulnerability reporting
174
+ - [Contributing](CONTRIBUTING.md): development and review requirements
175
+ - [Changelog](CHANGELOG.md): changes by version
176
+
177
+ ## Feedback and support
178
+
179
+ Ask questions, report bugs or suggest changes through [GitHub Issues](https://github.com/prplkane/roundtable/issues).
180
+ For a bug, include your OS, Node and provider CLI versions, steps to reproduce, and the error
181
+ reference if available. Exclude credentials and private review content. Support is best effort.
182
+ Report security issues through the [private reporting channel](https://github.com/prplkane/roundtable/security/advisories/new).
183
+
184
+ If Roundtable is useful to you, consider starring the repository.
185
+ Maintained by [prplkane](https://github.com/prplkane).
186
+
187
+ ## License
188
+
189
+ [MIT](LICENSE).
package/SECURITY.md ADDED
@@ -0,0 +1,299 @@
1
+ # Security
2
+
3
+ Roundtable runs a loopback server on your machine. Live debates use the vendor CLIs you
4
+ installed or API endpoints you explicitly configure; demo mode uses scripted replies.
5
+
6
+ ## Data and execution
7
+
8
+ - **No telemetry or analytics service.** Usage statistics describe your own agents' calls in
9
+ Roundtable. They are calculated and stored on your machine; Roundtable sends no usage
10
+ statistics, review text or diagnostic logs to its developers. Live reviews still send the
11
+ required prompts to your selected providers, whose data handling is separate.
12
+ - **CLI login files stay with the CLI.** Roundtable does not read or copy those files. It runs each vendor's
13
+ own CLI (`claude`, `codex`, `agy`) as a child process, and that CLI does its own login the way
14
+ it does in your terminal. A test asserts that no source file names a credential file or copies
15
+ one. A second account ("login profile") is an empty directory under the OS user-data folder
16
+ (`%USERPROFILE%\.roundtable\homes\<profile>\<vendor>`, `~/Library/Application Support/roundtable/...`,
17
+ `~/.local/share/roundtable/...`) that you log into yourself once; Roundtable only points the
18
+ CLI at it through the variable the CLI documents.
19
+ - **Billing: the subscription, unless you say otherwise.** The child's environment is yours minus
20
+ Claude Code session variables, parent Codex app routing/session variables and API-key variables (`ANTHROPIC_API_KEY`,
21
+ `OPENAI_API_KEY`, `GEMINI_API_KEY` and the like), so a key left in your shell cannot move a
22
+ debate onto pay-per-token. Set `ROUNDTABLE_API_BILLING=1` to pass them through on purpose.
23
+ - **Budget caps check admission, including retries.** Each provider attempt is checked against
24
+ reported usage, calls already in flight, and the projected next call. Seat calls leave room
25
+ for a projected verdict; a fallback chairman is checked against its own vendor's cap.
26
+ Missing or unusable token counts block further calls to that vendor under a vendor token cap,
27
+ including after a restart; already dispatched calls may finish. Discussion seats also have an
28
+ automatic cap of 400,000 tokens per review (60,000 for optional personas). Missing or partial
29
+ usage blocks further calls for that seat. The explanation identifies a recorded timeout or
30
+ interruption without treating missing usage as zero or measured cap exhaustion. The chairman
31
+ follows the vendor budget.
32
+ Unknown usage and partial totals are labelled, and reported dollar costs are kept separately.
33
+ These checks use estimates and available usage reports, not a provider-enforced billing
34
+ ceiling: a call already running can consume more than projected.
35
+ A flushed dispatch record is saved before each call. After an interruption, a dispatch
36
+ without its matching result is unknown usage and cannot silently reset a capped review.
37
+ - **An API endpoint seat is the one case where Roundtable itself sends a request.** You name a
38
+ base URL, a model and the *name* of the environment variable holding the key (never the key;
39
+ a pasted key is refused on shape). At call time the key is read from the environment you
40
+ started Roundtable from and sent as a bearer to that URL only, with redirects refused. It is
41
+ not deliberately added to transcripts, logs or the board. Endpoint response and error text
42
+ can be displayed and recorded. Known credential echoes are redacted from decoded replies
43
+ and error excerpts before recording; deliberately encoded copies may evade this filter.
44
+ Existing records are not rewritten. Use an endpoint you trust with the credential.
45
+ Plain `http` is accepted for local names and private IP literals; a hosted
46
+ API must be `https`. A DNS name starting with a private-address prefix, such as
47
+ `10.api.example.com`, is still a hosted name and requires HTTPS. Local names rely on your
48
+ network's name resolution. Endpoint responses are limited to **1 MiB of decoded body bytes**,
49
+ including compressed and error responses; an oversized response is cancelled and fails the
50
+ call without a network retry. Preflight sends no probe to the endpoint, even on an authenticated
51
+ refresh; the first real call checks the connection. Such a seat bills the endpoint's account,
52
+ and its card says `API · pay-per-token`.
53
+ - **Cancellation:** Stop cancels this review's owned CLI processes and local endpoint requests,
54
+ including an active chairman. It prevents new rounds, retries, fallback calls and automatic
55
+ synthesis. Saved replies and reported usage remain. A provider may already have processed a
56
+ dispatched request; cancelling locally does not guarantee a billing reversal upstream.
57
+ Server shutdown interrupts active reviews without recording human Stop or starting synthesis.
58
+ Event streams close; settled calls retain reported spending before exit. Unsettled dispatches
59
+ remain unknown on restart. Saved discussions offer Resume, or Write if discussion had ended.
60
+ Finish with verdict is a separate action: it cancels unfinished discussion calls, then permits
61
+ the chairman under the existing budget and time limits. It requires a completed, usable round.
62
+ - **Network:** the browser loads the board, styles and fonts locally; it does not fetch a remote
63
+ font stylesheet. Live provider traffic is the CLIs' own traffic and the endpoint traffic
64
+ above. Roundtable leaves VPN, proxy and system DNS configuration unchanged; provider
65
+ availability and regional connectivity remain external requirements. The server listens on
66
+ `127.0.0.1`. A debate sends its notes and relevant replies to the
67
+ selected providers. Stateless mode limits the context Roundtable resends; it does not control
68
+ provider logging or retention.
69
+ - **On disk:** history defaults to the OS user-data folder, outside the checkout, with separate
70
+ `live` and `demo` directories. `ROUNDTABLE_DEBATES_DIR` overrides that location. Each holds one folder per debate with the transcript (field notes, replies,
71
+ your notes, usage figures), `field-notes.md` and `verdict.md`; plus the calibration and pool
72
+ figures. Live diagnostic working files use the same data folder. Legacy checkout data
73
+ folders remain gitignored. A CLI's full raw output is kept in memory during
74
+ a call; selected replies, errors and usage are recorded. Copy the entire data folder while
75
+ the server is stopped to back it up. Exported records and CLI login profiles live separately.
76
+ The browser also retains field notes, seat choices, limits, chairman settings and budgets in
77
+ local storage for that address. Clearing browser data removes those preferences, not server
78
+ records. They can contain private context; use a browser profile you trust.
79
+ - **History cleanup:** Delete and Clear include finished and interrupted sessions.
80
+ Authenticated requests recheck that none are running or waiting for input. A data-folder
81
+ lock prevents two servers from sharing the same writable history.
82
+ Cleanup refuses linked directories and nested links. It saves `_usage.json` before removing
83
+ transcripts, recovery backups and seat working files. This file keeps usage counters and model
84
+ identifiers under hashed session IDs, without titles, prompts, replies, notes or account paths.
85
+ Exports, quota calibration and provider records are not deleted. This is ordinary file deletion,
86
+ not secure erasure; backups, browser preferences and provider histories are separate.
87
+ - **Transcript recovery:** reads never change the transcript. Before appending after an
88
+ incomplete final line, Roundtable saves the exact original as `transcript.recovery-<id>.jsonl`
89
+ beside it and atomically replaces the transcript with its complete prefix and a recovery
90
+ notice. Backups contain the same private debate data and belong in your backup/deletion
91
+ policy. Corrupt completed lines block resume and export until restored from a backup.
92
+ A storage failure cancels and settles active turns before exposing Resume or a missing
93
+ verdict. Repair the storage problem first; recovery never retries a provider call on its own.
94
+ Resuming an interrupted discussion creates fresh provider sessions because old threads can
95
+ contain unsaved work. Completed rounds and saved notes supply their context; all prior spend
96
+ remains in the ledger. Cancelling synthesis preserves the discussion's original stop cause.
97
+ - **Local settings:** unreadable calibration or pool JSON is logged and preserved. Restore the
98
+ file and restart before saving changes; writes use temporary files and atomic replacement.
99
+ - **Provider output:** reply and verdict normalization uses linear scans, including Markdown
100
+ decorations and optional persona filtering. Browser rendering still treats this as text.
101
+ Later prompts quote replies and notes in records with application-assigned provenance;
102
+ duplicate contract headers fail validation. This improves attribution but does not guarantee
103
+ a model will resist instructions embedded in quoted content. Model output never grants approval.
104
+ - **Diagnostic logs:** `_diagnostics/` in the data folder holds at most two 256 KiB files.
105
+ Entries use fixed error/action categories, reference IDs, timestamps, provider names,
106
+ runtime versions, fixed field names, seat numbers and source locations. No raw messages,
107
+ prompts, replies, titles, URLs, account/model identifiers, credentials or personal paths are
108
+ copied into these logs.
109
+ Failed calls also retain bounded timing, byte/event counts, exit outcomes and a fixed last
110
+ stage such as waiting, reasoning or completion. These observations cannot establish an
111
+ upstream service's cause. Complete usage received before a timeout still counts; missing
112
+ usage remains unknown. No automatic timeout retry is added.
113
+ Browser reports and downloads require the same launch token and origin checks as writes;
114
+ reports accept only known categories and bounded numbers. Logging is limited to 120 entries
115
+ per minute. A tab can retain up to 20 sanitized events in session storage until delivered;
116
+ closing it can discard pending events. Logs stay local until you choose to share a download.
117
+ Transcripts, terminal output and provider logs have their own data handling described above.
118
+ - **Copy result:** an explicit browser action copies the readable conclusion and questions to
119
+ the system clipboard. Review text is still private content; the clipboard may be visible to
120
+ other applications or managed by your OS clipboard history. No server write or model call is
121
+ made. If access is blocked, the board offers selected text for manual copying.
122
+ - **Agent client:** `roundtable agent` connects only to a numeric loopback port. It reads the
123
+ page's launch token into memory for authenticated writes, refuses redirects and does not
124
+ print or persist the token. Setup checks and state reads make no model call. Start, answers,
125
+ resume and verdict requests can make calls under the same budgets and limits as the board.
126
+ Writes are never automatically retried. JSON output contains private review content; treat
127
+ request files, answer files and saved command output like transcripts.
128
+ Attended response windows continue automatically after the configured interval. A timeout
129
+ records unanswered questions; it is not a human note, acceptance or a supplied fact. Reading
130
+ state never extends the window. The authenticated `hold` action grants a bounded extension
131
+ within the overall wall clock, and stale-round answers and extensions are refused. Browser
132
+ drafts are never submitted by a timer. Agent snapshots provide a question handoff and answer
133
+ template; the host agent is responsible for presenting the questions and collecting replies.
134
+ Research snapshots project known fields only: fixed failure descriptions, bounded progress
135
+ and validated source records. Raw CLI error text remains in board/transcript details, not
136
+ the agent snapshot; saved older failures receive the same projection.
137
+ Notes sent by the client carry `source: agent`; board notes default to `source: human`.
138
+ This is declared attribution, not an authenticated identity or proof of human approval.
139
+ It grants no extra permissions. Legacy notes without a source retain their original label.
140
+ - **Assistant setup and MCP:** `roundtable setup` explicitly installs user-scoped MCP entries
141
+ and the Roundtable skill for the selected hosts. It makes no model call and is never run
142
+ by an npm installation hook. Unrelated settings are preserved; edited or unmanaged
143
+ Roundtable entries are refused. A local receipt stores paths and hashes, not configuration
144
+ contents or credentials. Updates and removal check those hashes before changing files.
145
+ Missing owned files can be repaired or removed; existing edited files remain protected.
146
+ Setup honors Codex and Claude profile overrides and checks the stored Node executable.
147
+ Terminal branding is limited to interactive help and foreground board startup; MCP and
148
+ JSON command output contain no decoration.
149
+ The stdio MCP adapter exposes the JSON client's review actions, not a general shell or
150
+ filesystem tool. It validates inputs, bounds protocol messages and uses the same loopback
151
+ token and server validation. No acceptance or export action is exposed. Setup, discovery
152
+ and guide reads make no model call; review actions follow the existing budgets and consent
153
+ rules. Connecting AGY as a host does not grant consent to use AGY as a provider.
154
+ On demand it starts a hidden board that survives a disconnected MCP client, preserving
155
+ running reviews and answer timers. Cancelling an MCP request only stops that client read
156
+ or write attempt; a write might already have reached the server. Read state before retrying,
157
+ and use Stop to cancel an actual review. No uncertain write is automatically retried.
158
+ Health reads check API/package version, mode and any explicit data directory before reuse;
159
+ temporary readiness failures have a bounded retry window. The authenticated server
160
+ stop/restart command requires a matching launch instance and refuses active reviews or
161
+ concurrent writes. It does not automatically stop an old board during an update.
162
+ MCP results contain private review text visible to the invoking assistant and its host.
163
+ - **Antigravity can put your Google account at risk.** Google's Antigravity FAQ says wrapping
164
+ `agy` inside third-party applications is not supported under consumer plans, and that
165
+ third-party access violates its Terms of Service and can lead to suspension or termination
166
+ of the account. Roundtable runs `agy -p` as a third-party application and cannot tell which
167
+ plan a login is on. So nothing is sent to `agy`, a call or a background read of its model
168
+ list, quota or credits, until the person acknowledges this: once on the board, recorded in
169
+ the data folder (`_terms.json`, only by the board page itself, never by the agent client),
170
+ or per agent request with `acknowledgeTermsRisk: true`. A live server refuses an Antigravity
171
+ seat, chairman or searcher without it, and the adapter refuses the call. `doctor` needs
172
+ `--acknowledge-terms-risk`. This is separate from the isolation consent below.
173
+ - **Tool restrictions depend on the installed CLI.** Claude uses safe mode, an empty tool
174
+ list, no MCP servers, MCP tools removed by name and no permission prompts. Codex ignores user configuration and rules,
175
+ uses strict configuration, a read-only sandbox, no MCP servers, no web search and disabled
176
+ tool features. These flags require a compatible CLI; unsupported options fail without a
177
+ weaker fallback. Antigravity uses session-only deny rules for documented file, command,
178
+ URL and MCP tools. Its web search has no permission rule and cannot be denied, so the guard
179
+ below stops a seat at its first reported tool step, search included. Its shared
180
+ customizations and MCP discovery cannot be disabled either, so live
181
+ Antigravity calls require explicit consent: on the board, choosing Antigravity on a card that
182
+ states the limitation; in an agent request, `allowLimitedIsolation: true`. The server refuses
183
+ Antigravity without it. No saved provider
184
+ settings are changed. All prompts use stdin, not the process command line.
185
+ The mandatory guard terminates an owned CLI when a prohibited tool event is reported,
186
+ stops that seat for the review, retains known or unknown spending and excludes its answer
187
+ from later prompts. It applies to repairs, recovery, API tool replies and the chairman;
188
+ `strictTools: false` is refused and cannot disable it in old records. Streams are bounded
189
+ to 8 MiB combined stdout/stderr and a pending event to 1 MiB. Invalid, incomplete or oversized
190
+ streams stop the seat for the review, discard its session and retain reported spending.
191
+ Codex warning/error items are diagnostics, not tool activity; unknown item types still fail
192
+ closed. A failed turn is rejected immediately. After a validated answer, completion event
193
+ and token counts, a Codex process that does not exit within one second is terminated and its
194
+ result preserved. Output and tool checks continue until termination. No retry is made for
195
+ that completed call, and a truncated tail or subsequent prohibited tool still rejects it.
196
+ Codex telemetry exports, analytics, shell snapshots and unlimited connection retries are
197
+ disabled per call; shared CLI settings and login files are not changed.
198
+ Each Codex call also names a provider entry of its own that points at the same ChatGPT
199
+ backend and uses the same login, so the reply streams over WebSocket with an idle limit
200
+ derived from the call limit ((limit − 15 s) ÷ 3, between 10 s and 300 s) and at most two
201
+ reconnects, or, at low effort (or none or minimal), 15 s and at most five reconnects. Over
202
+ WebSocket that limit runs from the moment the request is sent, so a response the backend never
203
+ starts is caught too; a WebSocket that does not open within 10 s, or whose reconnects run out,
204
+ falls back to HTTPS, where such a wait has no limit short of the call limit. Codex runs with its
205
+ stream-retry warnings on (`RUST_LOG`), so its error output holds one line per retry, which
206
+ Roundtable counts; those lines carry turn ids and the error text, not prompts or replies.
207
+ The built-in provider exposes no idle or reconnect setting, and the CLI's documented
208
+ stream-idle default, 300 s, equals the default call limit, so its own recovery could never run
209
+ before Roundtable ended the call. Every key is in the CLI's configuration reference; that a
210
+ custom provider may use the ChatGPT login is demonstrated, not documented. A CLI that refuses
211
+ it is expected to fail the call with an authentication error, which marks the pool down for
212
+ the review; one that ignores it is expected to fall back to the built-in provider. A reconnect
213
+ starts the answer again, and the interrupted attempt's tokens may be charged by the provider
214
+ without appearing in the reported usage; more reconnects can mean more such attempts.
215
+ Roundtable's overall call limit remains the final bound.
216
+ Codex also receives a short review-specific base prompt through a uniquely created temporary
217
+ file, removed after the call. It contains no field notes or personal context. The tool flags,
218
+ read-only sandbox and reported-tool guard apply independently of these instructions.
219
+ Detection can arrive after an operation has started and cannot undo it. Undisclosed remote
220
+ actions are not observable. These are provider restrictions and detection, not an OS
221
+ security sandbox supplied by Roundtable. Flags are in `src/adapters/config.js`.
222
+ - **Optional web research has a separate policy.** Explicit research consent starts one fresh
223
+ call on the chosen searcher's CLI with only its web search allowed; other tool restrictions
224
+ remain. Codex turns on live `web_search`; Claude gets `WebSearch` as its only tool, approved
225
+ for that call; Antigravity, whose search cannot be switched off or on, keeps its deny rules,
226
+ and any reported tool other than `search_web` stops the call. API endpoints cannot search. Only the
227
+ displayed search query goes into that call. The board initially fills it from the decision
228
+ question and options; Custom query lets the person edit it. Other field notes and discussion
229
+ answers are excluded. Search terms and visited pages are handled by the provider, so review
230
+ the query for private details. The local wall clock,
231
+ output limits and reported search-operation limit are enforced. One reported operation can
232
+ contain multiple queries/page visits, and an excess operation may already have started when
233
+ its event arrives. This is not a provider-enforced search or billing ceiling. Research
234
+ spending joins the review's vendor budget and is shown separately from discussion seats.
235
+ Up to eight source URLs, dates and excerpts are saved as provider-supplied, unverified data;
236
+ all returned records are validated before repeated normalized URLs are combined into one
237
+ citation. The first title/date are retained and distinct excerpts are appended only when
238
+ their complete combined text fits the 1,200-character limit. The raw eight-record limit
239
+ still applies; malformed duplicates cannot bypass validation. No repair call is made.
240
+ Every seat and the chairman receives that same bundle. Source text cannot authorize tools
241
+ or human decisions. Failed or interrupted research stops before discussion and is never
242
+ automatically rerun, with one exception: a Codex searcher call that makes no progress for 40
243
+ seconds is stopped and started once more within the same time limit, and both attempts are
244
+ recorded. That retry is a fresh call with its own search-operation limit, so one research
245
+ step can run up to twice the configured count. Completed evidence is reused without
246
+ fetching it again. Ordinary
247
+ discussion and verdict calls always retain the no-tools policy.
248
+
249
+ ## The local HTTP boundary
250
+
251
+ This is a trusted personal-machine application. Other local users and processes can read the
252
+ board and its launch token; loopback is not OS-user authentication. A trusted local client can
253
+ select available server environment variables as endpoint credentials and choose destinations.
254
+ Do not run it as a shared-host service or under an account with greater authority than its user.
255
+
256
+ A page from any site can try to reach `localhost`. So every request must name this server in
257
+ `Host`, and a present `Origin` must be this server's page; every request that changes anything
258
+ is `POST`, `application/json`, at most 256 KB, and must carry the launch token printed on the
259
+ server's startup line (the served page gets it in a meta tag). Every field is typed and bounded
260
+ (`src/validate.js`). Exports write only into files Roundtable wrote (a signature in the record's
261
+ front matter, a marked region in the index) and refuse the home directory and filesystem roots.
262
+ Protected-directory checks resolve symlinks and junctions. Record and index destinations must
263
+ be regular files or absent; temporary files are created exclusively before atomic replacement.
264
+ POSIX replacements preserve existing permission bits; new exports use `0666` filtered by the
265
+ process umask. Choose a private export directory or restrictive umask for private decisions.
266
+ Every response carries a Content-Security-Policy that lets only this server's own scripts run in
267
+ the page, keeps fetches and the event stream same-origin, forbids framing, and disables content
268
+ sniffing, so a reply that slipped past the board's escaping could not read the launch token.
269
+
270
+ Preflight `GET` reads cached status only, including when `fresh` is present in the query. Missing
271
+ snapshots say not checked; expired snapshots are labelled stale. CLI status and quota refreshes
272
+ require authenticated `POST`. Concurrent refreshes share work per pool, with at most two pool
273
+ checks running and twelve running or queued in total. Requests beyond that limit receive a busy
274
+ status. Results are cached for one minute; forced refreshes have a five-second cooldown per pool.
275
+ The cache retains at most 64 completed snapshots. These bounds cover preflight refresh work;
276
+ startup catalogue/quota reads and debate calls have their own existing timeouts and controls.
277
+
278
+ Claude and Antigravity usage reads must be proven free of model work. A proven-free answer
279
+ without limits leaves quota unknown or retains the last figure; the next normal refresh can
280
+ try again. An answer that is not proven free, or a timeout, still disables that reader until
281
+ restart. No additional retry or polling loop is started.
282
+
283
+ The browser waits up to 15 seconds for ordinary setup/history and action requests. It never
284
+ automatically retries a failed write, since a lost response can hide an action already accepted
285
+ by the server. This timeout is not a cancellation of a debate or provider call. Pending action
286
+ buttons prevent duplicate submissions in that page; they are not a server-side idempotency
287
+ guarantee. The launch token remains required for every write, including retries initiated by
288
+ the user. Resume notes supplied before the first complete round are also private transcript
289
+ data and are included in subsequent prompts, replay and exports.
290
+
291
+ The read-only event stream acknowledges reconnects immediately, including when no events
292
+ were missed. Reconnecting or replaying a board does not dispatch provider calls.
293
+
294
+ ## Reporting
295
+
296
+ Use [private vulnerability reporting](https://github.com/prplkane/roundtable/security/advisories/new).
297
+ Include the affected version and steps to reproduce the problem. Do not attach credentials,
298
+ login files or real debate contents. If private reporting is unavailable, use the contact
299
+ method listed on the [maintainer's profile](https://github.com/prplkane).