402Signal

Verifica rotas x402 ativas na Base, Solana e Algorand antes de os agentes gastarem; $0,003 USDC é liquidado apenas para uma rota válida e ativa, com erros de digitação normais não liquidados e pagamento do vendedor separado.

Documentação

402Signal

O 402Signal verifica rotas x402 na Base, Solana e Algorand antes de gastar. US$ 0,003 somente quando uma rota válida e ativa é encontrada. Erros de digitação normais não são liquidados. O pagamento ao vendedor é separado. Seu agente mantém a carteira. As evidências de roteamento entram no log de confiança PQ na Algorand MainNet. O opcional require_route_binding=true adiciona um recibo v4 assinado para comparação no lado do comprador com os termos atuais do vendedor antes da assinatura. Guia: https://402signal.com/developers#route-binding A Falcon autoriza uma transação de checkpoint, não um pagamento de comerciante. Este não é um trilho de pagamento PQ e não é uma afirmação de que o produto é totalmente à prova quântica.

Datado de 2026-08-29. Verificação e liquidação em produção. Sem chaves privadas de pagamento. Nunca pagamos upstream.

Executar localmente

Python 3.12 (stdlib mais cryptography fixado para JWTs do Coinbase CDP e assinaturas de log Ed25519). O padrão local é 127.0.0.1:8081. Fly / Docker vinculam 0.0.0.0:$PORT (padrão 8080).

PYTHONPATH=. python3 -m live402

Em seguida, abra http://127.0.0.1:8081

POST /route não pago retorna HTTP 402. Loop do operador local (pule o paywall, ainda assim teste):

LOCAL_FREE=1 PYTHONPATH=. python3 -m live402

LOCAL_FREE=1 é somente para testes. A produção não deve defini-lo.

Offline / testes (sem rede, catálogo de fixtures):

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

Testes:

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

POST /route

Corpo:

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

