Consent protocol: Internet-Draft -03

XCIM records explicit consent from the person controlling a recipient email address to an identified sender for specified types of communication. An independent third party attests the consent, with immutable evidence anchored in a blockchain.

Revision -03 specifies EVP, OAuth with authenticated provider API verification, and OpenID Connect (OIDC) as alternative methods to establish control of the email address giving consent. An issuer may use any one admitted method after its required checks. Address verification alone does not grant permission: the same recipient must separately and explicitly accept the identified sender and communication types.

Corrected scope and revision status · eXplicit Consent-Identified Mail (XCIM): draft-saez-xcim-03 · Published text.

This is an individual Internet-Draft with intended status Experimental. Publication does not imply IETF endorsement, working-group adoption or an approved RFC. Amoy provisioning and live-node trials remain paused.

AS-01 anchor adapter: AN01-P01

Concrete ABI, acyclic genesis, network alternatives and finality policy for review.

Historical AN01-P01 proposal; N1–N6 are now adopted. Adoption record · Current AN01-F01 contract, schemas and local EVM tests. The full proposal below preserves its original wording. No public contract deployment or live finality verification is claimed.

Recommendation: a new immutable contract per issuer/log anchoring the exact AS C4 commitment; pre-deployment intent plus signed post-deployment binding; an opt-in Amoy trial with a receiver-operated consensus-validating node. Two remote RPCs are observation only, never a consensus fallback. No production network is selected.

Candidate limits (unmeasured): preserve 300-second AS state validity; 120-second finalized-header age, 30-second local-view cache and 10-second RPC attempt deadline. Historical AS01-F01 keeps anchor_evidence=null; enabling anchor evidence requires a new schema revision and complete verifier.

Current review ZIP · Historical AN01-P01 ZIP (preserved) · ABI JSON · Unconfigured genesis checklist · Unconfigured finality policy · Synthetic ABI fixture · Publication hashes

The local layout checker covers 19 ABI entries, 16 selectors, two event topics and eight negative layout cases. It does not execute the 20 planned EVM/network scenarios. All fixture keys/addresses are synthetic TEST ONLY.

python -m pip install -r anchor-adapter/requirements.txt
python anchor-adapter/tools/check_proposal.py

Full source · Preserved AS01-F01 · Implementation evidence and open gates

AN01-P01 — propuesta de adaptador de anclaje AS-01

Fecha: 2026-10-19. Estado: detalles N1–N6 propuestos, sin adoptar. La dirección A4/D06 de un perfil AS anclado ya está adoptada; esta propuesta concreta su adaptador. No hay contrato Solidity implementado/compilado, despliegue, transacción, pins de red instalados ni verificación viva de finalidad. AS01-F01 conserva sus bytes y anchor_evidence: null.

1. Recomendación y alternativas

Recomiendo un contrato nuevo, no actualizable, para un issuer/log, un ABI específico que ancle el compromiso C4 y su predecesor, genesis aceptado por política local y un ensayo Amoy eip155:80002. Para la ruta que pretende verificación independiente, exigir un nodo receptor que valide ejecución y consenso Bor/Heimdall, con bootstrap de red aceptado. Dos RPC remotos sólo permiten observación corroborada de ensayo, bajo otra política explícita.

