chameleon 3.0.3
Field feedback: the turn-end Stop idiom self-review read as a recurring "hook
flood" — it re-fired in every new chat, and a docs-only turn (the
/chameleon-init CLAUDE.local.md consent edit itself) dumped EVERY team idiom
at full text because nothing scoped it.
Fixed
- Docs/config-only turns no longer trigger the Stop idiom review. The gate
treated every recorded edited file as idiom-governed, so a turn that touched
onlyCLAUDE.local.md(or any markdown/config file) resolved zero archetypes
and the renderer's cannot-scope fallback dumped the full text of every
not-yet-seen idiom — including aLanguage: rubyservice idiom for a
markdown edit. A file now counts as idiom-governed only when
detect_languagerecognizes it, with a notebook.ipynbcounting as python
source (it keeps its review and now participates in the test-run nudge like
any python file); a turn with no governed file skips the review (check-event
reasonno_governed_files) without burning the once-per-session marker.
_idiom_review_gateinhook_helper.py. - Language-scoped idiom filtering at the Stop review. An idiom whose
Language:tag names a recognized language (typescript/ruby/python)
the turn did not edit is dropped from the review; untagged,Language: any,
and unrecognized tags fail open to shown, and only the metadata region
before the first fence is sniffed (aLanguage:line inside a fenced
example is example code). Composes with the existing archetype filter, so a
mixed-language repo's review no longer dumps other-language idioms when
archetype resolution comes up empty. In a single-profile repo with a
declared secondary language (language_hint.secondary_detected, the
rails-with-frontend shape) the primary-language tag cannot discriminate —
teach stamps every idiom with the profile's primary language — so
primary-tagged idioms are never language-dropped there.
_render_stop_idiomsintools.py,_idiom_review_gatein
hook_helper.py.
Changed
- The durable off-switch is now discoverable where the pain is. The
enforce-mode block message names.chameleon/config.json
"enforcement": {"idiom_review": false}(per-repo, committed → team-wide,
survives new chats) alongside the existing inline-ignore hint; the
/chameleon-disableskill gained a "Silencing ONE surface durably" section
(idiom_review: false,stop_backstop: false,stop_block_cap: 0) and
routes the recurring-Stop-text complaint to the config key instead of a
session-only disable; architecture.md and the env-vars reference document
the same path.