Skip to content

Chameleon

v3.4.0 Breaking

This release includes 2 breaking changes for platform teams planning a safe upgrade.

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

✓ No known CVEs patched in this version

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 rbac

ReleasePort's take

Light signal
editorial:auto 11d

Turn‑end model review now runs asynchronously and the resurface check correctly reads from the canonical ledger.

Why it matters: Severity 70 bugfix ensures accurate finding termination; severity 80 deprecations remove outdated synchronous judge components, requiring migration of existing HIGH findings.

Summary

AI summary

Turn‑end model review now runs asynchronously and fixes a broken resurface check.

Changes in this release

Deprecation High

Removed synchronous correctness‑judge spawn and related choreography modules (`_correctness_judge_route`, `_gate`, `_multi_lens_review_lines`, `_duplication_advisory_lines`, `lens_runner.py`, `lens_synthesis.py`, `judge_async.py`).

Removed synchronous correctness‑judge spawn and related choreography modules (`_correctness_judge_route`, `_gate`, `_multi_lens_review_lines`, `_duplication_advisory_lines`, `lens_runner.py`, `lens_synthesis.py`, `judge_async.py`).

Source: llm_adapter@2026-07-15

Confidence: high

Deprecation High

Removed pre‑cutover drift.db‑backed finding ledger (`_ledger_persist`, `_ledger_recheck_and_resurface`) in favor of `review_ledger.py` canonical ledger; existing HIGH findings not migrated.

Removed pre‑cutover drift.db‑backed finding ledger (`_ledger_persist`, `_ledger_recheck_and_resurface`) in favor of `review_ledger.py` canonical ledger; existing HIGH findings not migrated.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix High

Turn-end resurface re-check now correctly reads from canonical ledger and marks resurfaced findings as TERMINAL.

Turn-end resurface re-check now correctly reads from canonical ledger and marks resurfaced findings as TERMINAL.

Source: llm_adapter@2026-07-15

Confidence: high

Bugfix Medium

Reviewer model ladder now unconditionally escalates to stronger models when `risk_high` or `intent_forced` routes are triggered.

Reviewer model ladder now unconditionally escalates to stronger models when `risk_high` or `intent_forced` routes are triggered.

Source: llm_adapter@2026-07-15

Confidence: high

Refactor Low

Turn‑end model review is now async‑first, launching a detached background job that runs correctness, duplication, and idiom lenses without delaying turn end.

Turn‑end model review is now async‑first, launching a detached background job that runs correctness, duplication, and idiom lenses without delaying turn end.

Source: llm_adapter@2026-07-15

Confidence: high

Refactor Low

Finding delivery now occurs at next UserPromptSubmit, Stop (unaddressed HIGH), or SessionStart, never in the same turn unless `CHAMELEON_JUDGE_WAIT=1` forces synchronous rendering.

Finding delivery now occurs at next UserPromptSubmit, Stop (unaddressed HIGH), or SessionStart, never in the same turn unless `CHAMELEON_JUDGE_WAIT=1` forces synchronous rendering.

Source: llm_adapter@2026-07-15

Confidence: high

Refactor Low

Stale findings now render `[stale]` instead of being silently dropped when their cited file changes since review.

Stale findings now render `[stale]` instead of being silently dropped when their cited file changes since review.

Source: llm_adapter@2026-07-15

Confidence: high

Refactor Low

Idiom review is now a single lens within the turn‑end async job, scoped by diff hunks and citing violated idiom slugs and lines.

Idiom review is now a single lens within the turn‑end async job, scoped by diff hunks and citing violated idiom slugs and lines.

Source: llm_adapter@2026-07-15

Confidence: high

Full changelog

Changed

  • Turn-end model review is now async-first: the Stop hook's deterministic
    gates decide whether a turn warrants review and, if so, launch exactly ONE
    detached background job (POSIX and Windows) that runs the correctness,
    duplication, and idiom lenses, verifies every finding with an independent
    refuter, persists survivors to a canonical Finding-lifecycle ledger with a
    severity surface bar, and pre-renders a delivery payload — Stop itself
    never waits on it, so a model review never delays turn end.
  • Findings deliver at the next UserPromptSubmit (multi-root aware), the next
    Stop (an unaddressed HIGH resurfaces once), or SessionStart (dead
    sessions) — never in the same turn that triggered the review, unless
    CHAMELEON_JUDGE_WAIT=1 makes Stop poll the job and render in-turn (for
    harnesses/CI, which have no next turn to deliver into).
  • A finding whose cited file changed since review now renders [stale]
    instead of being silently dropped.
  • Idiom review is now one lens of the turn-end review job, scoped by diff
    hunks and citing the violated idiom's slug and lines, instead of a
    once-per-session Stop-hook self-review interrupt; enforcement.idiom_review
    still gates it, and a compliant turn shows nothing at all.

Fixed

  • The turn-end resurface re-check (an unaddressed HIGH finding "resurfaces
    once") was never wired into the live Stop pipeline: stop_gates still
    called the pre-cutover drift.db-backed helper, which had no findings to
    read since the review job persists to the new canonical ledger instead. It
    now calls that ledger's own recheck_and_resurface directly, and a
    resurfaced finding is a TERMINAL delivery status, so the one-shot re-nag
    can no longer loop back through ordinary delivery and re-arm itself.
  • The reviewer model ladder (CHAMELEON_JUDGE_MODEL_HIGH, escalating to a
    stronger model on a risk_high/intent_forced route) never actually
    escalated: it short-circuited to the base model unless a flag only the
    now-deleted detached async-judge child ever set. Since every review now
    runs detached by construction, the ladder escalates unconditionally.

Removed

  • The synchronous correctness-judge spawn, the route/gate choreography
    (_correctness_judge_route/_gate, _multi_lens_review_lines,
    _duplication_advisory_lines), lens_runner.py, lens_synthesis.py,
    judge_async.py, and the once-per-session idiom-review interrupt
    (_idiom_review_gate) — all absorbed by the new stop/scheduler.py,
    stop/job.py, stop/lenses/, and stop/verify.py.
  • The pre-cutover drift.db-backed finding->fix ledger (_ledger_persist /
    _ledger_recheck_and_resurface in stop/gates.py, record_judge_finding
    / open_judge_findings / mark_judge_finding in drift/observations.py),
    superseded by review_ledger.py's canonical finding-lifecycle ledger. Any
    HIGH finding it was still holding open from before the cutover is not
    migrated (low impact, unlike the .judge_pending.<session>.json queue,
    which is migrated).

Breaking Changes

  • Removed synchronous correctness-judge spawn, route/gate choreography (_correctness_judge_route/_gate, _multi_lens_review_lines, _duplication_advisory_lines), lens_runner.py, lens_synthesis.py, judge_async.py, and the once‑per‑session idiom-review interrupt (_idiom_review_gate).
  • Removed pre‑cutover drift.db-backed finding ledger functions (_ledger_persist / _ledger_recheck_and_resurface in stop/gates.py, record_judge_finding/open_judge_findings/mark_judge_finding in drift/observations.py); they are superseded by review_ledger.py's canonical ledger.

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]