402Signal

Verifica rutas x402 en vivo en Base, Solana y Algorand antes de que los agentes gasten; $0.003 USDC se liquida solo para una ruta válida y elegible en vivo, con fallos tipados normales no liquidados y el pago al vendedor por separado.

Documentación

402Signal

402Signal verifica rutas x402 en Base, Solana y Algorand antes de gastar. $0.003 solo cuando se encuentra una ruta válida en vivo. Los fallos normales tipados no se liquidan. El pago al vendedor es separado. Tu agente conserva la billetera. La evidencia de enrutamiento entra en el registro de confianza PQ en Algorand MainNet. El require_route_binding=true opcional añade un recibo v4 firmado para que el comprador compare con los términos actuales del vendedor antes de firmar. Guía: https://402signal.com/developers#route-binding Falcon autoriza una transacción de punto de control, no un pago a un comerciante. Esto no es un riel de pago PQ ni una afirmación de que el producto sea totalmente resistente a la computación cuántica.

Fecha: 2026-08-29. Verificación y liquidación en producción. Sin claves de pago privadas. Nunca pagamos aguas arriba.

Ejecutar localmente

Python 3.12 (stdlib más cryptography fijado para JWTs de Coinbase CDP y firmas de registro Ed25519). El valor local predeterminado es 127.0.0.1:8081. Fly / Docker enlazan 0.0.0.0:$PORT (predeterminado 8080).

PYTHONPATH=. python3 -m live402

Luego abre http://127.0.0.1:8081

POST /route no pagado devuelve HTTP 402. Bucle de operador local (omite el muro de pago, aún sondea):

LOCAL_FREE=1 PYTHONPATH=. python3 -m live402

LOCAL_FREE=1 es solo para pruebas. Producción no debe configurarlo.

Sin conexión / pruebas (sin red, catálogo de fixtures):

LIVE402_FIXTURE=1 LOCAL_FREE=1 PYTHONPATH=. python3 -m live402

Pruebas:

LIVE402_FIXTURE=1 PYTHONPATH=. python3 -m unittest discover -s tests -v

POST /route

Cuerpo:

{ "need": "erc20 token balance", "url": "https://example.com/x402/balance", "prefer_network": "base" }

