chameleon 2.18.0
Two fixes. The hooks now pin a Python they can actually run, so enforcement stops
silently switching itself off on machines without a modern interpreter on PATH.
And teaching the profile no longer bounces you to re-confirm your own change.
Fixed
- Hooks pin a dep-capable Python >=3.11 instead of falling through to a stale
system interpreter. Each hook resolved its own Python via a ladder that ended
in a blindpython3; on macOS that is/usr/bin/python3(3.9.x, below the
floor, no deps), so the hook failed and fail-opened — and inenforcemode a
real violation could pass unblocked with no signal. A shared resolver
(hooks/_resolve-python.sh) now walks the bundled venv, thenpython3.13/12/11,
thenuv run(the same resolver the MCP server uses), and only a
version-probed barepython3— or surfaces a one-line SessionStart banner when
nothing >=3.11 resolves. The resolver runs as a subprocess, so a corrupt or
missing copy degrades the hook instead of aborting it. The merge driver uses the
same resolver./chameleon-doctornow reports the exact interpreter the hooks
pick (command + version + dep status), and a SessionStart banner flags repeated
hook fail-opens so a degraded session is not mistaken for a healthy one.
Changed
- Teaching no longer stales your own trust.
teach_profilealready re-granted
trust after editingidioms.md; the same now holds forteach_competing_import,
unteach_competing_import, and the deprecated-idiom paths of
teach_profile_structured(which/chameleon-auto-idiomuses). A teach you ran
yourself keeps the profile trusted instead of bouncing you to re-/chameleon-trust.
The guarantee is bounded: trust is preserved only when the profile was already
trusted (not when it was untrusted or already stale under a teammate's change),
and the re-grant still runs the injection scan, so a poisoned teach is refused
and stays stale rather than silently re-trusted.