chameleon 2.15.0
Refresh now derives from the genuinely-latest production, not the user's last
fetch. When a repo has a locked production_ref, /chameleon-refresh and the
background auto-refresh run one bounded git fetch origin <branch> before
resolving the tip — DEFAULT-ON, the one network path made default-on by design.
Added
- Production-ref fetch-before-refresh (
auto_refresh.fetch_production_ref,
default true; kill switchCHAMELEON_FETCH_PRODUCTION_REF=0). Before refresh
resolves the locked production tip, it fetchesorigin <branch>so the
derivation sees the latest production rather than whatever the user last
fetched. One fetch site inrefresh_reposerves both manual and auto-refresh;
bootstrap/init never fetch. The outcome rides out in the refresh envelope's
production_ref_fetchblock andauto_refresh.log, so a stale derivation
always says WHY.- Hang-proof + non-interactive. The fetch runs with
GIT_TERMINAL_PROMPT=0,
an empty askpass, and SSHBatchMode=yesso a missing credential is a clean
failure, never a prompt; a hardCHAMELEON_PRODUCTION_REF_FETCH_TIMEOUT_SECONDS
(default 10) wall-clock plus a process-group SIGKILL (taskkill tree on
Windows) backstops a stuck transfer. - Fails open, classified, surfaced. Any non-ok outcome (timeout /
no_network / auth / no_remote_ref / concurrent / unknown) falls back to the
existing last-fetched ref and reports a specific reason — the auth reason
tells the user the exactgit fetch origin <branch>to run by hand. - Self-suppresses where a surprise network call is wrong. Off under
CI,
off when the branch is not origin-backed (re-detected, not inferred), and a
CHAMELEON_PRODUCTION_REF_FETCH_BACKOFF_HOURS(default 6) backoff after a
persistent auth/branch-gone failure so a misconfigured remote isn't re-hit
every session. NO fetch on any hook hot path (PreToolUse/PostToolUse/
SessionStart stay offline).
- Hang-proof + non-interactive. The fetch runs with
This is a deliberate, single exception to the "network paths stay opt-in"
principle, made default-on by maintainer decision and surfaced here rather than
buried. Designed via a multi-agent panel with adversarial review; shipped with a
fake-git-shim test battery (classifier, timeout-kill, non-interactive env,
backoff) plus real-local-origin integration and hot-path no-fetch assertions.