Eje Alternativas Recomendación / coste
Qué anclar Reutilizar el evento Amoy 0.1; publicar todas las raíces; comprometer el C4 completo. Evento AS nuevo que compromete C4 exacto. C4 ya contiene ambas proyecciones; duplicar raíces añade campos que podrían discrepar. El evento viejo no adquiere semántica nueva.
Contrato Servicio multi-issuer con registry/admin; proxy actualizable; contrato inmutable por issuer/log. Una instancia inmutable por issuer/log. Reduce privilegios/cambios ocultos; cuesta despliegue y bootstrap por log.
Historial on-chain Sólo calldata; evento sin estado; head y mapping por secuencia. Evento + head monotónico + mapping de cada secuencia, con idempotencia. Mayor almacenamiento/gas; permite confrontar historial/eventos con estado del mismo bloque.
Control de publicación Abierto a cualquiera; EOA fija; multisig/contrato con lifecycle. EOA de publicación fija y guardian distinto para el primer ensayo. No son las claves Ed25519 de AS. Rotación exige detener/migrar y nuevo bootstrap; multisig queda como alternativa con su propia provenance/lifecycle.
Genesis Un objeto que se compromete a sí mismo; dirección/código inferidos de discovery; intent previo + binding posterior. Dos objetos acíclicos ligados al genesis AS existente y aprobados por raíz/política local. Más artefactos, sin TOFU desde email.
Red Amoy; Ethereum/Sepolia; Polygon mainnet u otra EVM; log/testigos sin cadena. Amoy para ensayo opt-in; ninguna red productiva seleccionada. Otra red/finality requiere perfil y bootstrap distintos, no cambiar sólo chain ID.
Finalidad N confirmaciones; dos RPC coincidentes; nodo que valida consenso; prueba portable de consenso/receipts. Nodo verificador del receiver primero. No asumir que confirmaciones o dos JSON equivalen a consenso. Pruebas portables/light client requieren diseño y revisión adicionales.

Amoy figura como testnet con chain ID 80002 y parent Sepolia en la referencia oficial de red. La documentación distingue milestones de Polygon de checkpoints enviados al parent y documenta el tag RPC finalized en Finality. Esto fundamenta la hipótesis técnica, no prueba que nuestros nodos, proveedores o el futuro contrato la soporten correctamente en Amoy.

2. Selección, scope y compatibilidad

Nombre candidato del adaptador: xcim-as01-evm-amoy-milestone-01. Perfil AS envolvente: as-01-anchored; versión del artefacto de diseño AN01-P01. No son registros IANA ni activan un perfil por discovery.

El receiver debe aceptar exactamente issuer URN, log ID, URI de Consent Issuer, genesis AS, intent, deployment binding, red y política de finalidad. Cada adaptador liga explícitamente esos valores. Se conserva la selección del receipt/batch WD y firmas RBA/MSA/MP de P1; no se sustituyen sus algoritmos, preimágenes o roles por ECDSA/EVM. El firmante on-chain sólo publica un hash.

No agregar un objeto anchor a C7 F01: su schema cerrado exige null. Tras aceptar N1–N6 habrá que emitir una revisión nueva del contrato C1/C7 y fixtures con rama de evidencia explícita. El checker F01 y sus 19 schemas/97 escenarios siguen offline; los checks ABI de esta propuesta no son nuevos escenarios AS de permisos ni un verificador de anclaje.

3. Compromisos y ABI candidato

Notación: H=SHA-256, K=Keccak-256 (no SHA3-256), J=JCS, U=UTF-8, b64u base64url canónico sin padding. \0 es un octeto NUL.

G = H(U("XCIM-AS-01-GENESIS\0") || J(as_genesis))
C = H(U("XCIM-AS-01-CHECKPOINT\0") || J(checkpoint_payload))
I = H(U("XCIM-AS-EVM-01-IDENTITY\0") || J({
    adapter_profile, issuer_id, log_id, as_genesis_commitment: b64u(G)
}))
T = H(U("XCIM-AS-EVM-01-INTENT\0") || J(anchor_intent))
D = K(U("XCIM_AS01_EVM_ANCHOR_V1"))
anchor_id = K(abi.encode(
    bytes32 D, uint256 chain_id, address contract_address,
    bytes32 T, bytes32 I, bytes32 G, uint64 sequence,
    bytes32 C, bytes32 previous_C
))

G/C son exactamente los hashes AS existentes, decodificados a 32 bytes. No volver a hashear sus strings base64url/hex ni el envelope JWS. previous_C es cero de 32 octetos sólo en secuencia 1, cuando C4 tiene predecesor null; para secuencias posteriores es el compromiso del C4 anterior. No es el hash del anchor record ni el genesis del perfil Amoy viejo.

ABI concreto descargable: abi.json. Notación de interfaz, sin implementación ni promesa de bytecode desplegable:

