chameleon 2.31.0
Ruby cross-file blast radius, plus per-language gaps closed by a proactive
cross-matrix verification of every recent fix.
Added
- Ruby constant-reference reverse index (cross-file blast radius). Ruby has
no static named-export surface (requirepulls a whole file by side effect),
so it never got the TS/Python reverse index — the biggest cross-file blind
spot on a Rails monolith. The new index inverts Ruby's class/constant graph:
for each constant, the files that define it and the files that reference it
(via a constant-receiver call site), built from parse data already collected.
query_symbol_importersnow returns the Ruby blast radius (editing the file
that defines a widely-used service class lists its callers), and the autopass
blast-radius gate consumes it. The index is built for Ruby at bootstrap/refresh
and hashed into the trust SHA. Existing Ruby repos pick it up on their next
/chameleon-refresh. - Ruby constant-existence break for PR review.
get_crossfile_contextand
the turn-end advisory now flag a class/module that the index records as defined
in an edited file but the file no longer defines, while other files still
reference it — the Ruby analogue of a removed export still imported.
High-confidence only (one defining file, bare top-level name, a referencer that
still names it). /chameleon-teachaccepts an optional archetype to scope a free-form
idiom (so it surfaces first on that archetype's edits); omitted, the idiom
stays general and applies to every archetype.
Fixed
- Autopass blast-radius now covers Ruby (it keyed on the reverse-index
extensions and read 0 for.rb, inconsistent with the Stop judge-router that
already counted Ruby fan-out). - Paren-less Kernel#eval is now detected (
eval "..."/eval s/
eval %(...)) — the rule only matchedeval(, so the idiomatic Ruby form
slipped enforcement entirely. Fires at error severity, no false positives on
instance_eval/class_eval, member calls, assignments, or comment/string
mentions. - Lint wording is language-correct for Python and Ruby. The node-kind
humanizer had no Python (libcst) labels, soClassDef/FunctionDefleaked
raw; and thelint_filetool never passed the language through, so Ruby and
Python output used the TypeScript "default export" framing. Both fixed. - The inline-override hint offers
# chameleon-ignoreto Python (it only
special-cased Ruby; Python developers got the//token, a syntax error in
their file). - Contract breaks now detect the canonical Ruby service-object. A class with
both a class method and an instance method of the same name (def self.call+
def call) was dropped as ambiguous, missing the very method that has callers;
the singleton (the constant-receiver target) is now kept.