/* global React, HashBadge, AttestationStatePill, ReasonCodeChip, LatencyBudgetMeter, TimelineAxis, ThresholdGateIndicator, PartyAttestationRow, Spark, MerkleProofTree */ /* ========================================================= SCA / 3DS ATTESTATION CONSOLE ========================================================= */ function ScaConsole() { return (
{/* header */}
3DS-9A41C2E7 ACS vendor: stratus / PSD2 RTS Art.18
14:22:06.998441 UTC · CAVV attested · ECI 05 · liability shift → issuer
{/* Auth chain timeline */}
authentication chainend-to-end · sub-ms
{[ { step: "01", name: "AReq received", m: "0.00ms", ok: true }, { step: "02", name: "Frictionless eval", m: "2.14ms", ok: true }, { step: "03", name: "Challenge: passkey", m: "+15.4ms", ok: true }, { step: "04", name: "CAVV signed", m: "+3.5ms", ok: true }, { step: "05", name: "Liability shift", m: "+2.7ms", ok: true }, ].map((s, i, a) => (
{s.step}
{s.name}
{s.m}
))}
{/* Per auth method breakdown */}
per-auth-method · last 24hn = 184,221
{[ { name: "Passkey (FIDO2)", vol: 86420, succ: 98.4, abd: 0.7, p50: 1.8, p99: 6.4, liab: "issuer", spark: [12, 14, 11, 15, 18, 16, 17, 19, 20, 22, 21, 24] }, { name: "Biometric (in-app)", vol: 51204, succ: 96.1, abd: 1.8, p50: 2.4, p99: 9.1, liab: "issuer", spark: [18, 16, 17, 19, 16, 18, 17, 15, 14, 13, 15, 16] }, { name: "OTP · SMS", vol: 32144, succ: 74.2, abd: 21.0, p50: 41.2, p99: 182.0, liab: "issuer", spark: [42, 44, 41, 38, 40, 47, 52, 49, 44, 46, 48, 44] }, { name: "OTP · Email", vol: 8802, succ: 62.8, abd: 29.1, p50: 68.4, p99: 240.0, liab: "merchant", spark: [60, 62, 68, 70, 72, 68, 66, 64, 70, 74, 72, 68] }, { name: "Push (bank app)", vol: 5651, succ: 91.4, abd: 5.2, p50: 8.2, p99: 38.6, liab: "issuer", spark: [10, 9, 11, 12, 10, 11, 9, 8, 10, 12, 11, 10] }, ].map(m => ( ))}
method volume success abandon p50 / p99 latency distribution liability
{m.name} {m.vol.toLocaleString()} 90 ? "var(--ak-state-finalized-fg)" : m.succ > 80 ? "var(--ak-state-signed-fg)" : "var(--ak-state-failed-fg)" }}>{m.succ.toFixed(1)}% {m.abd.toFixed(1)}% {m.p50}ms / {m.p99}ms {m.liab}
{/* right rail — liability proof */}
liability proof
Shifted → ISSUER
}/> Y · authenticated}/> no}/> yes}/>
challenge payload · hash-only
challenge_type: passkey_assertion
rp_id_hash:
client_data_hash:
auth_data_hash:
sig:
// no raw credential, no biometric template
); } function Row({ k, v }) { return (
{k} {v}
); } /* ========================================================= ORCHESTRATION AUDIT ========================================================= */ function OrchConsole() { const cascade = [ { name: "Adyen", cost: 0.42, auth: 98.1, p99: 142, picked: true, err: null }, { name: "Stripe", cost: 0.58, auth: 97.4, p99: 168, picked: false, err: null }, { name: "Checkout.com",cost: 0.51, auth: 96.8, p99: 201, picked: false, err: "timeout_budget" }, { name: "Worldpay", cost: 0.48, auth: 94.2, p99: 244, picked: false, err: "auth_score_low" }, ]; return (
ROUTE-44C812 merchant: ACME-EU · region: DE
€1,240.00 · MCC 7995 · SCA attested · ruleset v18
{/* Cascade visualizer */}
routing cascade · attested decision4 candidates · selected 1 · fallback 0
{cascade.map((c, i) => (
{c.picked ? "▶" : String(i + 1).padStart(2, "0")}
{c.name}
processor.{c.name.toLowerCase().replace(/\./g, "")}
{/* bar stack */}
200 ? "var(--ak-latency-hot)" : "var(--ak-fg-1)" }}>{c.p99}ms p99
{c.err ? : }
))}
{/* Cost savings proof */}
cost-savings attestationsigned against ruleset v18
chose
Adyen
€0.42
per-auth cost
vs counterfactual
Stripe (next best)
€0.58
+ 0.7pt lower auth
savings proof
Δ per-auth
−€0.16
monthly extrap · −€42,180
{/* right — ruleset diff */}
ruleset diff · v17 → v18
{[ { s: "@@", l: "merchant.acme-eu.routing", t: "ctx" }, { s: "-", l: "priority_weight: auth_prob: 0.55" }, { s: "+", l: "priority_weight: auth_prob: 0.48" }, { s: "-", l: "priority_weight: cost: 0.30" }, { s: "+", l: "priority_weight: cost: 0.37" }, { s: " ", l: "priority_weight: latency: 0.15" }, { s: "@@", l: "mcc 7995 — gambling", t: "ctx" }, { s: "+", l: "min_3ds_version: >= 2.2" }, { s: "+", l: "require_passkey_if_amount > 1000" }, ].map((d, i) => (
{d.s} {d.l}
))}
signed versions
); } function BarRow({ label, value, max, unit, color, invert }) { const pct = Math.min(100, (value / max) * 100); return (
{label}
{unit === "€" ? unit + value.toFixed(2) : value.toFixed(1) + unit}
); } function VerRow({ v, cur }) { return (
{v} {cur ? "current" : "archived"}
); } /* ========================================================= SETTLEMENT THRESHOLD GATE ========================================================= */ function SettleConsole() { const [met, setMet] = React.useState(3); return (
STL-B0C1-4421 = 3 ? "finalized" : "threshold"}/>
batch · €14.2M · 12,480 auths · cycle 2026-04-22/17
{/* Party rows */}
multi-party attestation · acquirer → processor → network → issuer threshold M=3 of N=4
{[ { party: "ACQ · Barclaycard DE", role: "acquirer", state: met >= 1 ? "finalized" : "unsigned", signer: "HSM · 0x7a1c…", t: "17:02:11.004", sig: "0x88aa01..." }, { party: "PROC · Nexi Processing", role: "processor", state: met >= 2 ? "finalized" : "unsigned", signer: "HSM · 0x44e2…", t: "17:02:11.086", sig: "0x12cd4f..." }, { party: "NET · Visa Europe", role: "network", state: met >= 3 ? "finalized" : "unsigned", signer: "KMS · 0xff90…", t: "17:02:11.210", sig: "0x9b01ee..." }, { party: "ISS · Deutsche Bank", role: "issuer", state: met >= 4 ? "finalized" : "signed", signer: "HSM · 0x22b1…", t: met >= 4 ? "17:02:11.294" : "pending…", sig: met >= 4 ? "0x4409ca..." : "0x00000000", isLast: true }, ].map((p, i, arr) => ( ))}
{met >= 3 && met < 4 &&
}
{/* Cross-party root diff */}
cross-party Merkle-root diff · O(1) reconcilebatch root comparison
{["acquirer", "processor", "network", "issuer"].map((p, i) => (
{p} root
● identical
12,480 leaves · depth 14
))}
4/4 parties agree · batch hash 0xa1b2c3d4e5f67890fedcba012345 · no spreadsheet required
{/* right — day-scale timeline */}
settlement cycle · day-scale
signers on batch
{["ACQ · HSM · 0x7a1c","PROC · HSM · 0x44e2","NET · KMS · 0xff90","ISS · HSM · 0x22b1"].map((s, i) => (
{s}
))}
); } Object.assign(window, { ScaConsole, OrchConsole, SettleConsole });