`need` or `url` (or both) is required.
  • Sin pago válido y LOCAL_FREE sin configurar → HTTP 402. Un 402 lista tres aceptaciones (Base, Solana, Algorand) más la extensión de bazar. No sondeamos.
  • Autorización válida: coincide exactamente con el riel anunciado, reserva su huella de reproducción de forma duradera, verifica con el facilitador correspondiente, valida el cuerpo, luego descubre y sondea. Liquida solo después de que una ruta elegible válida en vivo pase la compuerta final de ganador facturable. Un encabezado no verificado nunca abre la compuerta.
  • Si url está configurado: debe ser https. Las URL públicas desconocidas son solo puerto 443; las listas conocidas del catálogo pueden usar el puerto HTTPS ya presente en esa lista. La sonda no pagada es GET primero, luego POST {} solo cuando GET es 405/501 Y el catálogo declara explícitamente POST Y no requiere cuerpo de solicitud. Nunca hagas POST {} después de GET 200/400/401/403/404/500. Nunca hagas POST de cuerpos de entrada declarados por el vendedor o el catálogo. Si un cuerpo requerido significa que no se puede construir una sonda no pagada válida, el fallo tipado es unsafe_to_probe. DNS usa un grupo de resolutores acotado (getaddrinfo, 2s); la conexión TCP/TLS está fijada a esas IP públicas verificadas contra SSRF con SNI TLS y Host HTTP configurados al nombre de host original (reverificado y re-fijado en cada salto de redirección). Cierre seguro si no se puede aplicar pin/SNI/Host. Tiempo de espera ~4s. La respuesta incluye live, status, latency_ms, has_402_challenge, selected_payment, billing y una instantánea de health. $0.003 solo cuando se encuentra una ruta válida en vivo. Los fallos normales tipados no se liquidan. El pago al vendedor es separado.
  • Si solo need: búsqueda federada por necesidad (FTS local en catalog.sqlite + Coinbase / PayAI / GoPlausible) en el momento de la solicitud (CDP /discovery/search; búsqueda de PayAI / GoPlausible o una pequeña búsqueda de primeras páginas), unión/deduplicación/clasificación de ese conjunto de trabajo, hidratar solo los ~5–10 finalistas principales con método/esquema/nombre de herramienta reclamados (acotado, TTL, gzip opcional en disco; nunca un índice de esquema RAM de 44k), luego sondear adaptativamente (primeros 3, expandir 2–4 si no hay ganador; techo duro 20). Devuelve la mejor opción en vivo actualmente observada (no la primera URL en vivo, no un riel solo de catálogo). Un ganador HTTP 200 es un recurso más la opción de pago exacta observada que lo hizo ganar: selected_payment nunca es nulo, nunca se copia de una afirmación del catálogo, y cuando networks está configurado, su network debe estar en ese bloqueo. Los aciertos en vivo se actualizan por escritura en disco. Las afirmaciones del catálogo permanecen en claimed.payment_options y catalog.sqlite accept_claims; target.accepts y la selección usan solo el sobre HTTP 402 actual. Los esquemas reclamados no son opciones de pago observadas. Un fallo normal completado → HTTP 200 con live:false, payable:false, selected_payment:null, billing.settlement_attempted=false y billing.settled=false; la autorización verificada se convierte en un resultado de reproducción terminal duradero not_settled. Las restricciones estructuradas opcionales son campos de nivel superior de la solicitud: max_price_usd, max_total_cost_usd (comerciante + tarifas conocidas; tarifa desconocida cierra con fallo), max_probe_latency_ms, max_service_latency_ms (p50 histórico, no RTT de sonda), max_settlement_latency_ms (liquidación/finalidad, no RTT de sonda), require_invocable, networks (bloqueo de política dura), min_observations, min_observed_success, min_reputation_score, min_reputation_confidence. Un objeto anidado constraints se rechaza en lugar de ignorarse silenciosamente. prefer_network es solo una preferencia de clasificación débil; no se convierte en filtro. max_latency_ms es un alias de RTT de sonda. Valores medidos desconocidos cierran con fallo. objective opcional: best / cheapest / fastest / most_reliable / lowest_total_cost / fastest_settlement. cheapest, fastest y most_reliable clasifican los candidatos elegibles actualmente sondeados, no cada endpoint descubierto. fastest es el RTT de sonda de esta solicitud, no la latencia de liquidación (fastest_settlement permanece separado). policy opcional / redacción de necesidad como weather under $0.01 and 300ms se compila en restricciones estructuradas; "uso establecido" / "evidencia observada fuerte" se compila en min_observations=10; "alta reputación" vaga permanece sin resolver; lenguaje de liquidación / costo total se compila solo con un límite numérico. El motor usa solo valores estructurados. interpreted_constraints / applied_constraints reflejan las restricciones realmente utilizadas. Los ganadores liquidados /route y los no pagados /preview incluyen componentes transparentes de reputation (observado / uso / antigüedad / estabilidad / recuento_de_fuentes) más V1 reputation_score, reputation_confidence y scoring_model_id / scoring_model_hash. Los fallos gratuitos permanecen tentativos y no promueven historial de confianza. Los economics del riel (precio del comerciante, tarifas, liquidación/finalidad) se ubican en la opción de pago seleccionada y en compared[], cada campo etiquetado 402signal_observed, protocol_reference o unknown. Mismo modelo en Base, Solana y Algorand (sin bonificación de algoritmo). El catálogo no es una insignia de 0–100. Pulse permanece en hechos; las tasas permanecen ocultas por debajo de n=10. Las direcciones de pagador únicas nunca se listan. La mayoría de los campos de uso/liquidación/pagador único son desconocidos en el primer lanzamiento porque 402Signal tiene historial de sonda, no un libro de liquidación.
  • Upstream muerto es 503 con la instantánea, nunca una URL en vivo falsa.
  • LIVE402_FIXTURE=1 usa live402/data/fixtures.json. Sin red.
  • HTTP 200 liquidado incluye target: { method, inputSchema, outputSchema, accepts, facilitator, amountAtomic, displayAmount, timeoutSeconds } (solo aceptaciones del sobre), selected_payment: { rail, network, asset, amount_atomic, display_amount, normalized_usd, payTo, facilitator } y billing: { model, condition, asset, amount_atomic, display_amount, rail, settlement_attempted, settled, settlement_state }. selected_payment debe coincidir exactamente con una opción válida del sobre actual. payable requiere una opción observada completa; invocable es pagadero más esquema de entrada. Si falta el esquema, live puede seguir siendo verdadero con invocable: false y miss_reason: "no_input_schema". accepts[].extra.facilitator se copia como {url, feePayer, caip2, scheme} — no uses el valor predeterminado x402.org.
  • miss_reason es una enumeración cerrada: no_candidates, no_402_envelope, no_payto, reachable_200, probe_timeout, quote_expired, invalid_need, upstream_5xx, ssrf, no_input_schema, constraints_unmet, probe_budget_exhausted, probe_limit_reached, unsafe_to_probe, settlement_unknown. HTTP 402 sin payTo utilizable es no_payto (fallo tipado, no reintentar pago). El presupuesto de sonda es inferior a 60s; un cuelgue devuelve 503 JSON inmediatamente. stop_reason y probe_ceiling dicen por qué se detuvo la sonda.
  • GET /health es HTTP 200 { "ok": true } para verificaciones de Fly. No es una lista de pago. No es un volcado de rieles.
  • GET /ready verifica el acceso a catálogo/historial/registro y la consistencia del registro, más una sonda real de escritura en el libro de reproducción, modo de diario duradero y capacidad de admisión de almacenamiento. La respuesta es solo booleanos (sin rutas, sin secretos). Las verificaciones de catálogo/historial/registro no simulan escrituras de disco lleno. La salud de Fly permanece en /health hasta que /ready se demuestre seguro en staging.
  • GET /preview?need= es una búsqueda de catálogo no pagada en el momento de la solicitud (not_probed: true, aciertos + precios + frescura + facilitador/método/inputSchema_presente/rieles_activos, also_on[] opcional). prefer_network=base|solana|algorand opcional es una preferencia de clasificación débil: clasifica ese riel primero pero aún busca en los tres. networks=solana opcional (repetir o separar por comas) es un bloqueo de política dura sobre qué rieles se consultan. discovery_via es un mapa compacto de cómo se encontró por riel; discovery_exhaustive es verdadero solo cuando el conjunto devuelto se sabe completo. No sondea y no cobra. POST /route pagado sigue siendo la sonda 402 de cierre con fallo.
  • GET /rails lista las tres redes de pago, activo, cantidadAtómica, facilitadores, pagadoresDeTarifas, maxTimeoutSegundos y actividad+latencia por riel. En caché. No se mete en /health.
  • GET /pulse es una instantánea JSON. Los totales del catálogo permanecen sin publicar. El descubrimiento usa catálogos upstream actuales más una sombra local del proceso (no un índice RAM de mundo completo). index_status es upstream-live, shadow-warm, both o fixture. n_7d observado proviene de 402signal_observed. Las tasas (success_7d, payable_rate_7d, invocable_rate_7d) se omiten por debajo de n=10. No hay healthy binario ni executable_now_rate. Los parámetros de consulta se ignoran — sin URL proporcionadas por el llamador. En caché ~15s. Apertura con fallo: nunca espera un rastreo de descubrimiento. El refrescador de goteo nunca bloquea /route.

