ID

R402

Status

Backlog

Bucket

structural

Priority

4

Theme

service

Created

2026-06-30

Updated

2026-06-30

Retire the ValueShape to synthetic CallSiteExtraction.InputBean round-trip in the bean-helper queue

Problem

Carved out of R256 (service-walker-substrate-absorption), whose deliverable 4 named two transitional-cruft cleanups. R256 landed the first (widening ConflictSite.site to a sealed MethodRef | ServiceMethodCall and retiring ContextArgumentClassifier.syntheticServiceMethodRef) and explicitly authorised splitting out this second, more opaque one if it grew.

TypeFetcherGenerator’s per-*Fetchers`-class bean-helper queue (the create<Bean> / create<Bean>List instantiation helpers, plus the jOOQ-record and @nodeId-record decode helpers) is fed from two coordinates: the legacy MethodBackedField.method().callParams() walk, which carries CallSiteExtraction.InputBean arms directly, and the R238 ServiceField carrier walk (collectBeanHelpersFromCarrier), which walks the carrier’s ValueShape composites (RecordInput / JavaBeanInput / ListOf / JooqRecordInput) and re-wraps each as a synthetic CallSiteExtraction.InputBean (registerBeanHelper / leafForFieldBinding / convertNestedFieldBindings / innerElementTypeNameOf) so the existing InputBeanInstantiationEmitter ; which only consumes CallSiteExtraction.InputBean ; can drive off the same dedup map.

The synthetic round-trip is the cruft: a ValueShape is the carrier’s own composite model, and re-encoding it back into the upstream classifier’s CallSiteExtraction.InputBean shape just to reach the emitter means two parallel composite encodings are kept structurally in sync by hand (registerBeanHelper’s field-binding reconstruction mirrors what `CallSiteExtraction.InputBean carries). The emitter should consume the ValueShape directly.

Sketch

Rework InputBeanInstantiationEmitter (and the jOOQ-record / record-decode helper emitters) to accept the ValueShape composite as their input shape, then drop collectBeanHelpersFromCarrier’s synthetic `CallSiteExtraction.InputBean construction in favour of feeding ValueShape straight through. The legacy MethodBackedField.callParams() walk either keeps its CallSiteExtraction.InputBean feed (with a thin adapter at the emitter boundary) or is migrated in the same change; confirm during Spec which is cleaner. Dedup stays keyed on the bean ClassName. The compilation tier (graphitron-sakila-example) and the existing @service-bean fixtures are the regression backstop ; the emitted helper bodies must be byte-identical across the cutover.

Out of scope

The R238 MethodRef.ServiceServiceMethodCall double model itself (R256’s out-of-scope note); this item only removes the duplicate composite encoding at the bean-helper queue, not the carrier model.