`need` or `url` (or both) is required.
  • Sem pagamento válido e LOCAL_FREE não definido → HTTP 402. Um 402 lista três aceites (Base, Solana, Algorand) mais a extensão do bazar. Não fazemos sondagem.
  • Autorização válida: corresponda exatamente ao trilho anunciado, reserve sua impressão digital de repetição de forma durável, verifique com o facilitador correspondente, valide o corpo, depois descubra e sonde. Liquide somente após uma rota elegível válida e ativa passar pelo portão final de vencedor cobrável. Um cabeçalho não verificado nunca abre o portão.
  • Se url estiver definido: deve ser https. URLs públicas desconhecidas são somente porta 443; listagens conhecidas do catálogo podem usar a porta HTTPS já presente nessa listagem. Sondagem não paga é GET primeiro, depois POST {} somente quando GET é 405/501 E o catálogo declara explicitamente POST E não exige corpo de solicitação. Nunca POST {} após GET 200/400/401/403/404/500. Nunca POST corpos de entrada declarados pelo vendedor ou pelo catálogo. Se um corpo obrigatório significa que uma sondagem não paga válida não pode ser construída, o erro de digitação é unsafe_to_probe. DNS usa um pool de resolvedores limitado (getaddrinfo, 2s); a conexão TCP/TLS é fixada nesses IPs públicos verificados por SSRF com SNI TLS e Host HTTP definidos para o hostname original (reverificado e re-fixado em cada salto de redirecionamento). Falha fechada se pin/SNI/Host não puderem ser aplicados. Timeout de ~4s. A resposta inclui live, status, latency_ms, has_402_challenge, selected_payment, billing e um snapshot de health. US$ 0,003 somente quando uma rota válida e ativa é encontrada. Erros de digitação normais não são liquidados. O pagamento ao vendedor é separado.
  • Se apenas need: busca federada com escopo de necessidade (FTS local em catalog.sqlite + Coinbase / PayAI / GoPlausible) no momento da solicitação (CDP /discovery/search; busca PayAI / GoPlausible ou uma pequena busca nas primeiras páginas), união/dedupe/classificação desse conjunto de trabalho, hidrate apenas os ~5–10 finalistas principais com método/esquema/nomeDaFerramenta reivindicados (limitado, TTL, gzip opcional em disco; nunca um índice de esquema RAM de 44k), depois sonde adaptativamente (primeiros 3, expanda 2–4 se não houver vencedor; teto rígido de 20). Retorne a melhor opção ativa atualmente observada (não a primeira URL ativa, não um trilho somente de catálogo). Um vencedor HTTP 200 é um recurso mais a opção de pagamento exata observada que o fez vencer: selected_payment nunca é nulo, nunca copiado de uma reivindicação de catálogo, e quando networks está definido, seu network deve estar nesse bloqueio. Acessos ativos são upsertados write-through no disco. Reivindicações de catálogo permanecem em claimed.payment_options e catalog.sqlite accept_claims; target.accepts e seleção usam apenas o envelope HTTP 402 atual. Esquemas reivindicados não são opções de pagamento observadas. Um erro de digitação normal concluído → HTTP 200 com live:false, payable:false, selected_payment:null, billing.settlement_attempted=false e billing.settled=false; a autorização verificada torna-se um resultado de repetição not_settled terminal durável. Restrições estruturadas opcionais são campos de solicitação de nível superior: max_price_usd, max_total_cost_usd (comerciante + taxas conhecidas; taxa desconhecida falha fechada), max_probe_latency_ms, max_service_latency_ms (p50 histórico, não RTT de sondagem), max_settlement_latency_ms (liquidação/finalidade, não RTT de sondagem), require_invocable, networks (bloqueio de política rígido), min_observations, min_observed_success, min_reputation_score, min_reputation_confidence. Um objeto constraints aninhado é rejeitado em vez de silenciosamente ignorado. prefer_network é apenas uma preferência fraca de classificação; não se torna um filtro. max_latency_ms é um alias de RTT de sondagem. Valores medidos desconhecidos falham fechados. objective opcional: best / cheapest / fastest / most_reliable / lowest_total_cost / fastest_settlement. cheapest, fastest e most_reliable classificam os candidatos elegíveis atualmente sondados, não todos os endpoints descobertos. fastest é o RTT de sondagem desta solicitação, não a latência de liquidação (fastest_settlement permanece separado). policy opcional / fraseado de necessidade como weather under $0.01 and 300ms compila para restrições estruturadas; "uso estabelecido" / "evidência observada forte" compila para min_observations=10; "alta reputação" vaga permanece não resolvida; linguagem de liquidação / custo total compila somente com um limite numérico. O mecanismo usa apenas valores estruturados. interpreted_constraints / applied_constraints ecoam restrições realmente usadas. Vencedores /route liquidados e /preview não pagos incluem componentes reputation transparentes (observado / uso / tempo de permanência / estabilidade / contagem_de_fontes) mais V1 reputation_score, reputation_confidence e scoring_model_id / scoring_model_hash. Erros de digitação gratuitos permanecem provisórios e não promovem histórico confiável. economics do trilho (preço do comerciante, taxas, liquidação/finalidade) fica na opção de pagamento selecionada e em compared[], cada campo rotulado 402signal_observed, protocol_reference ou unknown. Mesmo modelo na Base, Solana e Algorand (sem bônus de algoritmo). Catálogo não é um selo de 0–100. Pulse permanece factual; taxas permanecem ocultas abaixo de n=10. Endereços de pagadores únicos nunca são listados. A maioria dos campos de uso/liquidação/pagadores únicos é desconhecida no primeiro lançamento porque o 402Signal tem histórico de sondagem, não um livro de liquidação.
  • Upstream morto é 503 com o snapshot, nunca uma URL ativa falsa.
  • LIVE402_FIXTURE=1 usa live402/data/fixtures.json. Sem rede.
  • HTTP 200 liquidado inclui target: { method, inputSchema, outputSchema, accepts, facilitator, amountAtomic, displayAmount, timeoutSeconds } (somente aceites de envelope), selected_payment: { rail, network, asset, amount_atomic, display_amount, normalized_usd, payTo, facilitator } e billing: { model, condition, asset, amount_atomic, display_amount, rail, settlement_attempted, settled, settlement_state }. selected_payment deve corresponder exatamente a uma opção válida do envelope atual. payable requer uma opção observada completa; invocable é pagável mais esquema de entrada. Se o esquema estiver ausente, live ainda pode ser verdadeiro com invocable: false e miss_reason: "no_input_schema". accepts[].extra.facilitator é copiado como {url, feePayer, caip2, scheme} — não use o padrão x402.org.
  • miss_reason é um enum fechado: 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 sem payTo utilizável é no_payto (erro de digitação, não retry-pay). Orçamento de sondagem abaixo de 60s; um travamento retorna 503 JSON imediatamente. stop_reason e probe_ceiling dizem por que a sondagem parou.
  • GET /health é HTTP 200 { "ok": true } para verificações do Fly. Não é uma listagem paga. Não é um despejo de trilhos.
  • GET /ready verifica acesso a catálogo/histórico/log e consistência de log, mais uma sondagem real de escrita no livro de repetição, modo de diário durável e capacidade de admissão de armazenamento. A resposta é somente booleanos (sem caminhos, sem segredos). As verificações de catálogo/histórico/log não simulam escritas de disco cheio. A saúde do Fly permanece em /health até que /ready seja comprovadamente seguro em staging.
  • GET /preview?need= é uma busca de catálogo não paga no momento da solicitação (not_probed: true, acessos + preços + frescor + facilitador/método/inputSchema_presente/trilhos_ativos, also_on[] opcional). prefer_network=base|solana|algorand opcional é uma preferência fraca de classificação: classifica esse trilho primeiro, mas ainda busca todos os três. networks=solana opcional (repetido ou separado por vírgula) é um bloqueio de política rígido sobre quais trilhos são consultados. discovery_via é um mapa compacto de como-encontrado por trilho; discovery_exhaustive é verdadeiro somente quando o conjunto retornado é conhecido como completo. Não sonda e não cobra. POST /route pago permanece a sondagem 402 com falha fechada.
  • GET /rails lista as três redes de pagamento, ativo, amountAtomic, facilitadores, feePayers, maxTimeoutSeconds e up+latência por trilho. Em cache. Não enfiado em /health.
  • GET /pulse é um snapshot JSON. Totais de catálogo permanecem não publicados. Descoberta usa catálogos upstream atuais mais uma sombra local de processo (não um índice RAM de mundo inteiro). index_status é upstream-live, shadow-warm, both ou fixture. n_7d observado vem de 402signal_observed. Taxas (success_7d, payable_rate_7d, invocable_rate_7d) são omitidas abaixo de n=10. Não há healthy binário e nenhum executable_now_rate. Parâmetros de consulta são ignorados — sem URLs fornecidas pelo chamador. Cache de ~15s. Fail-open: nunca espera por um rastreamento de descoberta. O atualizador gotejante nunca bloqueia /route.

