@prplkane/roundtable 0.0.0-stage → 0.6.3
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 +513 -0
- package/LICENSE +21 -0
- package/README.md +188 -3
- package/SECURITY.md +299 -0
- package/docs/workflow.md +1325 -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 +55 -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 +96 -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 +82 -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 +913 -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 +53 -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/README.md
CHANGED
|
@@ -1,3 +1,188 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
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 and installed version beside it. Narrow terminals and
|
|
73
|
+
terminals without UTF-8 use a short title; `NO_COLOR=1` disables color. Redirected output,
|
|
74
|
+
CI, dumb terminals, MCP and JSON commands omit the decoration.
|
|
75
|
+
|
|
76
|
+
### Try the demo
|
|
77
|
+
|
|
78
|
+
The demo uses scripted replies. It needs no provider account and makes no model calls.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/prplkane/roundtable.git
|
|
82
|
+
cd roundtable
|
|
83
|
+
npm run fake
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The board opens at [localhost:4748](http://localhost:4748/). If no browser window appears,
|
|
87
|
+
open that address yourself. The header identifies the session as **Demo**. Press Ctrl+C in
|
|
88
|
+
the terminal to stop the server.
|
|
89
|
+
|
|
90
|
+
### Run a live review
|
|
91
|
+
|
|
92
|
+
Install and sign in to a supported CLI, or configure an OpenAI-compatible endpoint using
|
|
93
|
+
the [provider setup guide](docs/workflow.md). CLI seats use your existing logins; hosted API
|
|
94
|
+
endpoints have separate billing.
|
|
95
|
+
|
|
96
|
+
**Antigravity and your Google account:** Google's [Antigravity FAQ](https://antigravity.google/docs/faq)
|
|
97
|
+
says wrapping `agy` inside third-party applications is not supported under consumer plans,
|
|
98
|
+
and that third-party access can lead to suspension or termination of the account. Roundtable
|
|
99
|
+
runs `agy -p` in that way. It sends nothing to `agy`, not even a model-list or quota read,
|
|
100
|
+
until you acknowledge this once on an Antigravity card; an agent request must send
|
|
101
|
+
`options.acknowledgeTermsRisk: true` itself. Check your plan's terms, or use another provider.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npm run doctor
|
|
105
|
+
npm start
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Open [localhost:4747](http://localhost:4747/). The header identifies the session as **Live**.
|
|
109
|
+
Start with two seats and one critique round; see the [first test-drive checklist](docs/workflow.md#a-first-live-test-drive)
|
|
110
|
+
for a complete walkthrough. `npm run doctor` checks setup without making model calls.
|
|
111
|
+
|
|
112
|
+
After updating, stop the running server with Ctrl+C, run `npm start` again and refresh the
|
|
113
|
+
page. Refreshing the browser alone does not load an updated server or model list.
|
|
114
|
+
|
|
115
|
+
## Controls and limits
|
|
116
|
+
|
|
117
|
+
| Control | Behavior |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| Answer questions | Add context before the discussion continues. Agent notes and your notes are labelled separately. |
|
|
120
|
+
| Finish with verdict | End the discussion and request a recommendation from the completed replies. Available after a usable round. |
|
|
121
|
+
| Stop | Cancel the discussion and any active chairman call. Saved replies and reported usage remain. |
|
|
122
|
+
| Delete / Clear | Remove finished and interrupted history while protecting running sessions. Exports and local usage statistics are retained. |
|
|
123
|
+
|
|
124
|
+
Set round, time and provider budget limits before starting. Budget checks run before each
|
|
125
|
+
attempt, including retries. If a provider omits token usage while a token cap is set, further
|
|
126
|
+
calls to that provider are blocked. Calls already running can exceed estimates; these checks
|
|
127
|
+
are not guaranteed billing ceilings.
|
|
128
|
+
|
|
129
|
+
## Records and privacy
|
|
130
|
+
|
|
131
|
+
- **Local storage:** history is saved outside the checkout in the OS user-data folder, with
|
|
132
|
+
separate live and demo directories. The board shows the active location under **Local data
|
|
133
|
+
and backups**. Stop the server before copying or moving that folder.
|
|
134
|
+
- **Recovery and export:** saved reviews can be reopened after a restart. Interrupted writes
|
|
135
|
+
retain a backup before recovery. Markdown exports include the recommendation, dissent,
|
|
136
|
+
human decision, notes and reported usage.
|
|
137
|
+
- **Provider access:** live reviews send relevant notes and replies to the selected providers.
|
|
138
|
+
Local storage and stateless requests do not control provider retention. CLI tool restrictions
|
|
139
|
+
depend on the installed CLI and are not an operating-system sandbox.
|
|
140
|
+
|
|
141
|
+
Records, exports and browser preferences may contain private context. See [SECURITY.md](SECURITY.md)
|
|
142
|
+
for credentials, billing, endpoint restrictions and the local HTTP boundary. If a request
|
|
143
|
+
fails, use **Save error log** and keep its reference ID; diagnostic logs stay local and omit
|
|
144
|
+
review text, credentials and personal paths.
|
|
145
|
+
|
|
146
|
+
## Automation and commands
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
node src/cli.js agent --help
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
The JSON client provides `status`, `check`, `start`, `wait` and `answer` commands, plus controls
|
|
153
|
+
to finish or stop a review. Questions remain paused until answered, explicitly skipped or
|
|
154
|
+
their answer window expires (two minutes by default). Silence continues with unknowns intact.
|
|
155
|
+
See the [agent workflow](docs/workflow.md#8-run-a-debate-without-the-browser)
|
|
156
|
+
for request examples and response fields.
|
|
157
|
+
|
|
158
|
+
| Command | Purpose |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| `npm run fake` | Open the scripted demo on port 4748. |
|
|
161
|
+
| `npm start` | Open the live board on port 4747. |
|
|
162
|
+
| `npm run doctor` | Check installed providers and available status without model calls. |
|
|
163
|
+
| `roundtable setup --client all` | Connect MCP tools and the skill across projects for Codex, Claude and AGY. |
|
|
164
|
+
| `roundtable server status` | Inspect the background board; `stop` and `restart` refuse active reviews. |
|
|
165
|
+
| `roundtable mcp` | Serve the agent workflow over MCP stdio. |
|
|
166
|
+
| `npm run export -- <debate> <folder>` | Export a decision record and update its index. |
|
|
167
|
+
| `npm test` | Run offline unit and integration tests, without vendor CLIs or model calls. |
|
|
168
|
+
|
|
169
|
+
## Documentation
|
|
170
|
+
|
|
171
|
+
- [User guide](docs/workflow.md): setup, providers, limits, backup, recovery and troubleshooting
|
|
172
|
+
- [Security](SECURITY.md): data handling and private vulnerability reporting
|
|
173
|
+
- [Contributing](CONTRIBUTING.md): development and review requirements
|
|
174
|
+
- [Changelog](CHANGELOG.md): changes by version
|
|
175
|
+
|
|
176
|
+
## Feedback and support
|
|
177
|
+
|
|
178
|
+
Ask questions, report bugs or suggest changes through [GitHub Issues](https://github.com/prplkane/roundtable/issues).
|
|
179
|
+
For a bug, include your OS, Node and provider CLI versions, steps to reproduce, and the error
|
|
180
|
+
reference if available. Exclude credentials and private review content. Support is best effort.
|
|
181
|
+
Report security issues through the [private reporting channel](https://github.com/prplkane/roundtable/security/advisories/new).
|
|
182
|
+
|
|
183
|
+
If Roundtable is useful to you, consider starring the repository.
|
|
184
|
+
Maintained by [prplkane](https://github.com/prplkane).
|
|
185
|
+
|
|
186
|
+
## License
|
|
187
|
+
|
|
188
|
+
[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).
|