This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+12 more
Affected surfaces
ReleasePort's take
Light signalTurn‑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 summaryTurn‑end model review now runs asynchronously and fixes a broken resurface check.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| 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=1makes 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_gatesstill
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 ownrecheck_and_resurfacedirectly, 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 arisk_high/intent_forcedroute) 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 newstop/scheduler.py,
stop/job.py,stop/lenses/, andstop/verify.py. - The pre-cutover drift.db-backed finding->fix ledger (
_ledger_persist/
_ledger_recheck_and_resurfaceinstop/gates.py,record_judge_finding
/open_judge_findings/mark_judge_findingindrift/observations.py),
superseded byreview_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>.jsonqueue,
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
About Chameleon
All releases →Beta — feedback welcome: [email protected]