{"criteria_id":"payability/v1","criteria_revision":"1.0.0","family":"payability","op":"check","ops_not_offered":[],"corpus":{"id":"dialect-corpus/v1","sha256":"9c3d10dc0dcd8fac4fea0cdd9294066f250eb50d1d7f305216a4bee3e1ed48b2"},"corpus_pin_definition":"The corpus pin is the SHA-256 of the corpus's canonical serialization (the corpus object excluding its sha256 field), computed and verifiable by the published harness (harness.mjs). Expected outputs inside corpus cases are derived from the criteria text by an independent implementation in gen-corpus.mjs (never the engine's code path), and each case labels its provenance (constructed from on-disk fleet records vs synthetic).","price":{"usdc_units_per_call":10000,"label":"$0.01","basis":"per endpoint"},"free_tier":{"per_day":100,"min_interval_ms":5000,"on_exhaustion":"402"},"input_contract":{"body":"One JSON request body in one of two modes. Probe mode: { mode: 'probe', url, caller? (free pre-check only) }. Submitted mode: { mode: 'submitted', artefact: { status?, body_obj? | body_raw?, header_obj? | payment_required_header?, payload_obj?, payload_headers?, response_headers? }, caller? (free pre-check only) }.","caps":{"body_bytes":262144},"over_cap":"A request body over 262,144 bytes is a free pre-gate refusal naming the cap.","validation":"Validation runs FREE, before any payment, in both modes: probe URLs must parse, use http/https, and carry no credentials; submitted artefacts must be one JSON object carrying at least one of a challenge body, a PAYMENT-REQUIRED header, or a payment payload. Malformed input fails free and never consumes a payment. A probe-mode fetch runs only after payment verification."},"target_safety":"Target-URL policy for probe mode (phase-1 SSRF discipline): the submitted URL must use http or https; must carry no embedded credentials (no userinfo); and is fetched once with a 5-second timeout, a response-body cap of 65,536 bytes, and redirects NOT followed (policy: no redirect is followed to any host, same host included, in phase 1 — a redirect response is graded as received and maps to the not-a-402 report state unless it is itself a 402). Malformed URLs and policy violations are free refusals before any payment. An unreachable endpoint, a timeout, or an over-cap body maps to a named report state (dialect summary not-a-402, indeterminable axes UNDETERMINED), never an error or a crash. Submitted mode performs no fetch at all.","target_fetch":{"timeout_ms":5000,"body_cap_bytes":65536,"redirects":"not followed to any host (phase 1 policy)","method":"GET","auth":"none — exactly as an unauthenticated stranger"},"axes_rule":"Dialect axes (Friction 09's five, plus receipt headers), each reported per axis and never guessed: (1) challenge_carrier — v1-body when only the 402 body leg carries a parseable challenge with a non-empty accepts array, v2-header when only the PAYMENT-REQUIRED header leg does, both when both legs carry one, none when a 402 carries neither, UNDETERMINED when the capture cannot be inspected (fetch failure or over-cap body). (2) client_header_names — the client payment header names the artefact explicitly evidences: names appearing in a challenge error string (PAYMENT-SIGNATURE, X-PAYMENT, X-Payment-Tx) or keys of a submitted payload_headers object; UNDETERMINED when the artefact evidences none — the carrier alone never implies a client header name. (3) payload_shape — from a submitted payment payload only: top-level when scheme/network sit at the payload top level, inside-accepted when they sit inside payload.accepted, both when both placements occur, UNDETERMINED when no payload was submitted or it carries neither placement. (4) amount_field_name — per leg, maxAmountRequired when only that field is present, amount when only amount is present, both when both are present; combined across legs as the union of the forms carried (one form, or both when the artefact carries both names — cross-leg difference in a dual-stack artefact is reported as both, not as a mismatch), UNDETERMINED when no leg carries an amount field. (5) network_id_form — per leg, CAIP-2 when accepts[0].network matches the CAIP-2 form (namespace:reference, e.g. eip155:8453 or solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp), slug when it is a bare lowercase slug (e.g. solana, base, base-sepolia); combined like the amount axis as the union of forms carried (both when the artefact carries both forms, UNDETERMINED when absent). (6) receipt_headers — from a submitted paid-response header set only: X-PAYMENT-RESPONSE (v1), PAYMENT-RESPONSE (v2), both, or none when the set was submitted and carries neither; UNDETERMINED when no response header set was submitted (a probe of an unpaid 402 cannot observe receipt headers). Per-leg dialect signals: a leg is v1-signalled by maxAmountRequired-only or a slug network, v2-signalled by amount-only or a CAIP-2 network; a leg carrying both signal kinds is mixed. Mismatches named per axis: a mixed-signal leg, an x402Version field contradicting its leg's pure signal dialect, and evidenced client header names that belong solely to the opposite carrier. Dialect summary: not-a-402 when the capture is not an inspectable 402; undetermined when no leg carries a challenge or no leg dialect is determinable; dual-stack when both carriers are present with opposite pure leg dialects; mixed when any leg is mixed-signal; otherwise the single determinable dialect (v1 or v2).","axes":["challenge_carrier","client_header_names","payload_shape","amount_field_name","network_id_form","receipt_headers"],"undetermined_rule":"An axis that cannot be determined from the artefact is reported as the string UNDETERMINED (client_header_names and receipt_headers report UNDETERMINED in the same way). No axis is ever inferred from another axis: in particular the carrier never implies a client header name, and a probe of an unpaid 402 never yields receipt headers.","verdict_grammar":{"line":"X402 DIALECT REPORT — dialect: <SUMMARY> — carrier: <CARRIER> — <check-end UTC>","vocabulary":"SUMMARY is one of v1, v2, dual-stack, mixed, undetermined, not-a-402. CARRIER is one of v1-body, v2-header, both, none, UNDETERMINED. There is no composite score, grade, or band anywhere in this op."},"free_precheck":"The free pre-check (POST /precheck) validates the submitted URL (probe mode) or artefact shape (submitted mode) against the published policy and returns assessability ONLY: the common signed fields, whether the input is in-policy (or the free refusal naming the violation), and the disclosure/honesty/retention lines. It does NOT fetch the endpoint, does NOT analyse any artefact, and returns no dialect finding. Free allowance: 100 per day per caller wallet, minimum interval 5,000 ms, 402 on exhaustion.","custody":{"construction":"In-memory processing within a single request lifetime; the artefact persists nowhere, on any path including errors and timeouts. No hash of an artefact appears anywhere.","ledger_closed_fields":["payer wallet","timestamp/day","price (USDC units) with the CAD fair-market-value block (rate, rate date, basis, cad_pending, refund)","payment tx id + Solana fee (lamports)","criteria version","report line","dialect summary","challenge carrier","house flag"],"ledger_note":"The ledger list above is closed: adding a field is a criteria/handling version change. The ledger NEVER carries the probed URL, any artefact field value, any artefact fragment, or any hash of an artefact.","errors":"Error handling is closed-form: static strings plus numeric facts only (lengths against caps, rule ids). No error path interpolates any part of an artefact."},"forbidden":"Forbidden in every surface of this op (report, pre-check, errors, ledger, metrics): any composite score or grade; any axis value the artefact did not evidence (guessing an UNDETERMINED axis); any artefact content beyond the per-axis findings and named mismatches; any payability verdict (that is A1's ground); any claim that a payment will settle.","boundary_statement":"Boundary vs A1 (Challenge Payability Verdict, payability/v1): A1 asks 'can this be paid at all' — it field-checks one endpoint's live 402 for payability (recipient, token account, memo, amounts, equality). This service, A2, asks 'which version must the payer speak' — it reports which x402 dialect each surface of the artefact speaks, axis by axis. A1 does not grade dialects; A2 does not grade payability, does not fetch for A1's field checks, and never re-sells A1's verdict. The fleet never sells the same check twice: payability is A1's ground, dialect is A2's.","disclosure_sentence":"Submitting an endpoint URL or a captured artefact to any third party, this service included, discloses its contents to that party; artefacts are processed in memory only and never stored, but the check does not undo the disclosure. In probe mode the target endpoint is fetched once, as an unauthenticated stranger, at check time.","honesty_line":"The report grades the artefact exactly as captured: a dialect axis is reported only where the artefact itself evidences it, and UNDETERMINED where it does not. A dialect report states what the challenge showed at check time; challenges change, and a v1 or v2 finding is not a guarantee that a payment in that dialect will settle.","retention":"Artefacts (fetched challenges and submitted challenge/payload sets) are processed in memory only and are never stored — not in KV, not in logs, not in the payments ledger, not in metrics, and not in error records. No artefact body, fragment of it, or hash of it is recorded anywhere. Reports carry the per-axis findings, the named mismatches, and the submitted URL (probe mode) only. The payments ledger records only the closed field list published in the criteria. Because nothing is kept, a paid retry re-submits the URL or artefact.","payment_includes":"$0.01 per endpoint dialect report. The fee is per endpoint: each endpoint (probe mode) or submitted artefact set (submitted mode) you submit is charged at $0.01. The payment includes: one endpoint dialect report — this service analyses that one endpoint's 402 challenge artefact (fetched live exactly as an unauthenticated stranger would in probe mode, or submitted by you in submitted mode) and returns one signed report naming, per axis, the challenge carrier (v1 body / v2 header / both), the client-header names accepted where the artefact evidences them, the payload shape (scheme/network top-level vs inside accepted) where a payload was submitted, the amount field name, the network-ID form (slug vs CAIP-2), and the receipt headers emitted where a paid-response artefact was submitted, with every mismatch named per axis, every axis that cannot be determined from the artefact reported as UNDETERMINED (never guessed), and an as-of timestamp. A free pre-check validates the submitted URL or artefact against the published policy only — it performs no fetch and returns no report. The artefact is processed in memory only and never stored; the payments ledger records only the payer, the time, the price, the dialect summary, the carrier, and the report line.","kill_line":"Kill line (M-17 / A2, under the operator's 2026-11-03 build-bank-hold doctrine): build, bank, and hold; judged at the fleet's periodic reviews. There is NO demand kill line for this item. Day-0 = first outside paid settle (accounting only; house proofs never count). Tripwires, all stop-and-review: (1) refunds >5% in any 30-day window; (2) free use >10x paid use; (3) a wrong dialect finding from undisclosed stale or partial data, or any axis reported as determined where the artefact did not evidence it (the error enters the corpus first as a regression case, corrected rules publish as a new criteria version, the corpus re-passes at 100% before serving resumes; issued reports are never amended); (4) custody: any surface retaining an artefact body or a fragment of one; (5) any probe-mode fetch outside the published target-URL policy.","never":"This op never follows a redirect; never sends credentials or any header beyond a plain unauthenticated GET in probe mode; never stores an artefact; never computes a composite score; never grades payability (that is A1's ground); never reports an axis it could not determine as anything but UNDETERMINED.","service":"dialect-check","version":"1.0.0","endpoints":{"criteria":"GET /criteria (free)","precheck":"POST /precheck (free, input validation + assessability only: no fetch, no analysis, no report)","check":"POST /check (paid, $0.01 per endpoint: signed dialect conformance report)","metrics":"GET /metrics","not_offered":"Any other POST path answers NOT COVERED — this worker serves op check only."}}