Contexto
src/components/chat-sim/adapters/__tests__/registry.test.ts:20-34 se titula "the two adapters implement all 16 fields with no optionals" y afirma expect(FIELDS).toHaveLength(16).
El contrato tiene 17. capabilities entró como 17º campo en T-029 (517bd2f) y no está en la lista FIELDS:
$ awk '/^export interface ChannelAdapter/,/^}/' src/components/chat-sim/core/types.ts | grep -oE "^ (readonly )?[a-zA-Z]+" | awk '{print $NF}' | sort
album avatarSide bubbleTransport capabilities counter deliveryStates e2eNotice groupKey
keyboard quote reactionConstraint reactions receipt senderKinds tail timestamp wallpaper # 17
El toHaveLength(16) pasa — porque el número coincide con la lista escrita a mano, no con el contrato. La guarda quedó anclada a su propio texto.
Por qué no se notó: exports.test.ts cubre los 17 por separado, así que la suite está verde y el campo sí está probado. Pero esta guarda específica — la que existe para gritar cuando alguien agrega un campo al adapter y se olvida de implementarlo en un canal — no vería el 18º tampoco. Es la misma clase que las "sondas que no medían" que este ciclo ya catalogó: verde que no significa lo que su nombre promete.
Fix propuesto
Derivar FIELDS del tipo, no de una lista a mano — así agregar un campo rompe la guarda por construcción en vez de por memoria. Si eso no es viable, como mínimo agregar 'capabilities' y cambiar el toHaveLength a 17 y el título del describe.
Criterios de aceptación
- La guarda cubre los 17 campos actuales
- Agregar un 18º campo a
ChannelAdapter rompe este test sin que nadie edite el test
Verificación (runnable)
npx vitest run src/components/chat-sim/adapters; echo "exit=$?" # espera 0
Gemelo obligatorio — es el punto entero del issue: agregá un campo foo: string a ChannelAdapter en core/types.ts sin implementarlo en whatsapp.ts, y confirmá que este test se pone rojo. Hoy no lo hace. Revertí.
Guardrails
- No arreglarlo subiendo el número a 17 y nada más: eso repite el bug en el siguiente campo
- No tocar
exports.test.ts, que sí cubre los 17
Scope
src/components/chat-sim/adapters/__tests__/registry.test.ts. Refs: T-029 (517bd2f), .cofoundy/specs/adapter-interface-draft.md.
Contexto
src/components/chat-sim/adapters/__tests__/registry.test.ts:20-34se titula "the two adapters implement all 16 fields with no optionals" y afirmaexpect(FIELDS).toHaveLength(16).El contrato tiene 17.
capabilitiesentró como 17º campo en T-029 (517bd2f) y no está en la listaFIELDS:El
toHaveLength(16)pasa — porque el número coincide con la lista escrita a mano, no con el contrato. La guarda quedó anclada a su propio texto.Por qué no se notó:
exports.test.tscubre los 17 por separado, así que la suite está verde y el campo sí está probado. Pero esta guarda específica — la que existe para gritar cuando alguien agrega un campo al adapter y se olvida de implementarlo en un canal — no vería el 18º tampoco. Es la misma clase que las "sondas que no medían" que este ciclo ya catalogó: verde que no significa lo que su nombre promete.Fix propuesto
Derivar
FIELDSdel tipo, no de una lista a mano — así agregar un campo rompe la guarda por construcción en vez de por memoria. Si eso no es viable, como mínimo agregar'capabilities'y cambiar eltoHaveLengtha 17 y el título deldescribe.Criterios de aceptación
ChannelAdapterrompe este test sin que nadie edite el testVerificación (runnable)
Gemelo obligatorio — es el punto entero del issue: agregá un campo
foo: stringaChannelAdapterencore/types.tssin implementarlo enwhatsapp.ts, y confirmá que este test se pone rojo. Hoy no lo hace. Revertí.Guardrails
exports.test.ts, que sí cubre los 17Scope
src/components/chat-sim/adapters/__tests__/registry.test.ts. Refs: T-029 (517bd2f),.cofoundy/specs/adapter-interface-draft.md.