constructor(bytes32 asGenesisCommitment_, bytes32 anchorIntentCommitment_,
            bytes32 identityCommitment_, address publisher_, address guardian_);

event ASCheckpointAnchored(
    bytes32 indexed identityCommitment,
    uint64 indexed sequence,
    bytes32 indexed checkpointCommitment,
    bytes32 previousCheckpointCommitment,
    bytes32 asGenesisCommitment,
    bytes32 anchorId,
    address publisher);
event ASHalted(address indexed guardian);

function anchor(uint64 sequence, bytes32 checkpointCommitment,
                bytes32 previousCheckpointCommitment) external returns (bytes32 anchorId);
function checkpointAt(uint64 sequence) external view
    returns (bytes32 checkpointCommitment, bytes32 previousCheckpointCommitment, bytes32 anchorId);
function head() external view returns (uint64 sequence, bytes32 checkpointCommitment);
function asGenesisCommitment() external view returns (bytes32);
function anchorIntentCommitment() external view returns (bytes32);
function identityCommitment() external view returns (bytes32);
function publisher() external view returns (address);
function guardian() external view returns (address);
function halted() external view returns (bool);
function halt() external;

Evento no anónimo: cuatro topics (firma + identity + sequence + C); data son cuatro palabras de 32 bytes (previous_C, G, anchor_id, publisher), 128 octetos. Secuencias usan uint64 pero el contrato debe limitar 1..9007199254740991, intersección con enteros seguros AS/E1. Address son 20 octetos con padding izquierdo cero; uint64 debe tener sus 24 octetos altos cero. Rechazar longitudes, padding, topics extra/faltantes y campos fuera de rango, no truncar casts. Los hashes son bytes32 completos; el último argumento de anchor_id no es un nuevo hash del predecesor. Se usa abi.encode, nunca encodePacked.

La especificación ABI de Solidity define la separación indexed/data y Keccak de la firma. El fixture y checker publicados aquí comprueban sólo esta representación, no ejecución EVM.

4. Máquina de estado del contrato propuesto

Constructor: exigir G/T/I no nulos, publisher y guardian no cero y distintos; fijarlos inmutables. Sin proxy, setters, delegatecall, llamadas externas, retiro de fondos ni selector para editar historia. No hay ERC/token/billing. Inicialmente head=(0,0) y halted=false.

anchor exige sender publisher, estado no detenido, C no cero y secuencia segura positiva. Para una secuencia nueva exigir sequence=head.sequence+1 y predecesor igual a head.C (cero sólo para la primera). Calcular anchor_id con block.chainid y address(this); escribir mapping/head y emitir el evento en la misma ejecución. El contrato no comprueba firmas JWS/roles/roots: el receiver debe hacerlo sobre C4/C3/C2. Un publisher comprometido puede causar denegación de servicio con hashes basura, pero no forjar por ello un C4 válido.

Retry de una secuencia ya guardada con exactamente C/predecesor iguales: devolver el mismo anchor_id sin cambiar storage ni emitir evento nuevo. Valores diferentes revierten ConflictingCheckpoint; saltos/cero/overflow revierten InvalidSequence. Si está detenido, rechazar incluso retries de escritura; los getters continúan disponibles. Errors candidatos adicionales: UnauthorizedPublisher, UnauthorizedGuardian, Halted, InvalidCommitment. Sus selectores están en ABI; no son resultados XCIM.

halt sólo puede llamarlo guardian, de forma irreversible e idempotente: primera llamada cambia false→true y emite ASHalted; posteriores no emiten. No resetea head/mapping. Detención retira disponibilidad/autoridad de publicación según política al conocerse; no borra ni concede consentimiento. Receiver debe leer halted al bloque finalizado aceptado, no asumir que un anchor antiguo implica que el contrato sigue habilitado. Su caché tiene la cota de §7; no hay revocación de efecto instantáneo garantizado.

No existe anchorVariantCount AS: el modelo rechaza segunda variante en la misma cadena canónica. Un receiver igualmente debe detectar contradicciones entre eventos/estado, C4/C3 y sus floors; si aparecen, pone en cuarentena el issuer/log. No elegir una variante ni retroceder a otra red/contrato.