Rótulos de capacidade

Capacidades são dicas de descoberta conservadoras baseadas em regras, não garantias de qualidade de saída ou intercambialidade. market.price cobre cotações, preços e dados OHLCV; market.analysis cobre análise financeira como regime de mercado, amplitude setorial, liderança, indicadores técnicos e retornos probabilísticos. Palavras amplas como "análise", "sinal" e "liderança" precisam de contexto financeiro na mesma fonte de evidência; "mercado" ou "negociação" sozinhos não implicam mais preços. RSI/MACD são termos distintivos de indicadores; OHLC/OHLCV fornecem contexto financeiro. Análise financeira específica resolve sobreposição de preço/previsão; conflitos de categoria não relacionados permanecem ambíguos. A prioridade de evidência existente permanece tags, nome da ferramenta, descrição, nome do serviço, depois uma URL distintiva.

Coloque o trabalho específico em need (por exemplo, "regime de mercado de ações" ou "liderança de amplitude setorial"). "Inteligência de mercado" é um sinônimo de busca para "análise de mercado", não uma segunda capacidade. Contagens e limites de solicitações de busca permanecem inalterados. Pulse mantém o tema amplo market para ambos. Classification versions vivem com rótulos armazenados. Registros mais antigos são reclassificados na leitura para ranqueamento e reindexados em lotes de no máximo 100 no worker de gotejamento em segundo plano existente. Isso altera apenas rótulos derivados e seu índice de busca: timestamps de reivindicação/verificação, reivindicações de pagamento, gerações de fonte, histórico e eventos de reivindicação são preservados. Nenhuma reconstrução completa do catálogo no reinício é necessária. Até que o backfill seja concluído, buscas que dependem apenas do texto indexado do novo recurso podem perder registros mais antigos tanto em /preview quanto em /route; a classificação na leitura corrige candidatos retornados, não a cobertura de recuperação. Texto descritivo need ainda busca descrições de endpoints retidos. O backlog progride apenas enquanto o worker de gotejamento está habilitado e o armazenamento é gravável. Falhas de reclassificação emitem catalog_reclassification_failed no máximo uma vez por minuto e deixam a atualização comum de reivindicações em execução. Nenhum conteúdo de exceção ou metadados de vendedor é registrado. Nomes de ferramentas anteriormente não retidos não podem ser recuperados por reclassificação; a atualização upstream comum fornece essa evidência. Novos registros enxutos retêm nomes de ferramentas limitados. Mudanças futuras de taxonomia devem incrementar CAPABILITY_VERSION e testar tanto exemplos positivos quanto intenções vizinhas/ambíguas, incluindo atualizações de catálogo persistidas.

Fila de atualização do catálogo sombra

O gotejamento em segundo plano é uma etapa limitada por vez (algumas URLs obsoletas, ou uma página COLD). Ele não reconstrói um catálogo RAM de 44k e não adiciona fanout de rede além dos orçamentos existentes de descoberta/probe.

