Upgrade `caveman learn` from a Claude/Codex setup linter into a broader local optimizer. It now scans Gemini, opencode, and opt-in aider history, uses catalog-backed context windows and measured turn-1 prefix evidence, adds new behavioral detectors, and ranks grouped portfolio moves without mixing historical totals into forward rates.
The CLI/proxy/TUI now support `learn applied`, `learn simulate`, `--repo`, per-repo reporting, and confirmed longitudinal fix verdicts (`improved`, `unchanged`, `regressed`, `insufficient_data`). Docs, the embedded `caveman-learn` skill, and tests were updated to cover the new learn v2 behavior and planning artifacts.
A caveman-proxy pointed at a local relay (a self-hosted gateway, vLLM, Ollama,
LM Studio) is blocked at 127.0.0.1 with a message that states the range and
stops there. Self-hosted mode has always allowed exactly this via
CAVE_SSRF_ALLOWLIST, but a fail-closed guard that does not name its own escape
hatch reads as "unsupported" rather than "not opted in" — #841 concluded the
proxy could not forward to a custom upstream at all.
Self-hosted blocks now name the setting and a concrete entry to add. Managed
mode is deliberately unchanged: the allowlist is a no-op there by contract, so
advertising it would send an operator after a setting that cannot help.
The suggested entry has to round-trip. ValidateHost pre-flights with an empty
port, so JoinHostPort would emit a trailing-colon token like "127.0.0.1:" that
matches only the port-less stage — an operator following it literally would
relax pre-flight, get blocked again at dial time by a second message naming a
different token, and leave a stale weakening entry behind. The bare address
form is used when no port is known. The tests parse the suggestion back out of
the error and require it to actually unblock the destination, at both
pre-flight and dial time, so they cannot certify broken advice.
Refs #841 — the proxy's upstream is configured via compat/providers base_url;
this only makes the guard self-documenting.
Permit mihomo's synthetic IPv4 and IPv6 pools only in self-hosted SSRF mode so provider traffic reaches the local TUN. Managed mode and metadata-sensitive ranges remain blocked.\n\nRefs #827
Removes ADR citations (decision records live in the private repo;
links were broken here) while keeping every described invariant
inline, and fixes generator headers / doc titles that leaked the
private monorepo layout (public/cli, cloud/web). Comments and docs
only — no behavior change.
Claude-Session: https://claude.ai/code/session_01DLNTYJU8vMEdDWpV7e7k7Z
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Single-commit port of the Caveman 2 tree onto the original repo history
(candidate caveman-2@88878a4 applied over main@3098342). No unrelated-history
merge; original history untouched.
Preserved v1 surfaces:
- skills/caveman/SKILL.md byte-for-byte, plus plugin mirror and caveman.skill zip
- legacy CI (Node 18/20/22 installer + Python 3.11 suites) alongside engine-ci
- cli/install.js compatibility shim forwarding to bin/install.js
- .codex/config.toml ships both hooks and codex_hooks for older Codex (#617)
- README Trendshift + Skills.sh badges and local star-history asset
- v1.10.0-pinned curl installs; benchmarks/tmp-starcharts ignore rules
Fixed for public same-repo release:
- SECURITY.md vulnerability reporting points at this repository
- release-binaries.yml publishes to this repo via job-scoped GITHUB_TOKEN
(cross-repo PAT removed); binary-release environment still gates signing
- packages/cli/PUBLISHING.md rewritten for packages/ layout and same-repo flow
- profile-contract and provider-catalog lanes skip lane-scope gates on
initial import so the launch PR can gate on their real validation steps
- ANNOUNCEMENT.md network claim corrected: compression is local; requests
still go to the provider you configured
Caveman 2 stays opt-in: bin-v1.0.0 binaries and @caveman-ai/cli publish
separately after this lands and soaks.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BLvb5QniwYjmcawyssQNw9