This release includes 3 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+12 more
ReleasePort's take
Light signalRelease 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 summaryRemoved legacy VERIFY engine, deleted dead code, wired undocumented features, fixed duplication review budgeting and session document cleanup.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| 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,
soduplication_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.mdimport 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_FILESre-parse (the search space checked AGAINST)
andgather_findings' tighterDUPLICATION_REVIEW_MAX_FILESslice (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 anindex_files_cappedevent when
the index cap trims anything. - Session docs (
.session_doc.*.json) are reaped at SessionStart after 48h
via the lock-awarereap_stale_docs— previously nothing reaped them, so
they accumulated per (session, repo) forever. stop/scheduler.pybuilds a turn's lens list viastop.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.pyin the async-first cutover) is deleted. Its two still-live
helpers moved tosafe_open.pyascontained_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_groupvariant
is the live one),_expand_workspace_globs,body_shape_outliers(+ its
BODY_SHAPE_OUTLIER_MULTthreshold; the body-shape NORM derivation and
SHAPE session block stay),TurnBudget.expired/would_fit/charge_tokens
(packing lives instop/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_foris 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_identifiersis 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_cacheclears both caches),secret_scanner._line_number_at,
the unusedPRIORITY_DELIVERED_VERIFIED/PRIORITY_IDIOMemission rungs
(survivors renumbered contiguously; the packer is rung-agnostic), and the
write-onlyCanonicalSelection.cluster_key_hash/recency_weightfields. - 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/droppabledormant 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
About Chameleon
All releases →Beta — feedback welcome: [email protected]