Skip to content

Chameleon

v4.1.0 Breaking

This release includes 3 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

ReleasePort's take

Light signal
editorial:auto 10d

Release v4.1.0 introduces multiple bugfixes across detached review jobs, session handling, duplication indexing, and lens registration while deprecating legacy VERIFY engine code and several dead utility functions.

Why it matters: Bugfixes improve reliability of review workflows; the removal of stop_verify.py (severity 70) and ~25 production‑dead functions (severity 70) requires migration before they are fully excised, impacting any custom integrations.

Summary

AI summary

Removed legacy VERIFY engine, deleted dead code, wired undocumented features, fixed duplication review budgeting and session document cleanup.

Changes in this release

Deprecation High

Removed stop_verify.py (pre‑3.4.0 VERIFY engine) and moved its helpers to safe_open.py; migration required.

Removed stop_verify.py (pre‑3.4.0 VERIFY engine) and moved its helpers to safe_open.py; migration required.

Source: llm_adapter@2026-07-16

Confidence: high

Deprecation High

Deleted ~25 production‑dead functions and fields across the package; migration required for any code referencing them.

Deleted ~25 production‑dead functions and fields across the package; migration required for any code referencing them.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

Detached review job now calls judge.mark_detached_run() to use generous detached budget.

Detached review job now calls judge.mark_detached_run() to use generous detached budget.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

SessionStart folds mirror-delivered idiom slugs into SessionDoc.idioms_shown_slugs, preventing re-review of known idioms.

SessionStart folds mirror-delivered idiom slugs into SessionDoc.idioms_shown_slugs, preventing re-review of known idioms.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

Duplication lens now orders files most‑recently‑modified first for both index caps, honoring the “freshest working set survives” contract.

Duplication lens now orders files most‑recently‑modified first for both index caps, honoring the “freshest working set survives” contract.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

Session docs are reaped at SessionStart after 48 hours via lock‑aware reap_stale_docs, preventing indefinite accumulation.

Session docs are reaped at SessionStart after 48 hours via lock‑aware reap_stale_docs, preventing indefinite accumulation.

Source: llm_adapter@2026-07-16

Confidence: high

Bugfix Medium

stop/scheduler.py builds lens list from stop.lenses.active_lenses, making the registry the single source of truth for lens gating.

stop/scheduler.py builds lens list from stop.lenses.active_lenses, making the registry the single source of truth for lens gating.

Source: llm_adapter@2026-07-16

Confidence: high

Refactor Low

Removed five orphaned files with no production usage.

Removed five orphaned files with no production usage.

Source: llm_adapter@2026-07-16

Confidence: high

Full changelog

A dead-code and unfinished-wiring campaign: a vulture sweep plus a repo-wide
import-graph audit adjudicated ~70 candidates. Five turned out to be
documented-but-unwired features (now wired), ~30 were genuinely dead
(deleted, with their tests ported to the live surfaces), and the rest were
false positives or deliberate API surface (kept).

Fixed

  • The detached review job now calls judge.mark_detached_run() at its entry,
    so duplication_review.judge_body_matches (the one reviewer spawn that
    resolves its timeout internally) takes the generous detached budget inside
    the job instead of the short synchronous one — closing the follow-up the
    async-first cutover left open.
  • The memory-channel half of the idiom lens's already-shown dedup is live:
    SessionStart now folds the mirror-delivered idiom slugs into
    SessionDoc.idioms_shown_slugs (spec 10.1), so an idiom the model already
    holds via the @.chameleon/conventions.md import is no longer re-reviewed
    and re-surfaced. Replaces the write-only .mirror_idioms.<session> snapshot
    file (the reaper still ages out files older installs left behind).
  • The duplication lens now feeds both order-dependent caps a most-recently-
    modified-first view of the turn's files: build_candidate_index's
    DUPLICATION_INDEX_MAX_FILES re-parse (the search space checked AGAINST)
    and gather_findings' tighter DUPLICATION_REVIEW_MAX_FILES slice (the
    files the gate CHECKS) — honoring the documented "freshest working set
    survives" contract that insertion order silently violated on turns editing
    more files than the caps, and emitting an index_files_capped event when
    the index cap trims anything.
  • Session docs (.session_doc.*.json) are reaped at SessionStart after 48h
    via the lock-aware reap_stale_docs — previously nothing reaped them, so
    they accumulated per (session, repo) forever.
  • stop/scheduler.py builds a turn's lens list via stop.lenses.active_lenses
    instead of a duplicate inline tuple, so the lens registry is the single
    source of truth for lens gating.

