Skip to content

Chameleon

v4.0.1 Security

This release includes 3 security fixes for security teams reviewing exposed deployments.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 3 known CVEs

Topics

ai-coding-assistant archetype ast-analysis claude-code claude-plugin code-conventions
+12 more
code-review code-style developer-tools javascript linter mcp mcp-server prompt-engineering python ruby rails typescript

Affected surfaces

auth

ReleasePort's take

Moderate signal
editorial:auto 10d

ReleasePort v4.0.1 patches critical security flaws in pause marker handling and fixes connection‑management bugs that could cause cross‑process data pollution.

Why it matters: A severity‑95 security fix ensures unsigned `.pause_until` markers no longer suppress advisories; also resolves a severity‑40 bug preventing `index.db` connection data leakage across processes.

Summary

AI summary

Fixed critical security vulnerabilities in pause marker handling and data‑dir connection management.

Changes in this release

Security Critical

`.pause_until` marker is HMAC‑signed; unsigned markers no longer suppress advisories.

`.pause_until` marker is HMAC‑signed; unsigned markers no longer suppress advisories.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

`index.db` connection now keyed by resolved path, preventing cross‑process data pollution.

`index.db` connection now keyed by resolved path, preventing cross‑process data pollution.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

`refresh_repo` no longer crashes on binary‑corrupted markdown files; performs graceful fallback and warning instead.

`refresh_repo` no longer crashes on binary‑corrupted markdown files; performs graceful fallback and warning instead.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

Marker signature checks now tolerate non‑ASCII bytes, preventing `TypeError` from invalid signatures.

Marker signature checks now tolerate non‑ASCII bytes, preventing `TypeError` from invalid signatures.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

Status line verifies pause marker HMAC before showing "paused", blocking forged markers from appearing paused.

Status line verifies pause marker HMAC before showing "paused", blocking forged markers from appearing paused.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Low

Removes false warning about `idioms.md` when a fresh trusted profile first refreshes.

Removes false warning about `idioms.md` when a fresh trusted profile first refreshes.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Low

Duplication candidates now exclude test‑file functions from production reuse targets.

Duplication candidates now exclude test‑file functions from production reuse targets.

Source: llm_adapter@2026-07-16

Confidence: high

Refactor Low

`get_contract_breaks` documents new finding shape and dedupes cross‑file import reports.

`get_contract_breaks` documents new finding shape and dedupes cross‑file import reports.

Source: llm_adapter@2026-07-16

Confidence: high

Refactor Low

`merge_profiles` documents that its `repo` argument is accepted for schema uniformity but unused.

`merge_profiles` documents that its `repo` argument is accepted for schema uniformity but unused.

Source: llm_adapter@2026-07-16

Confidence: high

Full changelog

Fixes from a full-plugin, real-invocation QA campaign (every hook, MCP tool,
skill flow, and support surface driven from scratch across TypeScript, Ruby,
and Python repos; ~350 test cells).

Fixed

  • The cached index.db connection is now keyed by its resolved path, so a
    CHAMELEON_PLUGIN_DATA change mid-process (test isolation, A/B harnesses)
    can no longer write rows into — or read rows from — a data dir the handle
    was bound to earlier. The read-only path also closes the stale handle on a
    path switch instead of leaking one connection per switch. Historical
    pollution this caused (262 pytest tmp-repo rows in the real registry) has a
    suite-level guard now: unit tests default to an isolated data dir.
  • .pause_until is HMAC-signed like the session-disable marker: line 1 stays
    the bare ISO expiry for display readers, a sig= line follows, and the
    suppression gate rejects a marker planted directly on disk (bare timestamp
    or wrong signature). Previously any process that could write to the data dir
    could silently suppress every advisory with one plaintext file. A pause
    started under a pre-4.0.1 version stops suppressing after upgrade (its
    marker is unsigned); re-run /chameleon-pause-15m if needed.
  • refresh_repo no longer crashes on a binary-corrupted principles.md or
    profile.summary.md (undecodable bytes now count as "incomplete, re-derive"
    instead of escaping as a UnicodeDecodeError), and a noop refresh now
    self-heals a binary-corrupted conventions.md mirror instead of silently
    skipping the rewrite forever — the exact repair paths a corrupted-profile
    user is told to run. The partial-refresh path gets the same treatment: a
    binary-corrupted idioms.md now falls back to the full bootstrap (which
    carries the damaged file forward byte-identical, with a warning) instead of
    crashing — and never substitutes an empty string that the transaction would
    write back over the user-authored file.
  • Both marker signature checks compare digests as bytes: a planted marker
    whose sig= line contains a non-ASCII character used to make
    hmac.compare_digest raise TypeError out of the reject path instead of
    rejecting. The session-disable marker's file read now also tolerates raw
    invalid-UTF-8 bytes (rejecting the marker rather than letting a
    UnicodeDecodeError escape is_chameleon_suppressed and skip a root's
    turn-end gates via the hook's fail-open).
  • The statusline verifies the pause marker's HMAC signature before rendering
    "paused", so a planted or forged .pause_until the enforcement gate rejects
    no longer shows as paused in the status line.
  • A fresh trusted profile's first refresh no longer emits the false
    "idioms.md exists but contains no parseable idiom blocks... may be damaged"
    warning: the idiom store's bare empty view (written by trust/teach
    migration) is now recognized as a known-empty form alongside the legacy
    placeholder template.
  • Duplication candidates no longer offer test-file functions as reuse targets
    for production code (they crowded real leads out of the per-function
    candidate cap); a byte/param-identical clone still surfaces, and a test
    file under review keeps its test-helper candidates.

Changed

  • get_contract_breaks documents its second finding shape
    (kind: "removed_export_still_imported", both positional fields null) in
    the tool docstring and MCP schema, and the pr-review skill routes it — and
    lint_file's cross-file-importers / removed-export-breaks-importers
    rules — with explicit one-citation dedupe against the cross-file existence
    pass, so the same removed-export break is never reported three times.
  • merge_profiles documents that its repo argument is accepted for MCP
    schema uniformity but unused (the merge driver invokes it per-file with no
    repo context, no trust gate; the write is Write-equivalent on
    caller-controlled paths).

Security Fixes

  • .pause_until marker is now HMAC‑signed; unsigned markers are rejected, preventing arbitrary suppression of advisories (CVE not listed)
  • Marker signature checks compare digests as bytes, fixing a TypeError that could bypass validation
  • Status line verifies pause marker HMAC before showing "paused"

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Chameleon

Get notified when new releases ship.

Sign up free

About Chameleon

All releases →

Related context

Earlier breaking changes

  • v3.0.0 MCP surface folded from 48 tools to 19; remaining 32 operator tools become actions on three dispatchers.

Beta — feedback welcome: [email protected]