ID

R297

Status

Backlog

Bucket

tech-debt

Priority

6

Theme

pagination

Created

2026-06-10

Updated

2026-06-10

Collapse the shareable boolean on ConnectionType/EdgeType/PageInfoType; read federation flags off schemaType()

ConnectionType / EdgeType / PageInfoType each carry a shareable boolean component alongside their schemaType() GraphQLObjectType. After R295, federation @tag propagation onto these synthesised types is driven entirely off schemaType() (the applied directives ride on the schema form; no tags record component, per "Model metadata over parallel type systems"). The shareable boolean is now the asymmetric survivor: it is a second representation of @shareable, redundant with the schema form for emission (the synthesised schemaType() already carries the directive, and no emitter reads shareable()), and its only consumer is the pageInfoShareable |= fold inside ConnectionPromoter.promote. That fold also reads tags off the schema forms, so it mixes two representations of the same class of information in one place.

The cleanup: remove the shareable boolean from all three records and have the PageInfo fold read both @shareable and @tag uniformly off schemaType() (e.g. hasAppliedDirective("shareable") and getAppliedDirectives("tag")), making the dedupe-arm union and the fold symmetric. Blast radius: the three record signatures in GraphitronType, their construction sites in ConnectionPromoter, the structural-arm pageInfoObj.hasAppliedDirective("shareable") read, and the GraphitronSchemaBuilderTest rows that assert the boolean. R295 deferred this as an optional cleanup ("in scope if it falls out naturally, otherwise note it for a cleanup item"); it did not fall out naturally, so it is filed here.