Rotación de publisher/guardian: en esta primera propuesta requiere detener y desplegar una instancia nueva, con nuevo log/genesis y bootstrap aceptado. No hay migración unilateral ni reset de floors. Esto tiene coste operativo; si se quiere rotación in-place, debe diseñarse su autorización por epoch, eventos, recovery y revisión, antes de añadir un setter o proxy al ABI.

5. Genesis y provenance sin ciclos

Tres piezas con funciones distintas. La plantilla tiene nulls intencionales: es una checklist, no un genesis válido. No se publican direcciones, keys ni hashes de despliegue fingidos.

5.1 Genesis AS existente

Payload cerrado de F01: {issuer_id, log_id, profile_id, origin_nonce, anchor_policy_id}. Su hash es G. anchor_policy_id es un identificador estable, no el hash de un documento que contiene la dirección futura. No agregar campos a ese schema ni copiar el nonce del fixture para un despliegue real.

5.2 AnchorIntent previo al despliegue

Contenido candidato: adapter_profile, anchor_policy_id, issuer_id, log_id, as_genesis_commitment, identity_commitment, chain_id, network_genesis_block_hash, contract_model, abi_sha256, creation_code_template_keccak256, build_recipe, initial_publisher, guardian, finality_policy_id. contract_model=immutable-single-log. La receta fija compilador exacto, target EVM, optimizer, metadata y fuentes.

creation_code_template es el output de creación del compilador sin los argumentos de constructor; no contiene T/dirección/tx futura. T se calcula después con intent completo y se pasa al constructor. Hash ABI es SHA-256 de los bytes JCS del array ABI; no su JSON pretty printed. Este paquete fija ABI candidato, pero source/compiler/template hashes siguen pendientes.

5.3 DeploymentBinding posterior al despliegue

Objeto candidato firmado por el quórum raíz aceptado: adapter_profile, anchor_policy_id, issuer_id, log_id, as_genesis_commitment, anchor_intent_commitment, chain_id, network_genesis_block_hash, contract_address, deployment_transaction_hash, deployment_block_number, deployment_block_hash, creation_input_keccak256, runtime_code_keccak256, abi_sha256, constructor_arguments, bootstrap_finalized_block_number, bootstrap_finalized_block_hash, root_policy_epoch, valid_from, valid_until. Debe coincidir con intent y observación independiente del despliegue.

Orden acíclico: fuentes/ABI/receta → template de creación → genesis AS e intent → T/args → despliegue → runtime/location/receipt → DeploymentBinding → pins locales C1. G/T/I nunca contienen el DeploymentBinding. C4 nunca contiene su propio anchor_id/receipt/bloque; sólo el genesis/perfil y compromisos anteriores.

La raíz autentica el binding, pero la firma no reemplaza verificar creation input, código runtime, constructor, getters y cadena/bloques. Discovery, explorer o HTTP200 no hacen bootstrap. Chain ID por sí solo tampoco distingue una cadena falsa con el mismo número: fijar genesis de red y estado de consenso aceptado, software y procedimiento de sincronización verificados.

6. Red y alternativas de finalidad

Piloto recomendado: Amoy 80002, opt-in por receiver, nuevo log/genesis y contrato AS. No reutilizar la dirección ni evento del batch de octubre. Parent Sepolia no equivale a heredar una prueba de finalidad Ethereum del anchor AS. Otra EVM, Polygon mainnet 137 o Sepolia como red de ejecución son otros perfiles.

