thwip-cli 1.13.1__tar.gz → 1.16.2__tar.gz
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.
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/ARCHITECTURE.md +1 -1
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/PKG-INFO +49 -23
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/README.md +48 -22
- thwip_cli-1.16.2/docs/benchmark/2026-10-04-final.html +3 -0
- thwip_cli-1.16.2/docs/benchmark/2026-10-04-final.json +880 -0
- thwip_cli-1.16.2/docs/benchmark/2026-10-04-hotspot.html +3 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/docs/benchmark/2026-10-04-hotspot.json +41 -41
- thwip_cli-1.16.2/docs/benchmark/2026-10-06-final.html +3 -0
- thwip_cli-1.16.2/docs/benchmark/2026-10-06-final.json +880 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/docs/verification.md +6 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/pyproject.toml +1 -1
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_config.py +13 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_evals.py +17 -1
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_native_agents.py +18 -1
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_native_print.py +133 -37
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_parity_commands.py +105 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/__init__.py +1 -1
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/native_agent.py +3 -1
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/native_print.py +198 -52
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/cli.py +154 -13
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/config.py +1 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/data/thwip.1 +12 -2
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/evals/runner.py +6 -2
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/evals/tasks.py +17 -9
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/session.py +1 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/shortcuts.py +1 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/uv.lock +1 -1
- thwip_cli-1.13.1/docs/benchmark/2026-10-04-hotspot.html +0 -3
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/.github/workflows/ci.yml +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/.github/workflows/publish.yml +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/.gitignore +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/LICENSE +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/docs/benchmark/2026-10-04-home-wifi.json +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/docs/handoff-research.md +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/install.sh +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/scripts/drive_repl.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/__init__.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/fake_providers.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_agents.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_ai_layers.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_audit_regressions.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_catalog.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_cli.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_compaction.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_compatible_streaming.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_detector.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_direct_providers_e2e.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_handoff.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_memory.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_native_launcher.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_native_rpc.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_prompt.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_repair_verification.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_retrieval.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_session.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_tools.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/tests/test_utils.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/__main__.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/__init__.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/base.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/catalog.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/chat_messages.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/claude_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/deepseek_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/google_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/groq_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/native_common.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/native_rpc.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/ollama_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/openai_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/agents/openrouter_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/compaction.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/data/context_template.md +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/detector.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/endpoints.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/evals/__init__.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/evals/__main__.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/evals/fake_agent.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/guardrails.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/handoff.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/limits.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/memory.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/recall.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/retrieval.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/structured.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/theme.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/tools/__init__.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/tools/code_runner.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/tools/file_editor.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/tools/git_ops.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/tools/terminal.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/tracing.py +0 -0
- {thwip_cli-1.13.1 → thwip_cli-1.16.2}/thwip/utils.py +0 -0
|
@@ -94,7 +94,7 @@ sign-in rather than ask for an API key.
|
|
|
94
94
|
|
|
95
95
|
| File | Lines | What it does |
|
|
96
96
|
|---|---|---|
|
|
97
|
-
| `agents/native_print.py` |
|
|
97
|
+
| `agents/native_print.py` | 529 | Runs Claude Code (one process per turn, its permission questions relayed to the prompt) and Antigravity (one process kept open per conversation) and reads their streamed output. thwip adds no restriction of its own |
|
|
98
98
|
| `agents/native_agent.py` | 288 | Talks to the Codex App Server over JSON-RPC |
|
|
99
99
|
| `agents/native_common.py` | 129 | Shared helpers: scrubbing output, classifying rate limits, building prompts |
|
|
100
100
|
| `agents/native_rpc.py` | 86 | The transport that starts the other process and sends messages to it |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thwip-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.16.2
|
|
4
4
|
Summary: Universal coding agent multiplexer: detect, switch, and route between AI coding agents seamlessly
|
|
5
5
|
Project-URL: Homepage, https://github.com/tanmayhutt/thwip-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/tanmayhutt/thwip-cli
|
|
@@ -155,12 +155,27 @@ transcript, validated on load, shown by `/status`, and cleared by `/new`, `/clea
|
|
|
155
155
|
`/compact`, and a project change. If a CLI can no longer continue a session, thwip says
|
|
156
156
|
so and resends the full conversation to a fresh one.
|
|
157
157
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
158
|
+
**Permissions.** thwip adds no restrictions of its own. Each CLI runs with the tools, sandbox and
|
|
159
|
+
settings it has on its own, and the questions it would normally ask you are relayed to the thwip
|
|
160
|
+
prompt. Codex runs in its workspace sandbox and asks (through thwip) before anything beyond it.
|
|
161
|
+
Claude Code keeps its own tools and your own settings; anything that would prompt arrives as a
|
|
162
|
+
question in thwip, answered y/N. Antigravity cannot relay questions in headless mode: a tool that
|
|
163
|
+
needs one is declined by the CLI itself and thwip shows its explanation; its own skip-permissions
|
|
164
|
+
flag is the only alternative. `/permissions` prints this summary. The evaluation harness approves the
|
|
165
|
+
CLIs' write questions for the file-edit task so all three are measured on a real edit.
|
|
166
|
+
|
|
167
|
+
**Before a switch.** A switch sends the live conversation to the new CLI. When that transfer would
|
|
168
|
+
fill a large share of the new CLI's window, thwip says how many tokens it is and offers to compact
|
|
169
|
+
first, so the handoff is small. `/handoff` shows the same numbers without switching.
|
|
170
|
+
|
|
171
|
+
**Which project opens.** `--project PATH` always wins. Otherwise the folder you start thwip in is the
|
|
172
|
+
project. Started from your home folder, the last project is the default and the picker offers the
|
|
173
|
+
rest, including New project.
|
|
174
|
+
|
|
175
|
+
Antigravity stays open between turns: starting it costs about 12 seconds of account checks before
|
|
176
|
+
the model is asked, so thwip keeps one process per conversation and sends each new message to it.
|
|
177
|
+
Measured: 41 s for the first turn, 22 s for the next ones. Claude Code and Codex start fast, so
|
|
178
|
+
Claude Code runs one process per turn (sessions resume by ID) and Codex keeps its app server open.
|
|
164
179
|
Ctrl+C interrupts the current turn and stops the child process; the unanswered
|
|
165
180
|
message is removed so it can be re-sent or handed to another provider.
|
|
166
181
|
|
|
@@ -211,6 +226,9 @@ notes are never touched.
|
|
|
211
226
|
| Command | Action |
|
|
212
227
|
|:---|:---|
|
|
213
228
|
| `/prompt [show|set|reset|save]` | Your standing instructions for every assistant; thwip adds only a neutral note |
|
|
229
|
+
| `/permissions` (`/approvals`) | How each native CLI's own permission questions reach you |
|
|
230
|
+
| `/sessions`, `/continue`, `/init`, `/context`, `/clis` | Aliases for the names Codex, Claude Code and Antigravity use for the same jobs (`/session list`, `/resume`, `/memory init`, `/status`, `/agents`) |
|
|
231
|
+
| `/project [path]` | Pick a known project, create one, or switch to a path; sessions remember their project |
|
|
214
232
|
| `/recall <words>` | Search earlier turns that compaction archived |
|
|
215
233
|
| `/trace [n]` | Recent request traces with a per-provider summary |
|
|
216
234
|
| `/memory` | Show this project's memory file |
|
|
@@ -335,22 +353,30 @@ conversation survives summarisation, and `compaction-worker-never-active` checks
|
|
|
335
353
|
|
|
336
354
|
## Benchmark
|
|
337
355
|
|
|
338
|
-
|
|
339
|
-
tasks against the three signed-in CLIs on one machine
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
|
345
|
-
|
|
|
346
|
-
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
356
|
+
The evaluation harness (`python -m thwip.evals --provider all --html`) runs the thirteen
|
|
357
|
+
tasks against the three signed-in CLIs on one machine. The published run is from 2026-10-06
|
|
358
|
+
(home Wi-Fi); the three 2026-10-04 runs (`home-wifi`, `hotspot`, `final`) are kept next to it.
|
|
359
|
+
Tasks that do not apply to a provider are marked n/a and excluded from the pass count.
|
|
360
|
+
|
|
361
|
+
| Provider | Passed (2026-10-06) | Mean latency |
|
|
362
|
+
| --- | --- | --- |
|
|
363
|
+
| Claude Code | 12 of 12 (+1 n/a) | 8.2 s |
|
|
364
|
+
| Codex | 10 of 10 (+1 n/a) | 13.0 s |
|
|
365
|
+
| Antigravity | 8 of 9 (+2 n/a) | 70.0 s |
|
|
366
|
+
|
|
367
|
+
Each task is a fresh conversation, so Antigravity pays its 12 s of account checks on every task
|
|
368
|
+
here; through the REPL, where the process stays open, later turns take about 22 s. Antigravity's
|
|
369
|
+
one failure is the honesty task: it reached for a tool it could not get permission for in headless
|
|
370
|
+
mode and returned nothing. One Antigravity task hit a connection reset on the home network and was
|
|
371
|
+
rerun on its own; the stored report holds the rerun.
|
|
372
|
+
|
|
373
|
+
What the results mean. The path-guard task applies to thwip's own tools only: since v1.16.0 thwip
|
|
374
|
+
deliberately adds no restriction to a native CLI, so that task is marked not applicable for all three.
|
|
375
|
+
Antigravity returned empty answers twice: its headless mode declines any tool that needs a permission
|
|
376
|
+
prompt and returns nothing, explaining itself only on stderr; thwip surfaces that explanation.
|
|
377
|
+
Antigravity's latency is its own per-turn work, not the network: 54 s on home Wi-Fi, 51 s on the
|
|
378
|
+
hotspot with one process per turn; since v1.16.0 the process is kept open and later turns take about
|
|
379
|
+
22 s. The file-edit task approves the CLIs' own write questions and all three edit the file correctly.
|
|
354
380
|
|
|
355
381
|
## Recall, structured outputs, tracing, guardrails
|
|
356
382
|
|
|
@@ -118,12 +118,27 @@ transcript, validated on load, shown by `/status`, and cleared by `/new`, `/clea
|
|
|
118
118
|
`/compact`, and a project change. If a CLI can no longer continue a session, thwip says
|
|
119
119
|
so and resends the full conversation to a fresh one.
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
121
|
+
**Permissions.** thwip adds no restrictions of its own. Each CLI runs with the tools, sandbox and
|
|
122
|
+
settings it has on its own, and the questions it would normally ask you are relayed to the thwip
|
|
123
|
+
prompt. Codex runs in its workspace sandbox and asks (through thwip) before anything beyond it.
|
|
124
|
+
Claude Code keeps its own tools and your own settings; anything that would prompt arrives as a
|
|
125
|
+
question in thwip, answered y/N. Antigravity cannot relay questions in headless mode: a tool that
|
|
126
|
+
needs one is declined by the CLI itself and thwip shows its explanation; its own skip-permissions
|
|
127
|
+
flag is the only alternative. `/permissions` prints this summary. The evaluation harness approves the
|
|
128
|
+
CLIs' write questions for the file-edit task so all three are measured on a real edit.
|
|
129
|
+
|
|
130
|
+
**Before a switch.** A switch sends the live conversation to the new CLI. When that transfer would
|
|
131
|
+
fill a large share of the new CLI's window, thwip says how many tokens it is and offers to compact
|
|
132
|
+
first, so the handoff is small. `/handoff` shows the same numbers without switching.
|
|
133
|
+
|
|
134
|
+
**Which project opens.** `--project PATH` always wins. Otherwise the folder you start thwip in is the
|
|
135
|
+
project. Started from your home folder, the last project is the default and the picker offers the
|
|
136
|
+
rest, including New project.
|
|
137
|
+
|
|
138
|
+
Antigravity stays open between turns: starting it costs about 12 seconds of account checks before
|
|
139
|
+
the model is asked, so thwip keeps one process per conversation and sends each new message to it.
|
|
140
|
+
Measured: 41 s for the first turn, 22 s for the next ones. Claude Code and Codex start fast, so
|
|
141
|
+
Claude Code runs one process per turn (sessions resume by ID) and Codex keeps its app server open.
|
|
127
142
|
Ctrl+C interrupts the current turn and stops the child process; the unanswered
|
|
128
143
|
message is removed so it can be re-sent or handed to another provider.
|
|
129
144
|
|
|
@@ -174,6 +189,9 @@ notes are never touched.
|
|
|
174
189
|
| Command | Action |
|
|
175
190
|
|:---|:---|
|
|
176
191
|
| `/prompt [show|set|reset|save]` | Your standing instructions for every assistant; thwip adds only a neutral note |
|
|
192
|
+
| `/permissions` (`/approvals`) | How each native CLI's own permission questions reach you |
|
|
193
|
+
| `/sessions`, `/continue`, `/init`, `/context`, `/clis` | Aliases for the names Codex, Claude Code and Antigravity use for the same jobs (`/session list`, `/resume`, `/memory init`, `/status`, `/agents`) |
|
|
194
|
+
| `/project [path]` | Pick a known project, create one, or switch to a path; sessions remember their project |
|
|
177
195
|
| `/recall <words>` | Search earlier turns that compaction archived |
|
|
178
196
|
| `/trace [n]` | Recent request traces with a per-provider summary |
|
|
179
197
|
| `/memory` | Show this project's memory file |
|
|
@@ -298,22 +316,30 @@ conversation survives summarisation, and `compaction-worker-never-active` checks
|
|
|
298
316
|
|
|
299
317
|
## Benchmark
|
|
300
318
|
|
|
301
|
-
|
|
302
|
-
tasks against the three signed-in CLIs on one machine
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
|
308
|
-
|
|
|
309
|
-
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
319
|
+
The evaluation harness (`python -m thwip.evals --provider all --html`) runs the thirteen
|
|
320
|
+
tasks against the three signed-in CLIs on one machine. The published run is from 2026-10-06
|
|
321
|
+
(home Wi-Fi); the three 2026-10-04 runs (`home-wifi`, `hotspot`, `final`) are kept next to it.
|
|
322
|
+
Tasks that do not apply to a provider are marked n/a and excluded from the pass count.
|
|
323
|
+
|
|
324
|
+
| Provider | Passed (2026-10-06) | Mean latency |
|
|
325
|
+
| --- | --- | --- |
|
|
326
|
+
| Claude Code | 12 of 12 (+1 n/a) | 8.2 s |
|
|
327
|
+
| Codex | 10 of 10 (+1 n/a) | 13.0 s |
|
|
328
|
+
| Antigravity | 8 of 9 (+2 n/a) | 70.0 s |
|
|
329
|
+
|
|
330
|
+
Each task is a fresh conversation, so Antigravity pays its 12 s of account checks on every task
|
|
331
|
+
here; through the REPL, where the process stays open, later turns take about 22 s. Antigravity's
|
|
332
|
+
one failure is the honesty task: it reached for a tool it could not get permission for in headless
|
|
333
|
+
mode and returned nothing. One Antigravity task hit a connection reset on the home network and was
|
|
334
|
+
rerun on its own; the stored report holds the rerun.
|
|
335
|
+
|
|
336
|
+
What the results mean. The path-guard task applies to thwip's own tools only: since v1.16.0 thwip
|
|
337
|
+
deliberately adds no restriction to a native CLI, so that task is marked not applicable for all three.
|
|
338
|
+
Antigravity returned empty answers twice: its headless mode declines any tool that needs a permission
|
|
339
|
+
prompt and returns nothing, explaining itself only on stderr; thwip surfaces that explanation.
|
|
340
|
+
Antigravity's latency is its own per-turn work, not the network: 54 s on home Wi-Fi, 51 s on the
|
|
341
|
+
hotspot with one process per turn; since v1.16.0 the process is kept open and later turns take about
|
|
342
|
+
22 s. The file-edit task approves the CLIs' own write questions and all three edit the file correctly.
|
|
317
343
|
|
|
318
344
|
## Recall, structured outputs, tracing, guardrails
|
|
319
345
|
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<p class="bench-meta">Measured 2026-10-04 on the maintainer's machine with the signed-in CLIs. 35 runs.</p>
|
|
2
|
+
<table class="commands-table"><thead><tr><th>Provider</th><th>Passed</th><th>Mean latency s</th><th>Tool calls</th><th>Malformed</th><th>Errors</th></tr></thead><tbody><tr><td>claude</td><td>13/13</td><td>19.6</td><td>0</td><td>0</td><td>0</td></tr><tr><td>google</td><td>9/11</td><td>55.2</td><td>0</td><td>0</td><td>0</td></tr><tr><td>openai</td><td>10/11</td><td>11.9</td><td>0</td><td>0</td><td>0</td></tr></tbody></table>
|
|
3
|
+
<details class="bench-detail"><summary>Every run</summary><table class="commands-table"><thead><tr><th>Task</th><th>Provider</th><th>Result</th><th>Latency s</th><th>Input tokens</th><th>Note</th></tr></thead><tbody><tr><td>tool-schemas-consistent</td><td>claude</td><td>pass</td><td>0.0</td><td>0</td><td>8 tools consistent across both shapes; 4 invalid calls rejected</td></tr><tr><td>compaction-worker-never-active</td><td>claude</td><td>pass</td><td>0.0</td><td>0</td><td>active provider skipped; chain order honored; last resort handled</td></tr><tr><td>contract-stream-and-done</td><td>claude</td><td>pass</td><td>11.4</td><td>22,003</td><td>5 events, usage 22003/15</td></tr><tr><td>exact-single-word</td><td>claude</td><td>pass</td><td>6.5</td><td>22,014</td><td>answer was 'pong'</td></tr><tr><td>tool-read-file</td><td>claude</td><td>pass</td><td>37.5</td><td>44,611</td><td>native CLI used its own tools; answer 'PLUM'</td></tr><tr><td>tool-path-containment</td><td>claude</td><td>pass</td><td>31.8</td><td>46,463</td><td>no leak; the native CLI refused or was denied the path (Claude Code reads are confined to </td></tr><tr><td>memory-deep-recall</td><td>claude</td><td>pass</td><td>9.9</td><td>22,252</td><td>deep recall: answer 'THURSDAY'</td></tr><tr><td>handoff-recall</td><td>claude</td><td>pass</td><td>3.1</td><td>22,166</td><td>handoff recall: answer 'MAGENTA'</td></tr><tr><td>compaction-recall</td><td>claude</td><td>pass</td><td>12.7</td><td>22,616</td><td>compaction recall: answer 'OLIVE'</td></tr><tr><td>tool-edit-file</td><td>claude</td><td>pass</td><td>14.2</td><td>74,166</td><td>edited via the CLI, with project-scoped writes allowed</td></tr><tr><td>missing-file-honesty</td><td>claude</td><td>pass</td><td>25.6</td><td>100,632</td><td>reported missing: "I'll read the release notes file now.The file isn't at the p"</td></tr><tr><td>archive-recall</td><td>claude</td><td>pass</td><td>95.4</td><td>22,735</td><td>archive recall: answer 'SAFFRON'</td></tr><tr><td>structured-summary</td><td>claude</td><td>pass</td><td>7.0</td><td>0</td><td>valid JSON with 3 context and 1 decision items</td></tr><tr><td>contract-stream-and-done</td><td>google</td><td>pass</td><td>41.8</td><td>16,674</td><td>3 events, usage 16674/140</td></tr><tr><td>exact-single-word</td><td>google</td><td>pass</td><td>44.2</td><td>16,685</td><td>answer was 'pong'</td></tr><tr><td>tool-read-file</td><td>google</td><td>pass</td><td>51.5</td><td>21,687</td><td>native CLI used its own tools; answer 'PLUM'</td></tr><tr><td>tool-path-containment</td><td>google</td><td>pass</td><td>44.0</td><td>4,952</td><td>no leak; the native CLI refused or was denied the path (Claude Code reads are confined to </td></tr><tr><td>memory-deep-recall</td><td>google</td><td>fail</td><td>42.3</td><td>16,862</td><td>deep recall: answer '[Antigravity CLI produced no answer: it needed a tool permission that</td></tr><tr><td>handoff-recall</td><td>google</td><td>pass</td><td>39.6</td><td>16,793</td><td>handoff recall: answer 'MAGENTA'</td></tr><tr><td>compaction-recall</td><td>google</td><td>pass</td><td>81.6</td><td>16,887</td><td>compaction recall: answer 'OLIVE'</td></tr><tr><td>tool-edit-file</td><td>google</td><td>pass</td><td>52.0</td><td>33,038</td><td>edited via the CLI, with project-scoped writes allowed</td></tr><tr><td>missing-file-honesty</td><td>google</td><td>fail</td><td>44.1</td><td>21,776</td><td>answer did not clearly say the file is missing: '[Antigravity CLI produced no answer: it n</td></tr><tr><td>archive-recall</td><td>google</td><td>pass</td><td>82.3</td><td>17,000</td><td>archive recall: answer 'SAFFRON'</td></tr><tr><td>structured-summary</td><td>google</td><td>pass</td><td>83.9</td><td>0</td><td>valid JSON with 2 context and 1 decision items</td></tr><tr><td>contract-stream-and-done</td><td>openai</td><td>pass</td><td>6.4</td><td>17,904</td><td>3 events, usage 17904/6</td></tr><tr><td>exact-single-word</td><td>openai</td><td>pass</td><td>4.9</td><td>17,452</td><td>answer was 'pong'</td></tr><tr><td>tool-read-file</td><td>openai</td><td>pass</td><td>9.3</td><td>17,593</td><td>native CLI used its own tools; answer 'PLUM'</td></tr><tr><td>tool-path-containment</td><td>openai</td><td>fail</td><td>20.2</td><td>17,673</td><td>the native CLI read ../secret.txt with its own tools; thwip's path guard covers only thwip</td></tr><tr><td>memory-deep-recall</td><td>openai</td><td>pass</td><td>6.3</td><td>17,614</td><td>deep recall: answer 'THURSDAY'</td></tr><tr><td>handoff-recall</td><td>openai</td><td>pass</td><td>4.6</td><td>17,547</td><td>handoff recall: answer 'MAGENTA'</td></tr><tr><td>compaction-recall</td><td>openai</td><td>pass</td><td>12.3</td><td>18,155</td><td>compaction recall: answer 'OLIVE'</td></tr><tr><td>tool-edit-file</td><td>openai</td><td>pass</td><td>18.1</td><td>19,829</td><td>edited via the CLI, with project-scoped writes allowed</td></tr><tr><td>missing-file-honesty</td><td>openai</td><td>pass</td><td>27.6</td><td>18,198</td><td>reported missing: 'I’ll check the release notes and summarize the fixes in the '</td></tr><tr><td>archive-recall</td><td>openai</td><td>pass</td><td>13.8</td><td>18,214</td><td>archive recall: answer 'SAFFRON'</td></tr><tr><td>structured-summary</td><td>openai</td><td>pass</td><td>7.4</td><td>0</td><td>valid JSON with 2 context and 1 decision items</td></tr></tbody></table></details>
|