Removed

  • stop_verify.py (the pre-3.4.0 VERIFY engine, superseded by
    stop/verify.py in the async-first cutover) is deleted. Its two still-live
    helpers moved to safe_open.py as contained_rel / excerpt_window — one
    canonical implementation now serves the VERIFY stage (which carried its own
    duplicate copies), the pending-findings delivery block, and the co-change
    advisory.
  • ~25 production-dead functions and fields across the package, each verified
    repo-wide (including dynamic dispatch, hook scripts, and skill markdown)
    before deletion: detect_commented_out_code (the batch _by_group variant
    is the live one), _expand_workspace_globs, body_shape_outliers (+ its
    BODY_SHAPE_OUTLIER_MULT threshold; the body-shape NORM derivation and
    SHAPE session block stay), TurnBudget.expired/would_fit/charge_tokens
    (packing lives in stop/assemble.py; the token side is a carried ceiling),
    daemon._socket_tmp_base, finding_already_surfaced/mark_finding_surfaced
    (the .dup_surfaced. marker scheme the ledger replaced),
    format_duplication_advisory (the lens's _claim_for is the canonical
    template now), format_contract_advisory, callables_at_ref,
    hash_import_set (vestigial since the import-set hash was pinned to ""),
    hook_helper._duplication_index_files/_extract_defined_names/
    _scheduler_clear_job_slot, intent_capture.identifier_tokens
    (latest_request_identifiers is the live scope-drift source),
    judge.stale_suffix/_parse_findings/grounding_family (dead duplicates
    of the live render/parse/family paths), profile.loader.clear_repo_root_cache
    (clear_profile_cache clears both caches), secret_scanner._line_number_at,
    the unused PRIORITY_DELIVERED_VERIFIED/PRIORITY_IDIOM emission rungs
    (survivors renumbered contiguously; the packer is rung-agnostic), and the
    write-only CanonicalSelection.cluster_key_hash/recency_weight fields.
  • Five orphaned files: chameleon_mcp/general_idioms.md (nothing loaded it),
    scripts/make-readme-screenshot.py, scripts/refresh_eval_fixtures.sh
    (its fixtures and eval suite are long gone), tests/pool_dup_runs.py, and
    tests/run_posthoc_panel.py.
  • Deliberately KEPT despite zero production callers, as designed API surface:
    extractors.registry.register (documented extension seam),
    review_ledger.mark_addressed (lifecycle API), the delivery-cursor pair
    (spec 3.5 record + accessor), judge.attach_evidence_cmd (write API of the
    pinned-evidence layer whose read side is live), LensResult.check_events
    (the documented lens contract and test observation surface), and the
    PRIORITY_BLOCK/droppable dormant block-emission contract.

Breaking Changes

  • Deleted `stop_verify.py`; its helpers moved to `safe_open.py` as `contained_rel` and `excerpt_window`.
  • Removed ~25 production‑dead functions and fields including `detect_commented_out_code`, `_expand_workspace_globs`, `body_shape_outliers` and its threshold, `TurnBudget.expired/would_fit/charge_tokens`, `daemon._socket_tmp_base`, `finding_already_surfaced`/`mark_finding_surfaced`, `format_duplication_advisory`, `format_contract_advisory`, `callables_at_ref`, `hash_import_set`, various `_scheduler*` utilities, judge stale methods, profile cache clear method, secret scanner line number utility, and unused priority emission rungs.
  • Deleted five orphaned files: `chameleon_mcp/general_idioms.md`, `scripts/make-readme-screenshot.py`, `scripts/refresh_eval_fixtures.sh`, `tests/pool_dup_runs.py`, and `tests/run_posthoc_panel.py.

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]