Ruta Qué acredita / supone Uso propuesto
amoy-milestone-receiver-node-01 Receiver confía en su instalación de Bor+Heimdall sincronizada, que valida ejecución y consenso; bootstrap de red aceptado, API local protegida. Ruta recomendada para el ensayo de verificación independiente. Fijar versiones/flags/provenance y comprobar soporte Amoy antes de habilitarla.
amoy-two-rpc-observation-01 Acuerdo de al menos dos operadores verdaderamente distintos sobre receipt, bloques/código/getters; depende de ambos y no prueba consenso local. Observación de ensayo con etiqueta separada, nunca fallback de la ruta anterior ni public-proof PASS por coincidencia. Independencia no se deduce de URLs distintas.
Cliente ligero/pruebas de consenso y receipts Header finalizado autenticado, inclusión de receipt y estado/getters autenticados bajo ese header. Futuro perfil portable; requiere especificación, implementación y revisión propias. Un JSON que contiene header/receipt no basta.
Checkpoint al parent / Ethereum como ejecución Otra garantía y latencia/coste de publicación, con su propio bootstrap/consenso. Comparar/medir, no presumir que satisface 300s ni relajar frescura mientras se espera.
N confirmaciones o status=finalized del issuer Profundidad o autoafirmación, sin la validación seleccionada. No suficiente para el perfil recomendado.

No se promete una latencia de red. La documentación de Polygon orienta el mecanismo, pero se deben observar las versiones y comportamiento reales Amoy. Fallo del tag finalized, nodo sin sync, datos podados o políticas incompatibles retiran señal positiva; no degradar silenciosamente a latest/safe/N bloques.

7. Algoritmo candidato del receiver

  1. Aplicar límites y seleccionar perfil/pins C1 antes de tocar URLs. Validar C2/C3/C4, hashes y estados bajo AS; la presencia del evento no autoriza esos objetos. C4 debe ser exacto, con scope y genesis aceptados.
  2. Verificar identidad/salud/sync de la fuente de consenso aceptada. Obtener F finalizado y conservar su número/hash y contexto de observación local. La fuente de consenso debe justificar el header; un RPC remoto arbitrario no se convierte en nodo verificador porque use el tag correcto.
  3. Obtener receipt exitoso y bloque B del evento. Exigir chain ID/genesis/red y contract address aceptados; receipt.status=1, transaction/block hashes, logIndex/transactionIndex y removed=false consistentes. Fallar ante logs ambiguos. Verificar B pertenece a la cadena finalizada de F por ancestry o la vista coherente del nodo validador, no sólo B.number <= F.number. Si B=F, hashes deben ser idénticos.
  4. Decodificar exactamente el evento AS y comparar I, sequence, C, previous_C, G, publisher y anchor_id recalculado con chain/contract/T. Confrontar el checkpoint C4 y su predecesor. Una transacción exitosa con otro evento no sirve.
  5. Leer código y getters al mismo hash F, con requireCanonical=true cuando corresponda. Verificar runtime hash, G/T/I, publisher/guardian y halted=false; checkpointAt(sequence) debe coincidir con evento. head no puede contradecir el historial aceptado ni justificar seguir usando un C4 anterior si ya revela uno posterior. Si el nuevo head no tiene evidencia AS usable, retirar señal.
  6. Comprobar floors durables de manifest/C3/C4 y de cadena: hash por altura, no descenso de finalized height, evento/head ya aceptados y tombstones. Una reorg de datos que se habían aceptado como finalizados es fallo de seguridad: cuarentena, diagnóstico y recuperación autenticada, no rollback a active.
  7. Recalcular deadline al aceptar SMTP o reutilizar/exportar. Esperar, adquirir F más nuevo o reintentar transacción no renueva el corte firmado. Registrar evidencia/diagnóstico sin PII; actualizar floors atómicamente con su uso.

EIP-1898 permite consultas por hash y condición de canonicalidad para llamadas de estado; véase su especificación. En este perfil candidato se exige soporte consistente: si un proveedor/nodo no lo ofrece, no se presupone que una consulta a latest sea equivalente.

Para recepción de evidencia adjunta sin nodo local, exigir las pruebas de inclusión/estado y autenticación del header que defina un perfil portable futuro. El transporte de receipt/log/bloque por un mirror no autentica su contenido. La ruta de observación de dos RPC no rellena esta dependencia.

7.1 Parámetros iniciales para medir

