Skip to content

Chameleon

v2.38.6 Feature

This release adds 2 notable features for engineering teams evaluating rollout.

✓ 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

Summary

AI summary

Next.js app‑router page/layout files now receive per‑edit guidance after clustering fixes.

Full changelog

Fixed

  • Next.js app-router page/layout files got no per-edit guidance in small and
    medium repos.
    Clustering bucketed TypeScript files by directory, so the
    app-router role files that scatter one-per-route-dir (app/page.tsx,
    app/dashboard/page.tsx, ...) each fell into their own below-threshold bucket
    and the page archetype never formed; editing a page injected nothing. A new
    nextjs_role_for_path buckets page/layout/loading/error/not-found/
    template/default under an app/ segment by their filename role — the same
    way python_role_for_path groups Django models.py across apps — so they
    cluster into app-page/app-layout/app-special archetypes. The monorepo
    workspace prefix is preserved (apps/web pages do not merge with apps/admin
    pages), and route.ts is left to directory bucketing (it already co-locates
    under app/api). Non-app-router files are bucketed unchanged.
  • /chameleon-refresh left a load-rejected profile damaged instead of
    repairing it.
    A profile with a cross-artifact generation skew or an
    artifact reset to {} (the shape a crashed write or a bad 3-way .chameleon
    merge leaves) is rejected by the loader as profile_corrupted with the message
    "/chameleon-refresh recommended" — but the noop refresh preserved it verbatim,
    making that advice a dead end. The refresh re-derive gate now mirrors the
    loader's exact cross-artifact generation check, so a plain refresh repairs
    precisely what the loader rejects. Healthy profiles still noop.
  • Python profiles never repaired a missing exports_index.json /
    reverse_index.json.
    The Python pipeline always writes both, so a missing
    one is unambiguous damage, but the refresh gate only forced a rebuild for
    TypeScript or a corrupt-present file — a deleted index on a Python repo stayed
    missing, silently voiding cross-file existence-break, phantom-import, and
    query_symbol_importers advisories until a forced re-derive. The gate now
    treats Python like TypeScript for index presence.
  • A trust read could raise instead of failing open. trust_state_for
    checked is_file() then read_text() but caught only JSON errors, so a
    concurrent rotation of the .trust file between the two calls raised an
    uncaught OSError out of the gate. It now fails open to "untrusted" on any
    read error.
  • Status line rendered a literal None for a JSON-null project_dir. The
    payload-parse fallback used .get(..., ''), which returns None when the key
    is present with a null value. Now coalesces to an empty string.

Changed

  • enforcement.multi_lens_review and enforcement.idiom_judge now default
    on.
    At turn end (shadow/enforce mode), the coordinated multi-lens pass
    (correctness + duplication, merged) now runs by default in place of the
    separate single-spawn correctness-judge and duplication gates, so duplication
    is no longer starved by the one-spawn-per-turn defer; it is advisory only and
    never blocks. idiom_judge default-on strengthens the once-per-session
    idiom-review directive (no extra model spawn — the flag only hardens the
    prompt). Because the defaults live in code, already-trusted repos pick up the
    new behavior with no re-trust prompt (same as correctness_judge shipped).
    Opt out per repo with enforcement.multi_lens_review: false /
    enforcement.idiom_judge: false, or globally with enforcement.mode: off or
    CHAMELEON_DISABLE=1.
  • /chameleon-journey documented a stale act count and budget (19 acts / $33,
    default cap $35) while the suite had grown to 21 acts / $38, so the documented
    bare run command aborted on the budget pre-flight. Default cap raised to $40
    and the figures synced.
  • bump-version.sh --audit no longer flags the regenerated package-lock.json
    or the historical version references in docs/gap-log.md /
    docs/verification-runbook.md; the lockfile is now excluded symmetrically with
    uv.lock.
  • /chameleon-status, /chameleon-explain, and using-chameleon skill docs:
    render a null drift score as "no edits observed yet", a null match_quality
    as "n/a", and drop the unimplemented "value attribution" capability line.

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]