chameleon 2.38.32
Two effectiveness fixes from the verified roadmap: the credential/eval deny no
longer depends on witness-count calibration, and the cross-file tools stopped
mislabeling a damaged Python index as a TypeScript-only feature.
Fixed
- Security deny un-gated from the witness floor.
active_block_rulesnow
seeds the two calibration-exempt security rules (secret-detected-in-content
hard kinds, error-severityeval-call) unconditionally. Calibration never
measures them (the committed-corpus pass runs no content scans), so their
persisted verdict carried only then > 0witness floor — which disarmed the
PreToolUse credential/eval deny on exactly the repos most exposed: fresh,
small, or sparse zero-witness profiles, legacy artifacts, and missing/torn
enforcement.json. A planted zero-witness profile could switch the
credential deny off; it no longer can. Trust,enforcement.mode,
CHAMELEON_ENFORCE=0, and the rule-namedchameleon-ignoreoverride are
unchanged and still gate actual blocking.calibrate_block_ruleswrites the
two entries withexempt_reason: "security-rule"for artifact provenance;
get_statuslists them active on any profiled repo (never on unprofiled
ones) and never as demoted; the torn-artifact banner now says the
credential/eval deny stays armed. Note: repos with committed fixture keys
that previously slipped the zero-witness gate now get the deny — the
rule-named ignore directive is the escape, and comment-less formats (JSON)
need the fixture moved orenforcement.mode: "shadow". - Cross-file damage no longer reads as "typescript-only".
query_symbol_importers/get_crossfile_contextreportedtypescript-only
for every non-TS profile, mislabeling a damaged or missing Python
reverse_index.json(built for Python since the Python program landed) as
by-design absence and suppressing the repair suggestion. New contract:
index-unavailable= the profile's language should have the index, run
/chameleon-refresh;unsupported-language= by-design absence (e.g. a
stray.tsfile in a Ruby profile, a stray.rbin a Python profile — the
latter previously got a dead-end "re-run refresh" loop from the constant-index
path). The build gate, the refresh-repair check, and the read tools now share
symbol_index.REVERSE_INDEXED_LANGUAGESso they cannot drift; Ruby damage in
get_crossfile_context(missing constant index) reads as repairable damage.
Added
- Comprehension routing in
using-chameleon. The skill now tells the main
loop when to reach forsearch_codebase/get_callers/get_blast_radius
/query_symbol_importers/describe_codebase(before renames, signature
changes, side-effect assumptions), with an honesty note keyed to the
index-unavailable/no-calls-index/unsupported-languagereasons. The
MCP-visible docstrings of both crossfile tools drop their stale
"TypeScript-only" headlines.