Etiquetas de capacidad

Las capacidades son sugerencias de descubrimiento conservadoras basadas en reglas, no garantías de calidad de salida o intercambiabilidad. market.price cubre cotizaciones, precios y datos OHLCV; market.analysis cubre análisis financiero como régimen de mercado, amplitud sectorial, liderazgo, indicadores técnicos y retornos probabilísticos. Palabras amplias como "análisis", "señal" y "liderazgo" necesitan contexto financiero en la misma fuente de evidencia; "mercado" o "trading" solos ya no implican precios. RSI/MACD son términos distintivos de indicadores; OHLC/OHLCV proporcionan contexto financiero. El análisis financiero específico resuelve la superposición de precios/pronósticos; los conflictos de categorías no relacionados permanecen ambiguos. La prioridad de evidencia existente permanece en etiquetas, nombre de herramienta, descripción, nombre de servicio, luego una URL distintiva.

Pon el trabajo específico en need (por ejemplo, "régimen de mercado de acciones" o "liderazgo de amplitud sectorial"). "Inteligencia de mercado" es un sinónimo de búsqueda para "análisis de mercado", no una segunda capacidad. Los recuentos y límites de solicitudes de búsqueda no cambian. Pulse mantiene el tema amplio market para ambos. Las versiones de clasificación conviven con las etiquetas almacenadas. Los registros más antiguos se reclasifican al leerlos para el ranking y se reindexan en lotes de como máximo 100 en el trabajador de goteo en segundo plano existente. Esto cambia solo las etiquetas derivadas y su índice de búsqueda: las marcas de tiempo de reclamación/verificación, las reclamaciones de pago, las generaciones de fuentes, el historial y los eventos de reclamación se conservan. No se necesita una reconstrucción completa del catálogo al reiniciar. Hasta que el relleno se complete, las búsquedas que dependen únicamente del texto indexado de la nueva capacidad pueden omitir registros más antiguos tanto en /preview como en /route; la clasificación al leer corrige los candidatos devueltos, no la cobertura de recuperación. El texto descriptivo de need aún busca en las descripciones de endpoints retenidas. El trabajo pendiente avanza solo mientras el trabajador de goteo esté habilitado y el almacenamiento sea escribible. Los fallos de reclasificación emiten catalog_reclassification_failed como máximo una vez por minuto y dejan la actualización ordinaria de reclamaciones en ejecución. No se registran contenidos de excepciones ni metadatos de vendedores. Los nombres de herramientas previamente no retenidos no se pueden recuperar mediante reclasificación; la actualización ordinaria ascendente proporciona esa evidencia. Los nuevos registros reducidos retienen nombres de herramientas limitados. Los cambios futuros de taxonomía deben incrementar CAPABILITY_VERSION y probar tanto ejemplos positivos como intenciones vecinas/ambiguas, incluidas las actualizaciones de catálogo persistidas.

Cola de actualización del catálogo en la sombra

El goteo en segundo plano es un paso limitado a la vez (unas pocas URL obsoletas, o una página COLD). No reconstruye un catálogo RAM de 44k y no añade fanout de red más allá de los presupuestos existentes de descubrimiento/sondeo.

Prioridad (la primera razón que coincida gana; luego last_fetched / URL). Mismo orden en live402/shadow.py REFRESH_REASONS:

  1. recent_search — buscado en la última hora, reclamación más antigua que LIVE402_HOT_REFRESH_S
  2. recent_route — enrutado en la última hora, reclamación obsoleta
  3. source_disagreement — dos catálogos no coinciden en el monto o payTo para el mismo riel
  4. price_change — evento de reclamación price_changed reciente
  5. payto_change — evento de reclamación payTo_changed reciente
  6. schema_change — evento de reclamación schema_changed reciente
  7. failed_probe — el último sondeo independiente no estaba activo
  8. stale_observation — nunca verificado, o la última verificación tiene más de un día
  9. high_demand_capability — capacidad con al menos dos listados buscados recientemente

