chameleon 2.38.18
Deep QA of the chameleon-pr-review and chameleon-receiving-code-review skills
across every supported language and framework, driving each engine surface the
skills call with real tools against real repos. The headline is the round-3
refuter, which was silently inert; several coverage gaps and skill-prose
ambiguities were fixed alongside.
Fixed
- The round-3 refuter never produced a verdict — round 3 was dead on both review
skills. Three independent defects stacked: (1)run_onescanned the raw
claude -p --output-format stream-jsonstdout with_extract_json_array, which
locked onto the system-inittoolsarray instead of the model's answer (which
lives inside an assistantresult/textblock), so every finding came back
unverified: "unparseable refuter output". It now harvests the assistant text
blocks first (the same two-step the turn-end judge uses, factored into
_stream_json_texts) and accepts either the prompted array or a bare object.
(2)refute_findingpre-gated tounavailableon any--bareauth failure —
true on every current CLI — even though the spawn falls back to a plain
claude -p(the exact fallback the judge takes every turn); it now bails only
when the CLI is genuinely absent (refuter_cli_absent). (3) The plain-fallback
spawn starts a fresh full session and can transiently return nothing, so
run_onenow retries once on a non-timeout failure. Together these make round 3
produce realconfirmed/refutedverdicts for the first time. - A deleted file's broken importers were invisible to the cross-file pass.
get_crossfile_contextskipped a module it could not read, conflating a DELETED
module (which exports nothing, so every importer still referencing it is a
genuine break — the strongest existence break there is) with a merely-unreadable
one. A deleted module is now read as a closed empty export set; the per-site
_live_importer_breakre-check keeps only importers that still reference it and
still resolve there, so a stale index never fabricates a break. The pr-review
skill (Step 1/1a) now captures file status with--name-status -Mso a deletion
is handled as a sanctioned skip (not a normal source review) and a rename's old
path enters the Step 2.9c diff-scope set. - A Python (or Go/Rust/PHP) dependency-manifest change read as reviewed-clean.
scan_dependency_changesparses only npm and Bundler, and a change to
requirements*.txt/pyproject.toml/Pipfile/setup.py(Python is a
first-class language) produced an empty result indistinguishable from a no-op
diff. It now returns those in a newuncovered_manifestsfield, and the
pr-review skill (Step 2.5) hand-reviews the added lines with the same
severity split the npm path uses: an ACK for the coverage-gap disclosure and a
routine name-only dependency add, a FIX for a visible red flag the reviewer can
read directly (a non-registry/git source, an--index-urlredirection, an
install hook). A clean Python dependency add stays APPROVE, a Python manifest
carrying an off-PyPI source is NEEDS CHANGES — symmetric with the identical
npm content, instead of a silent clean. load_calls_indexdid not follow a linked worktree to the main profile.
Whileget_pattern_context/lint_fileresolve a worktree's profile via
resolve_profile_root, the calls index read the raw worktree root, so a review
run from a worktree (the pr-review skill's own recommended way to inspect another
revision) silently degraded every blast-radius / contract-break / caller fact to
unknown. It now applies the same resolution (identity off a worktree).- Migration-safety parse ambiguities (pr-review Step 2.7a) could flip a verdict
tier between two faithful reviewers.change_column_nullwas wrongly listed as
irreversible (Rails inverts it) and double-routed to both the 2.7a BLOCK and the
2.7b table-size FIX; it now lives only in 2.7b. Thereversible do |dir|carve-out
no longer clears the BLOCK for a one-directional block (dir.upwith no
dir.down).
Changed
- receiving-code-review gained handling the skill was silent on: GitHub/Bitbucket
suggestion blocks (verify and adjudicate, never paste verbatim), same-anchor
contradictory comments (surface the conflict, route to NEEDS CLARIFICATION), a
distinct "this file isn't in your PR" outcome, an explicit inline-outdated
re-resolution mechanism, per-file archetype/canonical resolution on multi-file
reviews, a wider round-3 refuter-exemption set (canonical-grounded and
deterministic file-witnessed verdicts verify inline), and an explicit post-apply
re-lint in Step 8 so a fix that introduces a convention violation is caught
rather than trusted to a non-blocking hook.