GitNexus/gitnexus/bench
Gergo Magyar aced4456cc feat(languages): roll the receiver chain out to every emitter
U8. Emission moves into one shared helper and is wired into all 14 language
emitters that build a capture node map.

The helper is language-free (AGENTS.md R6): its call gate reads the
`@reference.call.*` tag prefix — a vocabulary every language's `.scm` query
already shares — rather than a per-language tag list. Only TypeScript and
JavaScript defined a `CALL_TAGS` constant, so a per-language list would have
meant inventing one twelve times. `@reference.callable` is excluded by the
trailing dot: it marks a callable VALUE, not a call site.

It is also self-gating — a non-call match, an absent receiver, or a chain with
no nameable base each leave the match untouched — which is what makes it safe to
call before every `out.push(grouped)` in the emitters that have three or four
such paths.

Measured, not assumed:

    C++   svc->getUser()->save()    INVISIBLE-GAP → RESOLVES
    TS    (three shapes, from U10)                  RESOLVES

The C++ row is the one the plan flagged as having no fixture ANYWHERE:
`cpp-chain-call/` uses the value `.` form, which already worked. It now has one,
alongside a value-dot control proving the defect was the `->` base specifically.

A WRONG-EDGE REGRESSION, caught by the full multi-language suite and fixed.
Ruby `Factory.new.run` resolved correctly to `Factory#run` before this and to
`Product.run` after — a correct edge turned into a wrong one, which is precisely
the failure mode this work exists to avoid. Cause: `Factory.new` denotes an
INSTANCE of Factory, and the cascade encodes that through
`isConstructionSelectorHop` together with the class-constant test separating it
from an instance method genuinely named `new`. A chain step records only a name,
so the fold cannot make that distinction. It now declines any step matching the
language's construction selector and lets the cascade answer. Pinned by a unit
test.

PHP is a recorded residual, and the plan's named trap is NOT the cause. The trap
— a language whose node type is missing from `extractMixedChain`'s tables reads
as "didn't need it" when it cannot be measured — was checked directly against the
emitter, which emits `chain=1|$svc|cgetUser` correctly. The residual is that the
fold's base `$svc` does not bind in the PHP resolver. That is PHP binding-key
work, not a chain-layer defect.

Two incidental corrections to KTD6 fell out of that check. PHP's receiver capture
text is normalized to `$svc.getUser()` — dots, not `->` — so Case 0's "C-family
punctuation" gate does fire for PHP, contrary to the plan. And typing the fixture
parameter moved the PHP row from VISIBLE-GAP to INVISIBLE-GAP, because with a
type binding the cascade types the receiver but finds no member, so no drop is
recorded. An untyped fixture parameter had been reporting a language gap that was
really a fixture defect — the same error class as the untyped `$repo` control
caught earlier in this series.

The wiring inventory is pinned by a test. The helper being self-gating makes the
roster cheap to change silently, which is exactly why: a new entry means someone
wired a language without measuring it, a removed one means a refactor dropped
coverage. `cobol` and `vue` stay unwired — they group no capture node map, so
there is no receiver node to walk.

4367 tests green. The 7 remaining failures are all `*-captures-golden` snapshots,
which U9 regenerates once at the tip.
2026-07-30 18:21:31 +00:00
..
callable-value-flow fix(scope-resolution): parse def coordinates after file paths (#2743) 2026-07-30 07:34:32 +01:00
cfg feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
cross-repo-trace feat(group): resolve cross-file named HTTP handlers (#2275) (#2277) 2026-06-23 12:12:49 +01:00
emit-persistence feat(spring): build bean candidate inventory (#2494) 2026-07-20 09:28:23 +01:00
impact-pdg fix(impact-pdg): make the Impact PDG Mutation Report workflow pass (3 latent oracle bugs) (#2258) 2026-06-20 20:40:28 +01:00
python-scope fix(resolution): type inline constructor receivers in every spelling (#2708) (#2737) 2026-07-29 16:19:53 +01:00
receiver-resolution feat(languages): roll the receiver chain out to every emitter 2026-07-30 18:21:31 +00:00
scope-capture fix(test): give the JS construction fixture a javascript- prefix, and document the hooks (#2708 follow-ups) 2026-07-30 18:18:30 +00:00
scope-emission fix(scope-resolution): resolve calls through a closure-valued binding across languages (#2693) (#2695) 2026-07-27 07:52:18 +01:00
spring-conditionals feat(spring): model profiles, conditions, and auto-configuration (#2678) 2026-07-28 07:05:41 +01:00
parse-throughput.md fix(parse): correct worker-pool docs drift + surface worker-side stack on crash (#2068) (#2070) 2026-06-08 07:20:12 +01:00