Si la cola está vacía, el actualizador toma una página de generación COLD.

  • GET /dashboard son las mismas muestras que HTML. Búsquedas por cadena que puedes probar; haz clic para precargar el formulario de la página de inicio. También gratis.
  • GET / la página de inicio está en inglés sencillo: una línea sobre qué es /route, humanos dirigidos a GET /preview gratis, agentes a POST / MCP. El pie de página es 402signal.com / @402Signal. Soporte oculto de autorización Base (solo billetera inyectada) firma una autorización EIP-3009 de $0.003 y hace POST de PAYMENT-SIGNATURE; se liquida solo para una ruta elegible válida y activa. Algorand y Solana permanecen para agente/CLI. Un recuadro breve "para agentes" muestra POST https://402signal.com/route más enlaces a /llms.txt, /preview, /rails, /openapi.json, /.well-known/x402.json y /mcp.json. La navegación es Inicio / Pulse (GET /pulse); sin /dashboard en la navegación de la página de inicio.
  • GET /route se divide por Accept: los navegadores (text/html) obtienen la página humana (HTTP 200). Los agentes (application/json) y curl sin Accept obtienen HTTP 402 + bazaar + accepts (monto 3000). Los agentes que pretendan autorizar deben hacer POST, no GET.
  • Descubrimiento: GET /openapi.json, GET /mcp.json, GET /.well-known/x402, GET /.well-known/x402.json, GET /robots.txt, GET /llms.txt, GET /preview, GET /rails. El POST /route de pago está documentado con x-payment-info y HTTP 402. El tipo de bazaar MCP es mcp + toolName: route.
  • POST /validate (también GET /validate?url=) es un sondeo de vendedor no remunerado: ¿está este endpoint listo para agentes? Solo se sondean URLs ya en el catálogo o fixture (sin búsqueda pública arbitraria). El mismo ayudante no remunerado que /route: GET primero, POST {} justificado solo, nunca un cuerpo declarado en el catálogo, IP-pin DNS, SSRF de cierre por fallo. No escribe 402signal_observed. No es un bypass de pago /route. Devuelve preparación, reclamado vs observado, banderas. Nunca una bandera binaria healthy.
  • GET /attestation es un sha256 público de JSON canónico de un lote de sondeo 402signal_observed reciente (batch_id, created_at, n, algo, hash). No en cadena. Sin firmas ni claves. ?batch_id= opcional.
  • GET /pq/log/checkpoint y GET /pq/log/tile/* son un registro de transparencia C2SP experimental (tlog-checkpoint@v1.0.0 + tlog-tiles@v0.1.0). La identidad de producción es solo MainNet: origen 402signal.com/pq/log/mainnet-v1, época mainnet-v1, DB /data/pq-log-mainnet.sqlite, LIVE402_PQ_FALCON_NETWORK=mainnet, pq-anchor/3, dirección Falcon MainNet y respuestas autenticadas del firmante MainNet. La red no establecida o desconocida falla de forma cerrada. No hay respaldo PQ TestNet en vivo. Las constantes TestNet, LIVE402_PQ_LOG_SK, LIVE402_PQ_SIGNER_TOKEN, LIVE402_PQ_FALCON_BROADCAST, LIVE402_PQ_FALCON_ADDRESS, /data/pq-log.sqlite y pq-anchor/1 permanecen como SOPORTE DE PRUEBA (pruebas y archivo) únicamente. El anclaje automático MainNet es de aceptación exacta y está desactivado por defecto; su controlador duradero está fuera de la ruta de solicitud. La persistencia AUTHORIZED de producción requiere una HMAC de respuesta verificada sobre los bytes exactos de SignedTxn seguida de una validación semántica estricta; los bytes proporcionados por el llamante no pueden llegar a la persistencia. La evidencia confirmada existente sigue siendo legible. AUTHORIZED / SEND_ATTEMPTED / SUBMITTED nunca se representan como CONFIRMED. Los enlaces de explorador siguen la red/génesis registrada de forma independiente. La evidencia MainNet nunca usa URLs TestNet. La SK Falcon nunca debe vivir en 402signal. El firmante aislado nunca lee BROADCAST y nunca hace POST. last_confirmed se persiste solo después de una búsqueda+decodificación+verificación independiente. El éxito de firma o POST no es confirmación. El POST /route liquidado no espera la inclusión en la cadena. Falcon autoriza una transacción de checkpoint, no un pago de comerciante. Un ganador liquidado puede incluir pq_trust.transparency {status: pending|logged_uncheckpointed|unavailable, state, log_origin, index, checkpoint_size, receipt, reveal} opcional. Una falla gratuita no añade una hoja de decisión de ruta y no puede activar un ancla solo para esa solicitud. La liquidación y el anexo de registro no son atómicos (SEC-ROUTER-004 / A-14): un ganador liquidado no requiere una hoja firmada duradera a menos que require_transparency o require_route_binding sea verdadero. Si la transparencia requerida falla después de la liquidación, la respuesta sigue siendo veraz de que la liquidación ocurrió y no se intenta una segunda liquidación. pending significa una hoja duradera más un checkpoint firmado (estado checkpoint_signed). logged_uncheckpointed significa que la hoja es duradera sin un checkpoint firmado y nunca es éxito cuando require_transparency es verdadero. unavailable significa que no se pudo producir un recibo firmado; un anexo puede ya haber ocurrido. No está pendiente ni confirmado. Nunca digas firmado si no hay checkpoint. Los recibos de ruta predeterminados usan 402signal.route_decision.v3: la hoja pública es tipo, ts redondeado a minutos, nonce y solo compromiso sha256. Las hojas históricas v1 y v2 siguen siendo verificables con su semántica original. Una hoja pública no es una afirmación de tráfico anónimo o no vinculable. El reveal del cliente contiene evidencia privada, sal, compromiso esperado y versión de evento. verify_route_receipt() verifica la versión de evento, revelación, compromiso, leaf_hash, inclusión y el checkpoint Ed25519. receipt.leaf_hash está presente para que verify_receipt() aún pueda hacer round-trip. payment_authorization.pq_native siempre es falso. Sin página /trust. La tarjeta PQ de la página de inicio se renderiza solo cuando last_confirmed tiene un txid confirmado real. La firma Ed25519 de producción usa solo LIVE402_PQ_LOG_SK_MAINNET (nunca horneada en git; nunca autogenerada al arrancar; nunca recurre a LIVE402_PQ_LOG_SK). Ver docs/pq-automatic-anchoring.md.
  • POST /route está limitado por tasa en memoria (~12/min por IP por defecto; configurable por operador). User-Agent no otorga cuota extra. En Fly la clave del limitador es Fly-Client-IP; de lo contrario, el peer del socket. X-Forwarded-For no es confiable. Los mapas de límite de tasa y los semáforos de sondeo por host están acotados por TTL/LRU. GET /preview y el MCP tools/call preview no remunerado comparten un limitador más flexible (~180/min por IP, al menos 2× el tope de ruta). GET /pulse y GET /rails tienen cada uno su propio limitador de ~180/min por IP (mismo orden que preview, aún más flexible que /route de pago). GET /health permanece ilimitado {ok:true}. 429 cuando se excede. Los registros de solicitud de producción son id de solicitud, método, ruta solo, estado, latencia y un endpoint grueso. Las cadenas de consulta, necesidad, política, búsqueda /preview, URL objetivo /validate, JSON de solicitud, PAYMENT-SIGNATURE, X-PAYMENT, cargas de pago y cuerpos de respuesta del vendedor no se registran. Los registros de liquidación son resultado grueso éxito/omitido más riel e id de solicitud, no txids completos. Las respuestas envían X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: no-referrer, Strict-Transport-Security: max-age=31536000 (sin includeSubDomains; www es un CNAME y Fly no tiene hostnames extra) y Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; style-src 'self'; img-src 'self' data:; base-uri 'self'; frame-ancestors 'none'. script-src permanece 'self' (sin CDN, sin scripts de billetera de proveedor). connect-src es solo 'self'; el POST de pago Base de la página de inicio /route. HEAD 200 en /llms.txt /openapi.json /mcp.json /preview /rails /pulse. El recurso de pago / OpenAPI servers / recurso MCP están fijados a https://402signal.com (Host no se refleja). El DNS de sondeo usa un pool getaddrinfo acotado (2s); la conexión TCP/TLS está fijada a esas IPs públicas verificadas por SSRF con SNI TLS y Host HTTP establecidos al hostname original (re-fijado en redirecciones). Los cuerpos de catálogo declarados por el vendedor nunca se envían por POST; el POST {} injustificado se omite; las fallas de cuerpo requerido son unsafe_to_probe. El /route de pago usa un plazo de tiempo anunciado para verificar, sondear y liquidación opcional.

Los clientes de PQ Trust que necesiten verificación posterior deben retener de forma segura la respuesta completa de /route de pago, incluido compared[]; como mínimo, mantén pq_trust.transparency.receipt y pq_trust.transparency.reveal juntos. Los resultados de reproducción privados pueden retener la revelación; no son un servicio de recuperación. Mantén tu propia copia. La evidencia modificada falla la verificación contra el registro público. Debido a que la revelación contiene evidencia privada de solicitud y decisión, no debe escribirse en registros públicos.

Rutas opcionales con prueba: envía require_route_binding: true para requerir un recibo firmado v4 que vincule la URL real del vendedor observada, el método, el hash del cuerpo de la solicitud, el sobre x402 actual completo y una ventana de frescura corta. Esto también requiere transparencia. Las fallas tipadas normales siguen siendo gratuitas; un recibo requerido no disponible después de la liquidación aún reporta billing.settled=true. Las claves del comprador, la validación de transacciones, la firma y la ejecución permanecen con el comprador. El recibo inmediato usa la clave de registro Ed25519 fijada; la confirmación acumulativa posterior de Falcon es separada. Ver el contrato y verificador v1 para formas de solicitud admitidas, caducidad, privacidad y limitaciones. Los valores predeterminados, los clientes v3 existentes y la configuración de anclaje automático no cambian. Comienza con el recorrido para desarrolladores, luego integra el guardia local Node/TypeScript o el verificador Python. El módulo Node se distribuye como fuente del repositorio, no publicado en npm. La caducidad del lado del cliente o un desafío de vendedor cambiado no deshacen una tarifa de enrutamiento ya liquidada.

Los clientes envían PAYMENT-SIGNATURE v2 (base64 PaymentPayload) o X-PAYMENT v1. El eco de éxito/liquidación es PAYMENT-RESPONSE.

Reputación V1 y economía de rieles

Los componentes vienen primero. Una puntuación nunca se devuelve sin ellos.

ComponenteQué esQué no es
observedrecuento de sondas exitosas, n, días distintos, frescura, estabilidad de resultadostiempo de actividad, una insignia de salud
usagerecuentos de sondas 402signal_observed solamentereputación, liquidaciones (desconocido — sin libro mayor), pagadores únicos (omitido — sin identidades)
tenureprimera vez visto, días listadocalidad
stabilitycambios en payTo / precio / esquema / railuna garantía
source_countfuentes de catálogo independientespopularidad

Puntuación V1 (0–1, neutral entre cadenas, documentada en live402/reputation.py y en el registro sqlite scoring_models):

  • observed_performance 0.50 — la única señal similar a fiabilidad que medimos. La popularidad no puede dominar.
  • stability 0.20 — la rotación reciente de identidad/cotización es una señal de riesgo.
  • tenure 0.10 — la antigüedad ≠ calidad. Limitada logarítmicamente a 365 días.
  • usage 0.10 — recuentos de sondas limitados logarítmicamente (log1p(n)/log1p(100)). 0 sondas y uso desconocido se descartan para que 0 no parezca peor que desconocido. Las liquidaciones y los pagadores únicos nunca se inventan a partir de sondas.
  • distribution 0.10min(source_count, 3) / 3. No estar en el catálogo ≠ 0 fuentes.

Los componentes faltantes se descartan y reducen reputation_confidence. n_7d < 10 limita la confianza a 0.35. Sin porcentaje público de fiabilidad por debajo de n=10. Misma función en Base, Solana y Algorand. Sin algo_bonus.

Economía (mismas claves en cada rail, procedencia en cada campo):

  • 402signal_observed — lo medimos (precio del comerciante desde la opción 402 actual).
  • protocol_reference — una cifra oficial citada (inclusión L2 de Base ~2s; finalidad de bloque de Algorand 2.82s). La finalidad de reloj de pared de Solana es desconocida (sin ms oficiales actuales).
  • unknown — faltante. Las tarifas de cadena y de facilitador son desconocidas en USD (sin oráculo FX). lowest_total_cost / max_total_cost_usd fallan cerrados. fastest_settlement / max_settlement_latency_ms usan finalidad de liquidación o protocolo, nunca RTT de sonda.

Rails

RailpayToactivored (cuerpo 402)Facilitador verificar / liquidar
Base0xb18fc2275f36dae99eb215caeff03b431f887d16USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913base (el facilitador ve eip155:8453)https://api.cdp.coinbase.com/platform/v2/x402/verify y /settle
SolanaHCM423cyKYVUoq9GvmqUphZwYVB6M2wez34i9jzSewLymint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1vsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdphttps://facilitator.payai.network/verify y /settle
AlgorandN2JSJZCSORMYGYO2NSIYRUEMBFRHEOMYODVXV2MXYYHB5H2JVUGG6NJ4NQASA 31566704algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=https://facilitator.goplausible.xyz/verify y /settle

La autorización de enrutamiento es $0.003 USDC (3000 atómico, 6 decimales) en cada rail. Se liquida solo cuando se encuentra una ruta elegible válida y en vivo. Los fallos normales tipados devuelven HTTP 200 con live:false, payable:false, selected_payment:null y settlement_state:not_attempted. Los fallos operativos conservan HTTP 503. El pago del vendedor es separado. Bazaar se repite en la liquidación exitosa para que los catálogos puedan indexar. Inspecciona billing.settlement_state en cada HTTP 503: not_attempted es un fallo operativo no pagado (o un fallo antiguo en caché), settled puede ser un fallo de transparencia requerida después de una liquidación exitosa, y unknown significa que la liquidación pudo haber ocurrido y la autorización no debe reutilizarse.

Las llamadas CDP de Base necesitan CDP_API_KEY_ID + CDP_API_KEY_SECRET (o CDP_ACCESS_TOKEN). PayAI es de nivel gratuito sin clave; PAYAI_API_KEY opcional. GoPlausible no requiere autenticación. Nunca pongas una clave privada de billetera en env.

Env

VariablePredeterminadoSignificado
LIVE402_PORT8081puerto de enlace (local)
PORTno establecidopuerto Fly / Docker; si se establece, el host predeterminado es 0.0.0.0
LIVE402_HOST127.0.0.1 local / 0.0.0.0 cuando PORT está establecidohost de enlace
PAYTO_ADDRESSpayTo de Base arribapayTo de Base
PAYTO_SOLANApayTo de Solana arribapayTo de Solana
PAYTO_ALGORANDpayTo de Algorand arribapayTo de Algorand
CDP_API_KEY_ID / CDP_API_KEY_SECRETno establecidoJWT CDP para verificar/liquidar en Base
CDP_ACCESS_TOKENno establecidoBearer CDP pre-acuñado (opcional)
PAYAI_API_KEYno establecidoBearer PayAI opcional más allá del nivel gratuito
LOCAL_FREEno establecido1 omite el muro de pago (solo pruebas)
LIVE402_FIXTUREno establecido1 usa JSON local, sin red
LIVE402_PROBE_TIMEOUT4tiempo de espera de sonda en segundos
LIVE402_HISTORY_DB/data/live402-history.sqlite en Fly (respaldo /tmp)historial de sondas sqlite (WAL, 0600, limitado). Solo observed.
LIVE402_CATALOG_DB/data/catalog.sqlite en Fly (respaldo /tmp)catálogo sombra sqlite de reclamaciones CDP/PayAI/GoPlausible. Local al proceso en el volumen /data existente. No expuesto por HTTP (sin endpoint de volcado/descarga, no bajo static/, no en OpenAPI). Archivo separado del historial. FTS5. Nunca una lista RAM de 44k.
LIVE402_PQ_LOG_DB/data/pq-log-mainnet.sqlite en Fly (respaldo /tmp)registro C2SP de PRODUCCIÓN. Separado del catálogo, historial y del archivo TestNet /data/pq-log.sqlite (SOLO SOPORTE DE PRUEBAS). No expuesto por HTTP como volcado sqlite; la API de lectura es solo /pq/log/*. Reinicio vacío solo Ross: docs/runbooks/mainnet-prelaunch-reset.md.
LIVE402_PQ_LOG_EPOCHmainnet-v1 en fly.tomlPRODUCCIÓN requiere mainnet-v1. No establecido/desconocido falla cerrado. testnet-v1 es SOLO SOPORTE DE PRUEBAS.
LIVE402_PQ_LOG_ORIGIN402signal.com/pq/log/mainnet-v1 en fly.tomlorigen de PRODUCCIÓN. El origen TestNet es archivo/SOLO SOPORTE DE PRUEBAS.
LIVE402_PQ_LOG_VKEYno establecidoclave verificadora de registro Ed25519 de SOPORTE DE PRUEBAS (pública). Producción nunca la usa. Nunca una clave privada.
LIVE402_PQ_LOG_VKEY_MAINNETno establecidoclave verificadora de registro Ed25519 de PRODUCCIÓN (pública). Si se establece con LIVE402_PQ_LOG_SK_MAINNET, debe coincidir exactamente con la vkey C2SP derivada de esa SK (falla cerrado; env no se sobrescribe). Si SK está establecida y VKEY no, el arranque escribe la vkey derivada (ops puede preparar SK primero). Si SK no está establecida, no hay firmante MainNet. Nunca una clave privada.
LIVE402_PQ_LOG_SKno establecidosemilla Ed25519 de SOPORTE DE PRUEBAS solamente. Producción nunca la carga. Nunca la comprometas, nunca la pegues en el chat.
LIVE402_PQ_LOG_SK_MAINNETno establecidosemilla Ed25519 de PRODUCCIÓN solamente. El código rechaza el respaldo silencioso a LIVE402_PQ_LOG_SK. Instala vía stdin/archivo (NAME=-); nunca un argumento secreto de CLI. Nunca la establezcas desde este PR.
LIVE402_PQ_FALCON_ADDRESSno establecidodirección Falcon TestNet de SOPORTE DE PRUEBAS. No es un predeterminado de producción. Nunca una clave privada.
LIVE402_PQ_FALCON_NETWORKmainnet en fly.tomlPRODUCCIÓN requiere mainnet. No establecido/desconocido falla cerrado. testnet es SOLO SOPORTE DE PRUEBAS.
LIVE402_PQ_FALCON_BROADCASTno establecidoenv 402signal (enrutador) de SOPORTE DE PRUEBAS. 1 permite POST de un SignedTxn aprobado por el firmante a algod TestNet fijado. Producción nunca usa esto. Predeterminado no establecido: nunca POST. 402security debe dar el visto bueno antes de que alguien lo establezca a 1. El firmante nunca lee BROADCAST. Esta bandera nunca envía MainNet.
LIVE402_PQ_FALCON_MAINNET_BROADCASTno establecidobandera de capacidad MainNet distinta. Predeterminado apagado. Un POST también requiere exactamente un modo: automático o canario humano. No establecido detiene el envío MainNet mientras el enrutamiento continúa.
LIVE402_PQ_FALCON_MAINNET_CANARYno establecidocompuerta canario humano de un solo uso. Predeterminado apagado. Worker, tick y arranque nunca la leen. El POST en vivo aún necesita este =1 y LIVE402_PQ_FALCON_MAINNET_BROADCAST=1.
LIVE402_PQ_FALCON_MAINNET_AUTOno establecido1 exacto opta por el controlador automático duradero después de la revisión de despliegue. Predeterminado apagado. Nunca se establece junto con la bandera canario.
LIVE402_PQ_FALCON_MAINNET_AUTO_KILLno establecido1 exacto detiene la firma automática y el POST inmediatamente mientras el enrutamiento y el registro de transparencia continúan. Conserva todo el estado en vuelo.
LIVE402_PQ_FALCON_MAINNET_ADDRESSfly.toml (dirección pública MainNet)dirección pública MainNet Falcon f1 de PRODUCCIÓN. Distinta de la dirección TestNet archivada. Nunca una clave privada.
LIVE402_PQ_SIGNER_TOKENno establecidoHMAC de SOPORTE DE PRUEBAS para el cliente TestNet pq-anchor/1. Producción nunca llama a ese firmante.
LIVE402_PQ_SIGNER_MAINNET_TOKENno establecidoHMAC de solicitud/respuesta de PRODUCCIÓN para 402signal-pq-signer-mainnet (pq-anchor/3). Nombrado, nunca valorado en git.
LIVE402_PQ_LOGno establecido0 fuerza la transparencia unavailable incluso si un firmante está configurado.
LIVE402_HOT_REFRESH_S600 (limitado 300–900)umbral de reclamación obsoleta para la cola de actualización de valor de información
LIVE402_WARM_REFRESH_S7200 (limitado 3600–10800)intervalo de actualización WARM (helper due_warm heredado)
LIVE402_COLD_SWEEP_S64800 (limitado 12–24h)cadencia de barrido de generación rodante COLD
LIVE402_TRICKLE_SLEEP_S2 (limitado 1–30)sueño entre páginas de goteo
LIVE402_CATALOG_REFRESH10 desactiva el goteo de fondo
LIVE402_ROUTE_RPM12POST /route pagado por IP por minuto. Sin privilegio de User-Agent. CI usa explícitamente 60.
LIVE402_PREVIEW_RPM180 (o 2× ruta, lo que sea mayor)GET /preview no pagado y vista previa MCP por IP por minuto
LIVE402_PUBLIC_RPM180 (o 2× ruta, lo que sea mayor)GET /pulse, GET /rails y GET /attestation no pagados por IP por minuto (cubos separados)
LIVE402_VALIDATE_RPM60POST /validate / GET /validate no pagados y MCP tools/call validate por IP por minuto

Fly (no ejecutes hasta que tengas una cuenta)

Aplicación única 402signal. No HA. Sin segundo hostname.

fly launch --ha=false --name 402signal --no-deploy
fly secrets set CDP_API_KEY_ID=… CDP_API_KEY_SECRET=…
# After 402security GO only. An admin sets these; never paste values into chat. 402dev never holds them.
# fly secrets set LIVE402_PQ_LOG_SK_MAINNET=…
# fly secrets set LIVE402_PQ_SIGNER_MAINNET_TOKEN=…
fly deploy
fly ips list

fly.toml establece app = "402signal", internal_port = 8080, auto_stop_machines = "off", min_machines_running = 1 en el proceso HTTP de la aplicación (shared-cpu-1x 1GB). Un proceso de aplicación. No despliegues, fly scale ni establezcas secretos desde este PR. Producción es solo MainNet. LIVE402_PQ_FALCON_BROADCAST, LIVE402_PQ_SIGNER_TOKEN y LIVE402_PQ_LOG_SK permanecen no establecidos en el enrutador público. El anclaje automático no se activa por fly.toml; consulta docs/pq-automatic-anchoring.md para la opción revisada separada.

Namecheap BasicDNS (no cambies hasta el despliegue)

Mantén los servidores de nombres de Namecheap. Usa solo registros BasicDNS. No uses CNAME en el apex. Elimina primero los registros de parking / marketplace.

TipoHostValor
A@IPv4 compartido de Fly desde fly ips list
AAAA@IPv6 de Fly desde fly ips list
CNAMEwww402signal.fly.dev

Bazaar

El cuerpo 402 incluye extensions.bazaar con info + schema para POST /route, siguiendo x402 bazaar. Los clientes deben repetirlo; también lo adjuntamos al liquidar para que los facilitadores puedan indexar.

Diseño

live402/            package (server, route, probe, payment, facilitator, fixtures, shadow)
live402/shadow.py    on-disk catalog.sqlite (claims + FTS5). Not 402signal_observed.
live402/hydrate.py   finalist claimed-contract cache (bounded, TTL, gzip). Not 44k RAM schemas.
live402/policy.py    NL → structured constraints. Engine uses structured values only.
live402/reputation.py transparent components + documented V1 score + scoring-model hash.
live402/economics.py  rail economics with provenance. Same model for Base / Solana / Algorand.
live402/pq/         experimental C2SP log (RFC 9162 Merkle + tiles + receipts). PRODUCTION is MainNet-only.
live402/static/     GET / homepage (app.js, styles, dashboard.js)
live402/algod.py    pinned algod suggestedParams for the unpaid Algorand 402 extra
live402/data/       fixture catalog
tests/              unittest
Dockerfile          Python 3.12.14-slim (gh-150743), 0.0.0.0:$PORT, UID/GID 10001
fly.toml            app 402signal, internal_port 8080, one machine
docs/backup.md      sqlite backup tooling + Fly human checklist (backups not claimed active)
docs/github-protection.md  branch protection (Protect main ruleset is active)
docs/automation-security-boundaries.md  bot and human roles. production command bans
docs/docker.md      non-root runtime and required existing-volume migration
docs/merkle-bench.md  honest 10k/100k/1m frontier timings; SQLite commit is the bottleneck