GitNexus/gitnexus/test
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
..
fixtures 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
helpers fix(test): harden findInstalledFtsExtension for cross-OS filesystem quirks 2026-07-21 06:14:58 +00:00
integration feat(resolution): type receivers from structure, and bump INCREMENTAL_SCHEMA_VERSION to 26 2026-07-30 18:21:28 +00:00
unit feat(languages): roll the receiver chain out to every emitter 2026-07-30 18:21:31 +00:00
utils fix(hook): emit MCP query hint when server owns DB lock (#2396) (#2397) 2026-07-08 18:34:05 +01:00