Review follow-ups to #945: a listener caveman did not start this run and
cannot prove it owns (foreign process, or a proxy binary too old to
answer) now launches direct, and the direct-launch strip removes the
agent-attributed /w/<agent> route as well as the bare gateway URL, so a
leaked outer route never reaches the child. Qwen's ACP and extension
listing guards accept yargs camelCase spellings. Proxy-aware fetch no
longer sets an IP literal as TLS servername (rejected on Node 26). The
conformance-pin test fixture follows the pinned-upstream-binary job.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A foreign listener on 127.0.0.1:8787 used to get the banner but still
receive the routed launch, which would send the operator's provider
keys to a process caveman does not own (#945). Treat it like a gate
mismatch and fall back to a direct launch.
Also: Claude Code refuses Remote Control behind any non-first-party
ANTHROPIC_BASE_URL, so `caveman claude remote-control` launches direct
and the limitation is documented (#947); caveman-compress reads the
first text block instead of content[0] so a leading tool_use block no
longer crashes after a paid call (closes#932's report); hook checksum
manifest regenerated after #794.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two-size install story, a What-you-save section with static SVG charts
rendered from the committed benchmark table, and plain-language copy
for non-programmers. Charts regenerate with benchmarks/render_charts.py.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bare start never stamps global recovery; the banner now says which
sessions compress (those whose agent carries caveman_retrieve) and the
status mcp-missing row keys off any installed MCP marker.
Qwen: refuse extension, ACP, session-restore, control-command, and
enforced-auth surfaces that could reactivate a provider route outside
the locked session; replace modelProviders/providerProtocol wholesale
in the routed profile; keep web search and workflows off via env.
Kilo: daemon and console launch direct since they outlive the wrap.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A bare proxy serves whichever client connects, so a machine-level MCP
install marker can never bind to one request. Read the namespaced
caveman retrieve tool out of the request's own tool list instead, so
subscription and OAuth sessions on a standalone proxy reach the live
zone when their agent carries the tool (#908).
Cache-breakpoint planning and the provider-native cache optimizers now
default on in optimization modes; explicit off and unknown values still
fail closed, and record mode never runs them.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The standalone cache planner is no longer in scope here. Drop the
directory and its BSL listing, license scope note, contributor note,
and the verify_repo license-boundary entry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
compress_file() wrote each un-validated candidate straight to the live
source file and validated it in place. An interruption (Ctrl-C,
SIGTERM, OOM, or a harness killing the process) between that write and
a passing validation left the live file holding un-validated or
garbage output, with the out-of-tree backup as the only recovery path.
Each candidate is now staged next to the source and validated there;
the live file is written only once a candidate passes, and left
untouched if every attempt fails.
Fixes#544
Signed-off-by: Amir Fathi <amirfathi.me@gmail.com>
The proxy now registers /compat/opencode-go/ with a default upstream
and the OPENCODE_API_KEY credential variable. Add the mount and the
user override to the provider docs. Add the variable to the
credential list.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: Zsolt Gaspar <17578237+zsltg@users.noreply.github.com>
The pi extension routed models by wire protocol only. OpenCode Go
models use the OpenAI protocol, so the gateway sent them to
api.openai.com. The OpenCode Go key then caused a 401 error.
The extension now routes by provider and API. OpenCode Go models go
to the /w/pi/compat/opencode-go mount. The extension does not route
unknown providers and shows a pass-through warning.
The standalone proxy registers a built-in compat mount with the
upstream https://opencode.ai/zen/go. The config package holds the
built-in table, so the mount and its key policy come from one place.
A user compat entry with the same name wins. Keyless requests to this
mount use OPENCODE_API_KEY, not OPENAI_COMPAT_API_KEY.
Fixes#946
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Zsolt Gaspar <17578237+zsltg@users.noreply.github.com>