Prioridade (primeira razão correspondente vence; depois last_fetched / URL). Mesma ordem em live402/shadow.py REFRESH_REASONS:

  1. recent_search — pesquisado na última hora, reivindicação mais antiga que LIVE402_HOT_REFRESH_S
  2. recent_route — roteado na última hora, reivindicação obsoleta
  3. source_disagreement — dois catálogos discordam sobre valor ou payTo para o mesmo trilho
  4. price_change — evento de reivindicação price_changed recente
  5. payto_change — evento de reivindicação payTo_changed recente
  6. schema_change — evento de reivindicação schema_changed recente
  7. failed_probe — último probe independente não estava ao vivo
  8. stale_observation — nunca verificado, ou última verificação mais antiga que um dia
  9. high_demand_capability — capacidade com pelo menos duas listagens pesquisadas recentemente

Se a fila estiver vazia, o atualizador pega uma página de geração COLD.

  • GET /dashboard são as mesmas amostras que HTML. Consultas por chain que você pode tentar; clique para pré-preencher o formulário da página inicial. Também gratuito.
  • GET / página inicial é em inglês simples: uma linha sobre o que /route é, humanos apontados para GET /preview gratuito, agentes para POST / MCP. Rodapé é 402signal.com / @402Signal. Suporte oculto de autorização Base (somente carteira injetada) assina uma autorização EIP-3009 de $0,003 e POSTa PAYMENT-SIGNATURE; é liquidado apenas para uma rota elegível válida e ao vivo. Algorand e Solana permanecem agente/CLI. Uma pequena caixa "para agentes" mostra POST https://402signal.com/route além de links para /llms.txt, /preview, /rails, /openapi.json, /.well-known/x402.json e /mcp.json. Navegação é Home / Pulse (GET /pulse); sem /dashboard na navegação da página inicial.
  • GET /route é dividido por Accept: navegadores (text/html) recebem a página humana (HTTP 200). Agentes (application/json) e curl sem Accept recebem HTTP 402 + bazaar + accepts (valor 3000). Agentes que pretendem autorizar devem POSTAR, não GET.
  • Descoberta: 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. POST /route pago é documentado com x-payment-info e HTTP 402. Tipo de bazaar MCP é mcp + toolName: route.
  • POST /validate (também GET /validate?url=) é um probe de vendedor não pago: este endpoint está pronto para agente? Apenas URLs já no catálogo ou fixture são sondadas (sem fetch público arbitrário). Mesmo helper não pago que /route: GET primeiro, POST {} justificado apenas, nunca um corpo declarado no catálogo, IP-pin DNS, SSRF fail-closed. Não grava 402signal_observed. Não é um bypass de pagamento /route. Retorna prontidão, reivindicado vs observado, flags. Nunca um flag binário healthy.
  • GET /attestation é um sha256 público de JSON canônico de um lote de probe 402signal_observed recente (batch_id, created_at, n, algo, hash). Não on-chain. Sem assinaturas ou chaves. ?batch_id= opcional.
  • GET /pq/log/checkpoint e GET /pq/log/tile/* são um log de transparência C2SP experimental (tlog-checkpoint@v1.0.0 + tlog-tiles@v0.1.0). Identidade de produção é somente MainNet: origem 402signal.com/pq/log/mainnet-v1, época mainnet-v1, DB /data/pq-log-mainnet.sqlite, LIVE402_PQ_FALCON_NETWORK=mainnet, pq-anchor/3, endereço Falcon MainNet e respostas autenticadas do signatário MainNet. Rede não definida ou desconhecida falha fechada. Não há fallback PQ TestNet ao vivo. Constantes TestNet, LIVE402_PQ_LOG_SK, LIVE402_PQ_SIGNER_TOKEN, LIVE402_PQ_FALCON_BROADCAST, LIVE402_PQ_FALCON_ADDRESS, /data/pq-log.sqlite e pq-anchor/1 permanecem apenas SUPORTE DE TESTE (testes e arquivo). Ancoragem automática MainNet é opt-in exato e desligada por padrão; seu controlador durável está fora do caminho de solicitação de rota. Persistência AUTHORIZED de produção requer um HMAC de resposta verificado sobre os bytes exatos de SignedTxn seguido por validação semântica estrita; bytes fornecidos pelo chamador não podem alcançar a persistência. Evidência confirmada existente permanece legível. AUTHORIZED / SEND_ATTEMPTED / SUBMITTED nunca são renderizados como CONFIRMED. Links de explorador seguem rede/genesis registrados independentemente. Evidência MainNet nunca usa URLs TestNet. A SK Falcon nunca deve viver em 402signal. O signatário isolado nunca lê BROADCAST e nunca POSTa. last_confirmed é persistido apenas após um fetch+decode+verify independente. Sucesso de assinatura ou POST não é confirmação. POST /route liquidado não espera inclusão na chain. Falcon autoriza uma transação de checkpoint, não um pagamento de comerciante. Um vencedor liquidado pode incluir pq_trust.transparency {status: pending|logged_uncheckpointed|unavailable, state, log_origin, index, checkpoint_size, receipt, reveal} opcional. Um erro gratuito não anexa folha de decisão de rota e não pode acionar uma âncora apenas para essa solicitação. Liquidação e anexação de log não são atômicas (SEC-ROUTER-004 / A-14): um vencedor liquidado não requer uma folha assinada durável a menos que require_transparency ou require_route_binding seja verdadeiro. Se a transparência necessária falhar após a liquidação, a resposta permanece verdadeira de que a liquidação ocorreu e nenhuma segunda liquidação é tentada. pending significa uma folha durável mais um checkpoint assinado (estado checkpoint_signed). logged_uncheckpointed significa que a folha é durável sem um checkpoint assinado e nunca é sucesso quando require_transparency é verdadeiro. unavailable significa que um recibo assinado não pôde ser produzido; uma anexação pode já ter ocorrido. Não é pendente ou confirmado. Nunca diga assinado se não há checkpoint. Recibos de rota padrão usam 402signal.route_decision.v3: a folha pública é tipo, ts arredondado por minuto, nonce e apenas compromisso sha256. Folhas históricas v1 e v2 permanecem verificáveis com sua semântica original. Uma folha pública não é uma reivindicação de tráfego anônimo ou não vinculável. O reveal do cliente detém evidência privada, salt, compromisso esperado e versão de evento. verify_route_receipt() verifica versão de evento, reveal, compromisso, leaf_hash, inclusão e o checkpoint Ed25519. receipt.leaf_hash está presente para que verify_receipt() ainda possa fazer round-trip. payment_authorization.pq_native é sempre falso. Sem página /trust. O cartão PQ da página inicial renderiza apenas quando last_confirmed tem um txid confirmado real. Assinatura Ed25519 de produção usa apenas LIVE402_PQ_LOG_SK_MAINNET (nunca embutido no git; nunca gerado automaticamente na inicialização; nunca cai para LIVE402_PQ_LOG_SK). Veja docs/pq-automatic-anchoring.md.
  • POST /route é limitado por taxa em memória (~12/min por IP por padrão; configurável pelo operador). User-Agent não concede cota extra. No Fly, a chave do limitador é Fly-Client-IP; caso contrário, o peer do socket. X-Forwarded-For não é confiável. Mapas de limite de taxa e semáforos de probe por host são limitados por TTL/LRU. GET /preview e MCP tools/call preview não pago compartilham um limitador mais flexível (~180/min por IP, pelo menos 2× o teto de rota). GET /pulse e GET /rails cada um tem seu próprio limitador ~180/min por IP (mesma ordem de grandeza que preview, ainda mais flexível que /route pago). GET /health permanece ilimitado {ok:true}. 429 quando excedido. Logs de solicitação de produção são id de solicitação, método, caminho apenas, status, latência e um endpoint grosseiro. Strings de consulta, need, policy, busca /preview, URL alvo /validate, JSON de solicitação, PAYMENT-SIGNATURE, X-PAYMENT, payloads de pagamento e corpos de resposta de vendedor não são registrados. Logs de liquidação são resultado grosseiro de sucesso/pulado mais trilho e id de solicitação, não txids completos. Respostas enviam X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: no-referrer, Strict-Transport-Security: max-age=31536000 (sem includeSubDomains; www é um CNAME e Fly não tem hostnames extras) e 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' (sem CDN, sem scripts de carteira de fornecedor). connect-src é apenas 'self'; POSTs de pagamento Base da página inicial /route. HEAD 200 em /llms.txt /openapi.json /mcp.json /preview /rails /pulse. Recurso de pagamento / OpenAPI servers / recurso MCP são fixados em https://402signal.com (Host não é refletido). DNS de probe usa um pool getaddrinfo limitado (2s); a conexão TCP/TLS é fixada nesses IPs públicos verificados por SSRF com SNI TLS e Host HTTP definidos para o hostname original (re-fixado em redirecionamentos). Corpos de catálogo declarados pelo vendedor nunca são POSTados; POST {} injustificado é pulado; erros de corpo obrigatório são unsafe_to_probe. /route pago usa um prazo de timeout anunciado para verificação, probe e liquidação opcional.

Clientes PQ Trust que precisam de verificação posterior devem reter com segurança a resposta completa de /route pago, incluindo compared[]; no mínimo, mantenha pq_trust.transparency.receipt e pq_trust.transparency.reveal juntos. Resultados de replay privados podem reter o reveal; eles não são um serviço de recuperação. Mantenha sua própria cópia. Evidência modificada falha na verificação contra o log público. Como o reveal contém evidência privada de solicitação e decisão, ele não deve ser escrito em logs públicos.

Rotas opt-in com prova: envie require_route_binding: true para exigir um recibo assinado v4 vinculando a URL real do vendedor observada, método, hash do corpo da solicitação, envelope x402 atual completo e janela curta de frescor. Isso também exige transparência. Erros normais tipados permanecem gratuitos; um recibo obrigatório indisponível após a liquidação ainda relata billing.settled=true. Chaves do comprador, validação de transação, assinatura e execução permanecem com o comprador. O recibo imediato usa a chave de log Ed25519 fixada; confirmação cumulativa Falcon posterior é separada. Veja o contrato v1 e verificador para formas de solicitação suportadas, expiração, privacidade e limitações. Padrões, clientes v3 existentes e configurações de âncora automática permanecem inalterados. Comece com o passo a passo para desenvolvedores, depois integre o guarda local Node/TypeScript ou o verificador Python. O módulo Node é distribuído como fonte de repositório, não publicado no npm. Expiração no lado do cliente ou um desafio de vendedor alterado não desfaz uma taxa de roteamento já liquidada.

Clientes enviam PAYMENT-SIGNATURE v2 (base64 PaymentPayload) ou X-PAYMENT v1. Eco de sucesso/liquidação é PAYMENT-RESPONSE.

Reputação V1 e economia de trilhos

Componentes vêm primeiro. Uma pontuação nunca é retornada sem eles.

ComponenteO que éO que não é
observedcontagem de sucesso de sondas, n, dias distintos, frescor, estabilidade do resultadouptime, um selo de saúde
usagecontagens de sonda 402signal_observed apenasreputação, liquidações (desconhecido — sem livro-razão), pagadores únicos (omitido — sem identidades)
tenureprimeira vez visto, dias listadosqualidade
stabilitymudanças em payTo / preço / schema / railuma garantia
source_countfontes de catálogo independentespopularidade

Pontuação V1 (0–1, neutra em relação à rede, documentada em live402/reputation.py e no log sqlite scoring_models):

  • observed_performance 0.50 — o único sinal semelhante a confiabilidade que medimos. Popularidade não pode dominar.
  • stability 0.20 — churn recente de identidade/cotação é um sinal de risco.
  • tenure 0.10 — idade ≠ qualidade. Limitado por log em 365 dias.
  • usage 0.10 — contagens de sonda limitadas por log (log1p(n)/log1p(100)). 0 sondas e uso desconhecido são ambos descartados para que 0 não pareça pior que desconhecido. Liquidações e pagadores únicos nunca são fabricados a partir de sondas.
  • distribution 0.10min(source_count, 3) / 3. Não estar no catálogo ≠ 0 fontes.

Componentes ausentes são descartados e reduzem reputation_confidence. n_7d < 10 limita a confiança a 0.35. Sem porcentagem pública de confiabilidade abaixo de n=10. Mesma função em Base, Solana e Algorand. Sem algo_bonus.

Economia (mesmas chaves em cada rail, proveniência em cada campo):

  • 402signal_observed — nós medimos (preço do comerciante a partir da opção 402 atual).
  • protocol_reference — um valor oficial citado (inclusão L2 da Base ~2s; finalidade de bloco da Algorand 2.82s). A finalidade de relógio de parede da Solana é desconhecida (sem ms oficial atual).
  • unknown — ausente. Taxas de rede e taxas de facilitador são desconhecidas em USD (sem oráculo de câmbio). lowest_total_cost / max_total_cost_usd falham fechados. fastest_settlement / max_settlement_latency_ms usam finalidade de liquidação ou protocolo, nunca RTT de sonda.

Rails

RailpayToativorede (corpo 402)Facilitador verifica / liquida
Base0xb18fc2275f36dae99eb215caeff03b431f887d16USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913base (facilitador vê eip155:8453)https://api.cdp.coinbase.com/platform/v2/x402/verify e /settle
SolanaHCM423cyKYVUoq9GvmqUphZwYVB6M2wez34i9jzSewLymint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1vsolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdphttps://facilitator.payai.network/verify e /settle
AlgorandN2JSJZCSORMYGYO2NSIYRUEMBFRHEOMYODVXV2MXYYHB5H2JVUGG6NJ4NQASA 31566704algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=https://facilitator.goplausible.xyz/verify e /settle

A autorização de roteamento é $0.003 USDC (3000 atômico, 6 decimais) em cada rail. Ela liquida apenas quando uma rota elegível válida e ativa é encontrada. Erros normais de tipo retornam HTTP 200 com live:false, payable:false, selected_payment:null e settlement_state:not_attempted. Falhas operacionais mantêm HTTP 503. O pagamento do vendedor é separado. O Bazaar é ecoado na liquidação bem-sucedida para que catálogos possam indexar. Inspecione billing.settlement_state em cada HTTP 503: not_attempted é uma falha operacional não paga (ou um erro legado em cache), settled pode ser uma falha de transparência obrigatória após liquidação bem-sucedida, e unknown significa que a liquidação pode ter ocorrido e a autorização não deve ser reutilizada.

Chamadas CDP da Base precisam de CDP_API_KEY_ID + CDP_API_KEY_SECRET (ou CDP_ACCESS_TOKEN). PayAI é nível gratuito sem chave; PAYAI_API_KEY opcional. GoPlausible não precisa de autenticação. Nunca coloque uma chave privada de carteira em env.

Env

VariávelPadrãoSignificado
LIVE402_PORT8081porta de bind (local)
PORTnão definidoporta Fly / Docker; se definido, host padrão é 0.0.0.0
LIVE402_HOST127.0.0.1 local / 0.0.0.0 quando PORT está definidohost de bind
PAYTO_ADDRESSpayTo da Base acimapayTo da Base
PAYTO_SOLANApayTo da Solana acimapayTo da Solana
PAYTO_ALGORANDpayTo da Algorand acimapayTo da Algorand
CDP_API_KEY_ID / CDP_API_KEY_SECRETnão definidoJWT CDP para verificar/liquidar na Base
CDP_ACCESS_TOKENnão definidoBearer CDP pré-cunhado (opcional)
PAYAI_API_KEYnão definidoBearer PayAI opcional além do nível gratuito
LOCAL_FREEnão definido1 ignora o paywall (apenas testes)
LIVE402_FIXTUREnão definido1 usa JSON local, sem rede
LIVE402_PROBE_TIMEOUT4tempo limite de sonda em segundos
LIVE402_HISTORY_DB/data/live402-history.sqlite no Fly (fallback /tmp)histórico de sondas sqlite (WAL, 0600, limitado). Apenas observed.
LIVE402_CATALOG_DB/data/catalog.sqlite no Fly (fallback /tmp)catálogo sombra sqlite de alegações CDP/PayAI/GoPlausible. Local ao processo no volume /data existente. Não exposto via HTTP (sem endpoint de dump/download, não sob static/, não no OpenAPI). Arquivo separado do histórico. FTS5. Nunca uma lista RAM de 44k.
LIVE402_PQ_LOG_DB/data/pq-log-mainnet.sqlite no Fly (fallback /tmp)log C2SP de PRODUÇÃO. Separado do catálogo, histórico e do arquivo TestNet /data/pq-log.sqlite (apenas SUPORTE DE TESTE). Não exposto via HTTP como dump sqlite; API de leitura é apenas /pq/log/*. Reset vazio apenas Ross: docs/runbooks/mainnet-prelaunch-reset.md.
LIVE402_PQ_LOG_EPOCHmainnet-v1 no fly.tomlPRODUÇÃO requer mainnet-v1. Não definido/desconhecido falha fechado. testnet-v1 é apenas SUPORTE DE TESTE.
LIVE402_PQ_LOG_ORIGIN402signal.com/pq/log/mainnet-v1 no fly.tomlorigem de PRODUÇÃO. Origem TestNet é apenas arquivo/SUPORTE DE TESTE.
LIVE402_PQ_LOG_VKEYnão definidochave verificadora de log Ed25519 de SUPORTE DE TESTE (pública). Produção nunca usa isso. Nunca uma chave privada.
LIVE402_PQ_LOG_VKEY_MAINNETnão definidochave verificadora de log Ed25519 de PRODUÇÃO (pública). Se definido com LIVE402_PQ_LOG_SK_MAINNET, deve corresponder exatamente à vkey C2SP derivada dessa SK (falha fechada; env não é sobrescrito). Se SK está definido e VKEY não está, o boot escreve a vkey derivada (ops podem preparar SK primeiro). Se SK não está definido, não há assinante MainNet. Nunca uma chave privada.
LIVE402_PQ_LOG_SKnão definidoapenas seed Ed25519 de SUPORTE DE TESTE. Produção nunca carrega isso. Nunca commite, nunca cole em chat.
LIVE402_PQ_LOG_SK_MAINNETnão definidoapenas seed Ed25519 de PRODUÇÃO. Código rejeita fallback silencioso para LIVE402_PQ_LOG_SK. Instale via stdin/arquivo (NAME=-); nunca um argumento secreto de CLI. Nunca defina a partir deste PR.
LIVE402_PQ_FALCON_ADDRESSnão definidoendereço Falcon TestNet de SUPORTE DE TESTE. Não é um padrão de produção. Nunca uma chave privada.
LIVE402_PQ_FALCON_NETWORKmainnet no fly.tomlPRODUÇÃO requer mainnet. Não definido/desconhecido falha fechado. testnet é apenas SUPORTE DE TESTE.
LIVE402_PQ_FALCON_BROADCASTnão definidoenv 402signal (roteador) de SUPORTE DE TESTE. 1 permite POST de SignedTxn aprovado pelo assinante para algod TestNet fixado. Produção nunca usa isso. Padrão não definido: nunca POST. 402security deve dar GO antes que alguém defina para 1. Assinante nunca lê BROADCAST. Esta flag nunca envia MainNet.
LIVE402_PQ_FALCON_MAINNET_BROADCASTnão definidoflag de capacidade MainNet distinta. Padrão desligado. Um POST também requer exatamente um modo: automático ou canário humano. Não definido interrompe o envio MainNet enquanto o roteamento continua.
LIVE402_PQ_FALCON_MAINNET_CANARYnão definidoportão canário humano de uso único. Padrão desligado. Worker, tick e boot nunca leem isso. POST ao vivo ainda precisa deste =1 e LIVE402_PQ_FALCON_MAINNET_BROADCAST=1.
LIVE402_PQ_FALCON_MAINNET_AUTOnão definido1 exato opta pelo controlador automático durável após revisão de deploy. Padrão desligado. Nunca defina junto com a flag canário.
LIVE402_PQ_FALCON_MAINNET_AUTO_KILLnão definido1 exato interrompe assinatura automática e POST imediatamente enquanto roteamento e log de transparência continuam. Preserve todo o estado em andamento.
LIVE402_PQ_FALCON_MAINNET_ADDRESSfly.toml (endereço público MainNet)endereço público MainNet Falcon f1 de PRODUÇÃO. Distinto do endereço TestNet arquivado. Nunca uma chave privada.
LIVE402_PQ_SIGNER_TOKENnão definidoHMAC de SUPORTE DE TESTE para o cliente TestNet pq-anchor/1. Produção nunca chama esse assinante.
LIVE402_PQ_SIGNER_MAINNET_TOKENnão definidoHMAC de requisição/resposta de PRODUÇÃO para 402signal-pq-signer-mainnet (pq-anchor/3). Nomeado, nunca valorizado no git.
LIVE402_PQ_LOGnão definido0 força transparência unavailable mesmo se um assinante estiver configurado.
LIVE402_HOT_REFRESH_S600 (limitado 300–900)limite de alegação obsoleta para a fila de atualização de valor de informação
LIVE402_WARM_REFRESH_S7200 (limitado 3600–10800)intervalo de atualização WARM (helper legado due_warm)
LIVE402_COLD_SWEEP_S64800 (limitado 12–24h)cadência de varredura de geração contínua COLD
LIVE402_TRICKLE_SLEEP_S2 (limitado 1–30)sono entre páginas de gotejamento
LIVE402_CATALOG_REFRESH10 desativa o gotejamento em segundo plano
LIVE402_ROUTE_RPM12POST /route pago por IP por minuto. Sem privilégio de User-Agent. CI usa explicitamente 60.
LIVE402_PREVIEW_RPM180 (ou 2× rota, o que for maior)GET /preview não pago e pré-visualização MCP por IP por minuto
LIVE402_PUBLIC_RPM180 (ou 2× rota, o que for maior)GET /pulse, GET /rails e GET /attestation não pagos por IP por minuto (buckets separados)
LIVE402_VALIDATE_RPM60POST /validate / GET /validate não pagos e MCP tools/call validate por IP por minuto

Fly (não execute até ter uma conta)

Aplicativo único 402signal. Não é HA. Sem 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 define app = "402signal", internal_port = 8080, auto_stop_machines = "off", min_machines_running = 1 no processo HTTP do app (shared-cpu-1x 1GB). Um processo de aplicativo. Não faça deploy, fly scale ou defina segredos a partir deste PR. Produção é apenas MainNet. LIVE402_PQ_FALCON_BROADCAST, LIVE402_PQ_SIGNER_TOKEN e LIVE402_PQ_LOG_SK permanecem não definidos no roteador público. Ancoragem automática não é ativada por fly.toml; veja docs/pq-automatic-anchoring.md para o opt-in revisado separado.

Namecheap BasicDNS (não mude até o deploy)

Mantenha os nameservers da Namecheap. Use apenas registros BasicDNS. Não use CNAME no apex. Exclua registros de parking / marketplace primeiro.

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

Bazaar

O corpo 402 inclui extensions.bazaar com info + schema para POST /route, seguindo x402 bazaar. Clientes devem ecoá-lo; também o anexamos na liquidação para que facilitadores possam indexar.

Layout

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