Parámetro Hipótesis propuesta Tratamiento al fallar
Ventana AS Hasta 300s del corte, sin extensión Estado vence aunque el anchor finalmente aparezca.
Cadencia AS Objetivo 60s cuando se opera publicación fresca Medir carga/coste/capacidad. Cero eventos requiere batch/C4/anclaje nuevos; no regenerar viejo timestamp.
Reloj AS Incertidumbre u acotada hasta 60s Conservar reglas F01: inicio <= t-u, fin exclusivo > t+u.
Edad del header F Hasta 120s respecto a timestamp de cadena, con reloj acotado Exigir F.timestamp <= t+u y t+u < F.timestamp+120; si no, no hay vista fresca. Es supuesto de ensayo, no SLA.
Caché de vista validada Hasta 30s desde adquisición local, medidos con reloj monotónico confiable Pasado el límite, refrescar o retirar señal; el wrapper del issuer no proporciona esa hora.
RPC Hasta 8 consultas concurrentes, 2s por consulta y 10s totales por intento Sin fallback permisivo. Cadena de ancestry muy larga o datos podados requiere resync/recursos explícitos, no un bucle sin cota.

Deadline efectivo: mínimo del deadline AS completo, deadlines de trust/keys, F.timestamp+120 y expiración local de la vista validada. La caché de vista usa tiempo monotónico; no sumar la hora de descarga de un wrapper a la frescura de permiso. Nodos recién consultados pero estancados en un F viejo no renuevan la política. Bloque B/F no acredita la veracidad del consentimiento ni la atomicidad del snapshot firmado.

Los valores 120s/30s/10s son nuevos parámetros no medidos. Si finality y transporte no caben dentro de 300s, el perfil no es viable con esa ventana; debe revisarse de forma explícita. No prometer que esperar más genera permiso.

8. Evidencia de anchor y separación de resultados

Rama C7 futura candidata: adapter_profile, anchor_intent_commitment, deployment_binding_commitment, checkpoint_commitment, sequence, transaction_hash, transaction_index, block_number, block_hash, log_index, event, finalized_view_reference. Event/receipt/proofs deben tener schemas cerrados propios del perfil seleccionado. Es diseño, no rama habilitada.

Una referencia a vista finalizada sólo es usable si el receiver ya autenticó esa vista o verifica pruebas definidas por su perfil. Campos confirmed, finalized, confirmations o una firma del issuer nunca sustituyen esa arista. El anchor_id es identificador contextual; no es por sí solo proof criptográfica de inclusión. Incluso anchor válido no establece PASS sin todas las comprobaciones de permiso, destinatario, app/roles, contenido, DKIM, frescura y replay SMTP.

Devolver por ahora sólo diagnósticos de propuesta/layout. No registrar nuevos resultados XCIM ni convertir ANCHOR_OBSERVED_TEST_ONLY, receipt.status=1, ABI válido o schema válido en permiso. Los errores de disponibilidad y de consistencia deben conservarse distintos de revocación y fraude demostrado.

9. Decisiones N1–N6 y criterios de cierre

ID Elección propuesta Criterio para aceptar dirección / cerrar la concreción
N1 ABI/compromisos ABI AS de este documento, C4 commit-only, domain/chain/contract/G/T/I en anchor_id. Revisar tuplas/tipos/bytes y aceptar ABI/preimágenes; vectores cruzados contra compilación/ABI library y negativos de padding/overflow/mezcla de perfil.
N2 contrato/control Inmutable por issuer/log, publisher EOA y guardian distintos, halt irreversible y sin variantes. Aceptar coste de migración; implementar source y tests EVM de auth, idempotencia, orden, conflictos/halt y ausencia de privilegios ocultos. Auditoría/versiones antes de despliegue real.
N3 genesis G AS sin cambios + intent previo + deployment binding posterior por raíz. Fijar schemas/receta/compiler/runtime/provenance y bootstrap/root-policy; demostrar orden acíclico y rechazos ante address/code/constructor/red falsos. Todos los campos reales, sin nulls de plantilla.
N4 red Amoy 80002, nuevo log/contrato, opt-in; sin decisión mainnet. Ratificar entorno y participantes; obtener genesis/checkpoint de red y fuentes independientes aceptadas. Ensayo de wrong-chain/fork con mismo chain ID, sin pins copiados del fixture.
N5 finalidad Nodo validador del receiver; dos RPC observación bajo otra política. Fijar versiones/config Bor/Heimdall, demostrar milestone/finalized/ancestry y consultas coherentes por hash en Amoy. Medir datos podados/fallo/reorg/discrepancia; sin degradación a latest.
N6 operación/compatibilidad Mantener 300s, medir 120s/30s/10s, nueva revisión C1/C7. Schemas/verifier de evidencia completos, caché/floors durables, transportes acotados, snapshot continuo y prueba deadline al commit SMTP. No modificar F01 para aceptar un anchor incompleto.

