El runtime ya poseía la verdad (registrations + liveReg) pero bindings.parts
solo se llenaba si el provider recordaba cablear `parts: { x: () => id }`;
olvidarlo hacía evaluar part-present a false EN SILENCIO (la enfermedad de
deriva que este eje persigue). Ahora:
- readBindings llena bindings.parts desde el registro para cada parte que
los planes de la parte referencian (deps.parts del compilador), ANTES de
leer sources.parts/reg.parts — el feed explícito sigue ganando por orden
de escritura.
- Regla de ambigüedad: con MÁS de una registración (hermanos repetidos) el
registro CALLA — solo el provider sabe a qué hermano apunta un attr; el
callback explícito sigue siendo la única voz ahí.
- La membresía vive en arrays planos (push/splice del attachment), que
Svelte no observa: `partsRevision` ($state) se bumpea en cada mutación y
el resolutor lo toca, así las bolsas dependientes se re-derivan. Grueso a
propósito: el churn de partes es raro.
- createBindingsScratch crea el bucket también cuando deps.parts existe
(antes quedaba undefined sin feed a mano y el default no tenía dónde).
Tests (4): registro responde sin callback · el explícito gana · hermanos
silencian el registro · membresía reactiva vía protocolo de attachment
(attachRef es un attachment de Svelte — el test ejecuta attach/cleanup a
mano, las mismas llamadas del template). Suite soma 1304/1304.
Barrido de redundancia (callbacks a mano ahora superfluos en partes de
instancia única) = seguimiento, no este commit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>