Gates de preparación, implementación y operación

Coste base de la cadencia de 60s: hasta 1440 anclajes por día por log que opere continuamente, incluso vacíos. Gas/almacenamiento/coste monetario y capacidad no están medidos. No se cotizan fees ni se compra token/servicio en esta entrega.

10. Casos de ensayo pendientes, no ejecutados on-chain

Plan AN-T01–AN-T20 para la siguiente iteración, aparte de los checks de layout:

Caso Rechazo/propiedad verificable requerida
AN-T01 Secuencia 1 con prev cero y scope correcto; getters/evento coinciden.
AN-T02 Sucesor y cero-eventos nuevos, con C4/batch exactos y predecesor.
AN-T03 Retry idéntico no emite/escribe de nuevo; conflicto revierte.
AN-T04 Saltos, cero, overflow uint64/entero seguro y C cero se rechazan.
AN-T05 Sender no autorizado no publica; publisher no detiene como guardian.
AN-T06 Halt irreversible/idempotente; retiro de señal al observar estado finalizado.
AN-T07 Evento antiguo Amoy, perfil/issuer/log/G/T/I o C4 ajeno se rechazan.
AN-T08 Repetición en otra chain/address, incluso mismo chain ID de fork, no pasa bootstrap/anchor_id.
AN-T09 Constructor, creation input, runtime o proxy inesperados fallan provenance.
AN-T10 Receipt exitoso sin evento exacto, log duplicado/removed o índice/hash incoherente falla.
AN-T11 B.number menor pero hash de otra rama no se acepta por comparación numérica.
AN-T12 Finalized tag ausente o nodo sin sync/pruned/429/timeouts retira señal.
AN-T13 Dos RPC coinciden pero no satisfacen política receiver-node; no hay fallback.
AN-T14 Cambio de head/halted entre consultas no mezcla bloques; llamadas fijadas en F.
AN-T15 Reorg/finalized floor conflictivo pone cuarentena y no restaura estado antiguo.
AN-T16 F viejo recién descargado y caché >30s no renuevan la vista.
AN-T17 Deadline AS vence durante espera de anchor: no aceptar después.
AN-T18 Reinicio/pérdida de floors exige resync aceptada; no TOFU del email.
AN-T19 Migración por cambio de publisher exige nuevo bootstrap y no borra historia.
AN-T20 Receiver independiente reproduce evidencia completa; permisos/autoridad/replay siguen siendo gates adicionales.

Los checks tools/check_proposal.py sólo cubren forma ABI, selectores/topics, preimágenes/encoding de un fixture y negativos locales de layout. No ejecutan AN-T01–AN-T20, no consultan chain/RPC y no prueban el contrato o finalidad.

11. Próximo trabajo recomendado

Aceptar/ajustar N1–N6 → source de contrato + schemas del intent/binding/evidencia → tests EVM y verifier offline con fallos → bootstrap y ensayo Amoy autorizados → operación/review/interop. Publicar este diseño y sus archivos en los sitios no autoriza ni implica deploy on-chain, envío IETF o cambio de trust local.

Fuentes primarias consultadas el 2026-10-19: AS-01, AS01-F01, Amoy 0.1 histórico, Polygon Finality, Polygon RPC/redes, ABI Solidity, EIP-1898, Ethereum PoS. Los mecanismos AN01 adicionales son diseño XCIM, no aprobación de esas fuentes.