{"id":66,"date":"2026-05-04T15:54:01","date_gmt":"2026-05-04T14:54:01","guid":{"rendered":"https:\/\/lukaskoren.tech\/?page_id=66"},"modified":"2026-06-29T19:18:51","modified_gmt":"2026-06-29T18:18:51","slug":"dynamic-routing-payment-gateway","status":"publish","type":"page","link":"https:\/\/lukaskoren.tech\/?page_id=66","title":{"rendered":"Dynamic Routing Engine"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>TL;DR<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The EVX Technologies Ltd payment orchestration platform lifted debit card authorisation rates from 78% to 91% in production. The programme was a zero-to-one infrastructure build targeting clean high-risk merchants &#8211; a segment the mainstream acquiring industry rejects through blunt MCC-level risk categorisation. What made it hard was designing a five-model probabilistic routing architecture and proving its commercial case before any acquirer would formally underwrite the merchant book.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CONTEXT<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">EVX Technologies Ltd built a payment orchestration layer for merchants in high-risk verticals &#8211; online gambling, sports betting, nutraceuticals, and subscription commerce &#8211; that generate legitimate card volume but are routinely declined or de-banked by tier-1 payment gateways and acquiring banks. The structural failure is consistent: mainstream payment gateways apply static MCC-level risk categorisation, assign merchants a single processing route, and provide no fallback when that acquirer&#8217;s risk appetite shifts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The commercial gap was an orchestration layer this segment had never had access to: one that could match each transaction to the acquirer most likely to approve it in real time, while maintaining the fraud and chargeback posture required to keep Visa and Mastercard scheme monitoring programmes inactive.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>PROBLEM<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>User problem<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Merchants in MCC 7995 were experiencing debit card authorisation rates below 80% &#8211; not because of fraudulent cardholders, but because their single assigned acquirer applied blanket decline rules across the entire category regardless of individual transaction risk. In many cases a Barclays UK debit card from a returning player with 14 prior successful deposits received identical treatment to a first-time prepaid virtual card. Merchants had no visibility into decline reasons and no fallback route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Business problem<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Static single-acquirer assignment produces measurably sub-optimal commercial outcomes. Transaction data shows approval probability for the same BIN &#8211; Barclays, MCC Gambling, \u00a30\u201350 &#8211; varying from 92% on one acquirer to 81% on another. That differential was not being captured. Every misrouted transaction was recoverable revenue destroyed by an infrastructure gap rather than by genuine issuer risk. Each percentage point of lost authorisation rate represented a direct and recoverable commercial loss &#8211; recoverable with the right routing architecture, but not recoverable within a single-acquirer model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Technical and operational problem<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Solving this required reframing routing as an expected value maximisation problem rather than a configuration problem. The orchestration layer needed to evaluate a composite score across five probability models &#8211; approval, fraud, chargeback, retry success, and velocity &#8211; for each candidate acquirer, in milliseconds, on every transaction. Acquirer credential isolation had to be maintained per merchant and per environment without conditional logic in the live transaction flow. The absence of live merchant volume at programme inception meant routing assumptions had to be proven from first principles rather than from observed data &#8211; a sequencing constraint that shaped every architectural decision.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">APPROACH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Reframing the routing objective: expected net value, not approval rate<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The foundational programme decision was defining what the routing engine optimises before any architecture was committed. The engine does not maximise approval rate. It maximises expected net value to the gateway per transaction , the margin remaining after subtracting expected fraud losses, chargeback costs, and acquirer processing fees:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EV = (P_approve \u00d7 Net margin per approved transaction) \u2212 (P_fraud \u00d7 FraudLoss) \u2212 (P_cb \u00d7 ChargebackCost)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Where net margin = gateway processing fee \u2212 acquirer fee. Every term except net margin and acquirer fee is a probability estimate, recalculated fresh on every transaction. On a \u00a3100 gambling deposit, this distinction is decisive: Acquirer C at 94% approval with high fraud and chargeback exposure generates negative EV. Acquirer B at 86% approval with low fraud and chargeback exposure generates materially positive EV. Routing to Acquirer C destroys gateway margin while appearing to perform on the headline metric.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The five probability models<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The EV formula draws on three probability models. Two further models , velocity scoring and retry success , gate transactions before routing and recover value after soft declines respectively. All five are described below. All five share one mathematical foundation: Bayesian updating.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bayesian updating , the mathematical foundation of all five models<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every probability estimate in the system is maintained as a Beta distribution with two parameters:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u03b1 = number of times the outcome of interest was observed (approval, fraud, chargeback, retry success)<\/li>\n\n\n\n<li>\u03b2 = number of times the outcome was not observed<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The current best estimate of the probability is:<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>P<\/mi><mo>=<\/mo><mi>\u03b1<\/mi><mi>\/<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>\u03b1<\/mi><mo>+<\/mo><mi>\u03b2<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">P = \u03b1 \/ (\u03b1 + \u03b2)<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">After each new transaction outcome arrives, one parameter increments by 1:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Outcome observed \u2192 \u03b1 = \u03b1 + 1<\/li>\n\n\n\n<li>Outcome not observed \u2192 \u03b2 = \u03b2 + 1<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The estimate recalculates immediately. This means every model is continuously learning , each transaction makes the next routing decision more accurate. Before any real transactions flow, the model is seeded with pseudo-counts derived from acquirer benchmark data and industry benchmarks, giving the system an informed starting point rather than a blank slate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Bayesian approach is superior to a simple frequency count for one critical reason: it is confidence-aware. A model with \u03b1=9, \u03b2=1 (90% from 10 observations) knows its estimate is uncertain. A model with \u03b1=900, \u03b2=100 (90% from 1000 observations) knows its estimate is reliable. The routing engine can weight high-confidence estimates more heavily than low-confidence ones , particularly important on sparse transaction profiles where little historical data exists.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The five models in detail<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Approval <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>P(approval | BIN, Acquirer, MCC, Amount, Country, Device, 3DS, Velocity)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The probability that a specific acquirer will approve this specific transaction given its live profile. This is the primary input to the routing matrix , the lookup table that stores historical approval rates per BIN\/MCC\/amount band\/acquirer combination. The routing matrix is not static. Every completed transaction updates the relevant \u03b1 and \u03b2 counts, so the approval rate estimates continuously improve. The same Barclays BIN routes differently at \u00a30\u201350 versus \u00a350\u2013200 because the matrix learns issuer behaviour at that granularity. When a transaction profile has never been seen before, the engine relaxes input variables one at a time , from specific to general , until a matching row is found.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Fraud <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>P(fraud | Device, Velocity, Geo, BIN, Amount, Merchant, Behaviour)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The probability that this transaction is fraudulent based on observable signals. Fraud labels arrive with a 30\u201390 day lag , confirmed via chargeback reason codes or acquirer fraud flags , meaning the model trains on older data and relies on leading indicator signals observable right now. Velocity anomaly, device fingerprint, and geo mismatch are the strongest real-time fraud signals precisely because they are observable at transaction time without waiting for outcome confirmation. Note: acquirer is deliberately excluded from the fraud model inputs because fraud risk is a property of the transaction, not the routing decision. However, acquirer fraud flag sensitivity varies , different acquirers flag at different thresholds , which creates a label normalisation requirement when updating fraud probability estimates from acquirer-reported data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Chargebacks<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>P(chargeback | Merchant, PlayerType, Issuer, MCC, Amount, History)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The probability of a downstream chargeback dispute. Distinct from fraud , chargebacks are initiated by legitimate cardholders disputing charges through regret, friendly fraud, or genuine service failures. Chargeback labels carry the longest lag of all models: 30\u2013120 days. The model compensates with strong leading indicators observable at transaction time: first-time depositor status, credit card type, prior friendly fraud history, and the merchant&#8217;s own rolling chargeback ratio. Critically, P(chargeback) is not just a per-transaction cost , it is a MID survival signal. Scheme monitoring programmes trigger at portfolio-level chargeback ratios. The RouteScore weighting w\u2083 can be increased for merchants approaching these thresholds, aggressively penalising high-chargeback profiles even at the cost of approval rate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Velocity<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>VelocityScore = Transactions_window \/ ExpectedTransactions_window<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A real-time ratio metric , not a Bayesian probability model , that measures how far a cardholder&#8217;s current transaction frequency deviates from their expected baseline. A score of 9 (18 actual deposits per hour vs 2 expected) flags high anomaly. VelocityScore serves two roles: as a hard pre-routing gate when it exceeds a defined threshold (ERR_RISK_REJECTED before any acquirer API call), and as an input signal into P(fraud). It is the fastest-responding signal in the system because it requires no outcome label , anomaly is detectable in real time from transaction counts alone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. Retry Success<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>P(retry_success | DeclineCode, Issuer, Acquirer, TimeDelay, 3DS)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When an acquirer returns a soft decline code, the retry model scores three candidate paths: same acquirer immediately, alternative acquirer immediately, and time-delayed retry. It selects the path with the highest predicted success probability. The model updates immediately after each retry outcome , making it the fastest-updating Bayesian model in the system. Retry scoring is governed by card scheme retry rules that limit how many retry attempts are permitted per transaction within a time window. The model therefore gates retries not just on probability of success but on whether the expected value of the retry attempt , net of fraud and chargeback risk , justifies consuming a retry quota slot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The explore vs exploit tradeoff: building the routing matrix<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The routing matrix can only estimate P(approval) for an acquirer on a given transaction profile if transactions have actually been sent to that acquirer on that profile. This creates a cold-start problem: routing everything to the best known acquirer means never learning whether an alternative acquirer might perform better on specific profiles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The programme addressed this through deliberate traffic splitting using an epsilon-greedy strategy. A defined percentage \u03b5 of transactions are routed to exploration acquirers , not the highest EV choice , specifically to generate observed approval rate data across the full acquirer pool. The remainder exploit the current best known routes.<\/p>\n\n\n\n<div class=\"wp-block-math\"><math display=\"block\"><semantics><mrow><mi>\u03b5<\/mi><mo form=\"prefix\" stretchy=\"false\">(<\/mo><mi>t<\/mi><mo form=\"postfix\" stretchy=\"false\">)<\/mo><mo>=<\/mo><msub><mi>\u03b5<\/mi><mn>0<\/mn><\/msub><mi>\/<\/mi><mtext>\u221a<\/mtext><mi>t<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">\u03b5(t) = \u03b5\u2080 \/ \u221at<\/annotation><\/semantics><\/math><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Exploration rate starts higher early in the programme when the matrix is sparse, and decays automatically as transaction volume grows and estimates become reliable. This is an explicit commercial tradeoff: short-term EV is sacrificed on exploration transactions in exchange for a routing matrix that improves in accuracy over time. The routing matrix was seeded at launch with acquirer benchmark data provided during commercial onboarding , informed priors that gave the system a starting point before live transaction data was available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The RouteScore formula: how all five models combine into one decision<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The EV formula produces a raw expected value per acquirer. But EV alone is not always the right decision criterion. A merchant approaching a Visa chargeback threshold needs the platform to weight chargeback avoidance more heavily than raw margin. A VIP player deposit warrants prioritising approval rate over cost sensitivity. The RouteScore formula applies configurable weights to each dimension:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RouteScore = (w\u2081 \u00d7 P_approve) \u2212 (w\u2082 \u00d7 P_fraud) \u2212 (w\u2083 \u00d7 P_cb) \u2212 (w\u2084 \u00d7 AcquirerCost) + (w\u2085 \u00d7 CustomerValue)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The weights w\u2081\u2013w\u2085 are operator-configured per merchant vertical. They do not change the underlying probability estimates , those are fixed by the Bayesian models. They change how much each dimension contributes to the final routing decision. The acquirer with the highest RouteScore wins, not necessarily the highest EV acquirer. This is the operator&#8217;s judgment encoded as numbers , translating commercial priorities into routing behaviour without touching the probability models themselves.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How RouteScore and EV relate<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">EV and RouteScore answer different questions:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>EV asks: &#8220;What is the expected net profit of routing to this acquirer?&#8221;<\/li>\n\n\n\n<li>RouteScore asks: &#8220;Given our current commercial priorities, which acquirer should we route to?&#8221;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">When weights are set neutrally , equal importance to all dimensions , RouteScore approximates EV. When weights are tuned , for example, w\u2083 increased for a merchant near chargeback threshold , RouteScore diverges from EV deliberately. The platform may route to a slightly lower EV acquirer that carries lower chargeback risk, accepting a small margin sacrifice to protect MID health.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the operator judgment layer that sits above the mathematics. The probability models tell the truth about each acquirer&#8217;s historical performance. The RouteScore weights determine which truth matters most on this transaction, for this merchant, right now.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sequencing irreversible dependencies ahead of visible features<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consumer-facing merchant tooling was explicitly deferred until the routing core was stable. The GatewayRouterService was designed so that per-merchant acquirer assignment lives in the data model, not in application logic, enabling acquirer reassignment and A\/B routing experiments without code deploys. Five specialist acquirers were evaluated and costed alongside the two live integrations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The RouteScore formula is the final decision layer. It sits above all five probability models and the EV formula. Understanding it requires understanding what it is &#8211; and what it is not.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What RouteScore is not<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RouteScore is not a separate probability model. It does not estimate the likelihood of any outcome. It does not learn from transaction data directly. It is a weighted aggregation formula that combines the outputs of the probability models into a single comparable score per acquirer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What RouteScore is<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RouteScore is the operator&#8217;s commercial judgment, expressed mathematically. It takes the raw probability estimates from the Bayesian models and applies weights that reflect current business priorities.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>RouteScore = (w\u2081 \u00d7 P_approve) \u2212 (w\u2082 \u00d7 P_fraud) \u2212 (w\u2083 \u00d7 P_cb) \u2212 (w\u2084 \u00d7 AcquirerCost) + (w\u2085 \u00d7 CustomerValue)<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each term in this formula is either a probability from one of the Bayesian models or a fixed known value:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Source<\/th><th>Type<\/th><\/tr><\/thead><tbody><tr><td>P_approve<\/td><td>P(approval) model<\/td><td>Bayesian probability, live<\/td><\/tr><tr><td>P_fraud<\/td><td>P(fraud) model<\/td><td>Bayesian probability, lagged<\/td><\/tr><tr><td>P_cb<\/td><td>P(chargeback) model<\/td><td>Bayesian probability, most lagged<\/td><\/tr><tr><td>AcquirerCost<\/td><td>Commercial contract<\/td><td>Fixed known value<\/td><\/tr><tr><td>CustomerValue<\/td><td>Player profile data<\/td><td>Calculated from history<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What the weights actually do<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each weight is a multiplier that amplifies or dampens the contribution of that term to the final score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider two scenarios with identical probability estimates but different weights:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario A &#8211; Normal operations, w\u2081=1.0, w\u2082=1.0, w\u2083=1.0, w\u2084=0.5, w\u2085=0.5<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The platform weights approval, fraud, and chargeback equally. Cost and customer value play a smaller role. The engine selects the acquirer with the best balanced risk-adjusted outcome.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scenario B &#8211; Merchant approaching chargeback threshold, w\u2081=0.8, w\u2082=1.0, w\u2083=2.0, w\u2084=0.5, w\u2085=0.5<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The chargeback penalty is doubled. The engine will accept lower approval rates and slightly higher fraud risk in exchange for routing away from high-chargeback profiles. MID survival takes priority over margin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The probability estimates have not changed. The acquirer&#8217;s actual performance has not changed. Only the operator&#8217;s judgment about what matters most right now has changed &#8211; and that judgment is encoded in the weights.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How RouteScore relates to EV<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The EV formula is embedded inside RouteScore. You can see it if you set w\u2081 = net margin, w\u2082 = FraudLoss, w\u2083 = ChargebackCost, w\u2084 = 1, w\u2085 = 0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>RouteScore \u2192 EV = (P_approve \u00d7 Net margin) \u2212 (P_fraud \u00d7 FraudLoss) \u2212 (P_cb \u00d7 ChargebackCost) \u2212 AcquirerCost<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pure EV maximisation is a special case of RouteScore where the weights are set to the financial values of each outcome. RouteScore generalises EV by allowing the operator to adjust those weights based on non-financial priorities \u2014 MID health, VIP treatment, risk appetite \u2014 that pure financial EV does not capture.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The complete decision sequence<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Transaction arrives with live profile<\/li>\n\n\n\n<li>VelocityScore calculated \u2014 if above threshold, block. If below, continue.<\/li>\n\n\n\n<li>For each candidate acquirer, the three Bayesian models return P_approve, P_fraud, P_cb<\/li>\n\n\n\n<li>EV calculated per acquirer using those probabilities and known financial values<\/li>\n\n\n\n<li>RouteScore calculated per acquirer using those same probabilities plus operator weights<\/li>\n\n\n\n<li>Acquirer with highest RouteScore selected \u2014 not necessarily highest EV, not necessarily highest approval rate<\/li>\n\n\n\n<li>Transaction dispatched to selected acquirer<\/li>\n\n\n\n<li>Outcome received \u2014 approved, soft decline, or hard decline<\/li>\n\n\n\n<li>If soft decline: P(retry_success) model scores three retry paths, selects highest, re-enters routing<\/li>\n\n\n\n<li>If approved or hard declined: Bayesian models update \u03b1 or \u03b2 for this profile on this acquirer<\/li>\n\n\n\n<li>Routing matrix updated \u2014 next transaction on this profile benefits from this outcome<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Every step feeds the next. The system improves continuously because step 10 and 11 never stop running.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>ARCHITECTURE<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagram 1 &#8211; Statistical routing matrix<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The routing matrix is the lookup table the scoring engine reads at decision time. It stores historical approval rates for every observed combination of BIN, MCC, amount band, and acquirer &#8211; updated after every completed transaction. The engine does not calculate approval probability from first principles on each request. It reads the nearest matching row from this table, feeds that approval rate into the EV formula alongside fraud and chargeback probabilities, and selects the highest-EV route. The table below shows a representative slice.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>BIN<\/strong><\/td><td><strong>MCC<\/strong><\/td><td><strong>Amount band<\/strong><\/td><td><strong>Acquirer<\/strong><\/td><td><strong>Historical approval rate<\/strong><\/td><\/tr><tr><td>Barclays UK debit<\/td><td>Gambling 7995<\/td><td>\u00a30\u201350<\/td><td>Acquirer 1<\/td><td>92%<\/td><\/tr><tr><td>Barclays UK debit<\/td><td>Gambling 7995<\/td><td>\u00a30\u201350<\/td><td>Acquirer 2<\/td><td>81%<\/td><\/tr><tr><td>Barclays UK debit<\/td><td>Gambling 7995<\/td><td>\u00a350\u2013200<\/td><td>Acquirer 1<\/td><td>84%<\/td><\/tr><tr><td>Barclays UK debit<\/td><td>Gambling 7995<\/td><td>\u00a350\u2013200<\/td><td>Acquirer 2<\/td><td>67%<\/td><\/tr><tr><td>Monzo debit<\/td><td>Sports betting 7995<\/td><td>\u00a30\u2013100<\/td><td>Acquirer 2<\/td><td>89%<\/td><\/tr><tr><td>Monzo debit<\/td><td>Sports betting 7995<\/td><td>\u00a30\u2013100<\/td><td>Acquirer 1<\/td><td>82%<\/td><\/tr><tr><td>Revolut virtual<\/td><td>Gambling 7995<\/td><td>\u00a30\u201350<\/td><td>Acquirer 2<\/td><td>92%<\/td><\/tr><tr><td>Revolut virtual<\/td><td>Gambling 7995<\/td><td>\u00a30\u201350<\/td><td>Acquirer 1<\/td><td>77%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The table makes visible what static routing cannot see: the best acquirer for a Barclays debit card is not the best acquirer for a Revolut virtual card. Without this matrix, every transaction takes the same route regardless of these differentials. With it, each transaction is routed to the acquirer statistically most likely to approve it &#8211; and every outcome updates the table, so the next similar transaction is routed from better data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagram 2 &#8211; Transaction processing pipeline<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This diagram shows how a transaction flows from merchant API call through the pre-risk engine, deduplication, route scoring, acquirer dispatch, and soft decline recovery. The pre-risk engine and deduplication run before routing &#8211; not after &#8211; because a transaction blocked post-routing contaminates the routing matrix with a data point reflecting operational failure rather than genuine issuer behaviour, distorting future approval rate estimates for that BIN\/acquirer combination.<\/p>\n\n\n\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Share+Tech+Mono&#038;display=swap\" rel=\"stylesheet\">\n\n<div class=\"tds-root\">\n\n  <div class=\"tds-header\">\n    <div class=\"tds-title\"><span class=\"tds-dot\"><\/span>EVX DYNAMIC ROUTING ENGINE \u2014 TRANSACTION FLOW<\/div>\n    <div class=\"tds-meta\">EVX TECHNOLOGIES LTD \u00b7 AUTHORISATION &#038; ROUTING ARCHITECTURE \u00b7 v2.4<\/div>\n  <\/div>\n\n  <!--\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  PRE-FLIGHT COORDINATE AUDIT\n  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  DESIGN CONSTANTS\n    Rect node:  W=240  H=88    x = cx\u2212120\n    Pill node:  W=240  H=72    x = cx\u2212120  rx=36\n    Diamond:    hw=105 hh=70   cx\u00b1hw, cy\u00b1hh\n    Cylinder S: rx=100 ry=14\n    Col pitch:  320px\n    Node gap:   \u2265100px between node bottom and next node top\n\n  COLUMN CENTRES\n    Ph1:  A=140   B=460   C=760   E=1060   G=1360\n    Ph2:  H=1360  I=1640  J\/K\/L=1920\n    Ph3:  M=1820  N=1540  Q\/R\/S=1360  O=1680  P=1840\n\n  \u2500\u2500 PHASE 1  banner y=0  row cy=260 \u2500\u2500\n    A  pill  cx=140   x=20    y=224  w=240 h=72  bot=296\n    B  rect  cx=460   x=340   y=216  w=240 h=88  bot=304\n    C  diam  cx=760   cy=260  hw=105 hh=70        bot=330\n    D  pill  cx=760   x=640   y=440  w=240 h=72  bot=512  (gap C\u2192D: 440\u2212330=110px \u2713)\n    E  diam  cx=1060  cy=260  hw=105 hh=70        bot=330\n    F  pill  cx=1060  x=940   y=440  w=240 h=72  bot=512\n    G  rect  cx=1360  x=1240  y=216  w=240 h=88  bot=304\n\n  \u2500\u2500 PHASE 2  banner y=600  (D\/F bot=512 + 88px gap) \u2500\u2500\n  \u2500\u2500 PHASE 2  H\/I row cy=750 \u2500\u2500\n    H  rect  cx=1360  x=1240  y=706  w=240 h=88  bot=794\n    I  diam  cx=1640  cy=750  hw=105 hh=70        bot=820\n\n    J\/K\/L column cx=1920, stacked with 100px gaps, h=88 each, pitch=188px\n    J  rect  cx=1920  x=1800  y=606  w=240 h=88  cy=650   bot=694\n    K  rect  cx=1920  x=1800  y=794  w=240 h=88  cy=838   bot=882  gap J\u2192K: 794\u2212694=100px \u2713\n    L  rect  cx=1920  x=1800  y=982  w=240 h=88  cy=1026  bot=1070 gap K\u2192L: 982\u2212882=100px \u2713\n\n  \u2500\u2500 PHASE 3  banner y=1160  (L bot=1070 + 90px gap) \u2500\u2500\n  \u2500\u2500 Phase 3 nodes \u2500\u2500\n    M  diam  cx=1820  cy=1290 hw=105 hh=70        bot=1360\n    N  pill  cx=1540  x=1420  y=1254 w=240 h=72  bot=1326  (same row cy as M=1290)\n    O  rect  cx=1680  x=1400  y=1460 w=560 h=96  bot=1556  (gap M\u2192O: 1460\u22121360=100px \u2713)\n    P  pill  cx=1840  x=1720  y=1660 w=240 h=72  bot=1732  (gap O\u2192P: 1660\u22121556=104px \u2713)\n    Q  rect  cx=1000  x=880   y=1460 w=240 h=88  bot=1548  (SUCCESS col, clear of O left=1400 by 280px \u2713)\n    R  rect  cx=1000  x=880   y=1660 w=240 h=88  bot=1748  (gap Q\u2192R: 1660\u22121548=112px \u2713)\n    S  cyl   cx=1000           top_cy=1868 rx=100 ry=14 body=50 bot_cy=1918\n                               left=900   right=1100       bot=1932  (gap R\u2192S: 1868\u22121748=120px \u2713)\n\n  max_x: J\/K\/L right=1800+240=2040  trunk at x=2060\n  max_y: S bot=1918+14=1932         canvas_h=2020\n  canvas_w=2120  banner_w=2120\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  -->\n\n  <svg viewBox=\"0 0 2120 2020\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:100%;display:block;\">\n    <defs>\n      <marker id=\"tds-ah-orange\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"5\" orient=\"auto\">\n        <polygon points=\"0 0,10 5,0 10\" fill=\"#FF6600\"\/>\n      <\/marker>\n      <marker id=\"tds-ah-amber\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"5\" orient=\"auto\">\n        <polygon points=\"0 0,10 5,0 10\" fill=\"#FFB300\"\/>\n      <\/marker>\n      <marker id=\"tds-ah-red\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"5\" orient=\"auto\">\n        <polygon points=\"0 0,10 5,0 10\" fill=\"#CC2200\"\/>\n      <\/marker>\n      <marker id=\"tds-ah-dim\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"5\" orient=\"auto\">\n        <polygon points=\"0 0,10 5,0 10\" fill=\"#993300\"\/>\n      <\/marker>\n      <marker id=\"tds-ah-green\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"5\" orient=\"auto\">\n        <polygon points=\"0 0,10 5,0 10\" fill=\"#448800\"\/>\n      <\/marker>\n    <\/defs>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 1 \u2014 PHASE BANNERS\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <rect x=\"0\" y=\"0\"    width=\"2120\" height=\"40\" fill=\"#0D0500\"\/>\n    <rect x=\"0\" y=\"39\"   width=\"2120\" height=\"1\"  fill=\"#993300\" opacity=\"0.6\"\/>\n    <text x=\"30\" y=\"26\"  font-size=\"16\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">\u25b6 PHASE 1 \u2014 INGEST \u00b7 VALIDATION \u00b7 PRE-RISK<\/text>\n\n    <rect x=\"0\" y=\"600\"  width=\"2120\" height=\"40\" fill=\"#0D0800\"\/>\n    <rect x=\"0\" y=\"639\"  width=\"2120\" height=\"1\"  fill=\"#AA7700\" opacity=\"0.6\"\/>\n    <text x=\"30\" y=\"626\" font-size=\"16\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">\u25b6 PHASE 2 \u2014 GATEWAY ROUTING \u00b7 ACQUIRER SELECTION \u00b7 ROUTE SCORING ENGINE<\/text>\n\n    <rect x=\"0\" y=\"1160\" width=\"2120\" height=\"40\" fill=\"#0D0500\"\/>\n    <rect x=\"0\" y=\"1199\" width=\"2120\" height=\"1\"  fill=\"#993300\" opacity=\"0.6\"\/>\n    <text x=\"30\" y=\"1186\" font-size=\"16\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">\u25b6 PHASE 3 \u2014 ACQUIRER DISPATCH \u00b7 ISSUER RESPONSE \u00b7 OUTCOME ROUTING<\/text>\n\n    <!-- Column labels -->\n    <text x=\"140\"  y=\"68\" text-anchor=\"middle\" font-size=\"13\" fill=\"#553311\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">INGEST<\/text>\n    <text x=\"460\"  y=\"68\" text-anchor=\"middle\" font-size=\"13\" fill=\"#553311\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">VALIDATE<\/text>\n    <text x=\"760\"  y=\"68\" text-anchor=\"middle\" font-size=\"13\" fill=\"#553311\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">PRE-RISK<\/text>\n    <text x=\"1060\" y=\"68\" text-anchor=\"middle\" font-size=\"13\" fill=\"#553311\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">DEDUP<\/text>\n    <text x=\"1360\" y=\"68\" text-anchor=\"middle\" font-size=\"13\" fill=\"#553311\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ROUTER<\/text>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 2 \u2014 ALL ARROWS\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <!-- A \u2192 B   y=260 -->\n    <line x1=\"260\"  y1=\"260\" x2=\"334\"  y2=\"260\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n    <!-- B \u2192 C   y=260 -->\n    <line x1=\"580\"  y1=\"260\" x2=\"648\"  y2=\"260\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n    <!-- C \u2192 D   BLOCK  x=760 down, C bot=330, D top=440 -->\n    <line x1=\"760\"  y1=\"330\" x2=\"760\"  y2=\"434\" stroke=\"#CC2200\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-red)\"\/>\n    <!-- C \u2192 E   PASS   y=260 -->\n    <line x1=\"865\"  y1=\"260\" x2=\"948\"  y2=\"260\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n    <!-- E \u2192 F   DUPLICATE  x=1060 down -->\n    <line x1=\"1060\" y1=\"330\" x2=\"1060\" y2=\"434\" stroke=\"#CC2200\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-red)\"\/>\n    <!-- E \u2192 G   PASS   y=260 -->\n    <line x1=\"1165\" y1=\"260\" x2=\"1234\" y2=\"260\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n    <!-- G \u2192 H   x=1360 down through banner, G bot=304, H top=706 -->\n    <line x1=\"1360\" y1=\"304\" x2=\"1360\" y2=\"700\" stroke=\"#FFB300\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n    <!-- H \u2192 I   y=750 -->\n    <line x1=\"1480\" y1=\"750\" x2=\"1528\" y2=\"750\" stroke=\"#FFB300\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- I \u2192 J   right-angle: I right=1745, go right to x=1745, up to J cy=650, right to J left=1800 -->\n    <line x1=\"1745\" y1=\"750\" x2=\"1745\" y2=\"650\" stroke=\"#FFB300\" stroke-width=\"2.5\"\/>\n    <line x1=\"1745\" y1=\"650\" x2=\"1794\" y2=\"650\" stroke=\"#FFB300\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n    <!-- I \u2192 K   right-angle: I right=1745, go right to x=1745, down to K cy=838, right to K left=1800 -->\n    <line x1=\"1745\" y1=\"750\" x2=\"1745\" y2=\"838\" stroke=\"#FFB300\" stroke-width=\"2.5\"\/>\n    <line x1=\"1745\" y1=\"838\" x2=\"1794\" y2=\"838\" stroke=\"#FFB300\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n    <!-- I \u2192 L   right-angle: down to L cy=1026, right to L left=1800 -->\n    <line x1=\"1745\" y1=\"750\" x2=\"1745\" y2=\"1026\" stroke=\"#FFB300\" stroke-width=\"2.5\"\/>\n    <line x1=\"1745\" y1=\"1026\" x2=\"1794\" y2=\"1026\" stroke=\"#FFB300\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- J\/K\/L \u2192 M  converge trunk at x=2060 -->\n    <line x1=\"2040\" y1=\"650\"  x2=\"2060\" y2=\"650\"  stroke=\"#FF6600\" stroke-width=\"2.5\"\/>\n    <line x1=\"2040\" y1=\"838\"  x2=\"2060\" y2=\"838\"  stroke=\"#FF6600\" stroke-width=\"2.5\"\/>\n    <line x1=\"2040\" y1=\"1026\" x2=\"2060\" y2=\"1026\" stroke=\"#FF6600\" stroke-width=\"2.5\"\/>\n    <!-- vertical trunk y=650 to y=1026 -->\n    <line x1=\"2060\" y1=\"650\"  x2=\"2060\" y2=\"1026\" stroke=\"#FF6600\" stroke-width=\"2.5\"\/>\n    <!-- midpoint of trunk = (650+1026)\/2 = 838, same as K cy \u2014 down to banner y=1158 -->\n    <line x1=\"2060\" y1=\"838\"  x2=\"2060\" y2=\"1158\" stroke=\"#FF6600\" stroke-width=\"2.5\"\/>\n    <!-- left to M top cx=1820 at y=1158 -->\n    <line x1=\"2060\" y1=\"1158\" x2=\"1820\" y2=\"1158\" stroke=\"#FF6600\" stroke-width=\"2.5\"\/>\n    <!-- down to M top vertex cy\u2212hh=1290\u221270=1220 -->\n    <line x1=\"1820\" y1=\"1158\" x2=\"1820\" y2=\"1214\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- M \u2192 N   3DS  y=1290 left, M left=1715, N right=1660 -->\n    <line x1=\"1715\" y1=\"1290\" x2=\"1666\" y2=\"1290\" stroke=\"#993300\" stroke-width=\"2.5\" stroke-dasharray=\"8,4\" marker-end=\"url(#tds-ah-dim)\"\/>\n\n    <!-- M \u2192 Q   SUCCESS  route to Q cx=1000, clear of N left=1420 and O left=1400 -->\n    <!-- M left=1715 \u2192 left at y=1290 to x=800 \u2192 down to Q top=1460 -->\n    <path d=\"M 1715 1290 L 800 1290 L 800 1454\" fill=\"none\" stroke=\"#448800\" stroke-width=\"2.5\" stroke-dasharray=\"7,4\" marker-end=\"url(#tds-ah-green)\"\/>\n\n    <!-- M \u2192 O   SOFT DECLINE  x=1820 down, M bot=1360, O top=1460 -->\n    <line x1=\"1820\" y1=\"1360\" x2=\"1820\" y2=\"1454\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- Q \u2192 R   x=1000 down, Q bot=1548, R top=1660 -->\n    <line x1=\"1000\" y1=\"1548\" x2=\"1000\" y2=\"1654\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- R \u2192 S   x=1000 down, R bot=1748, S top_cy=1868\u2212ry=14=1854 -->\n    <line x1=\"1000\" y1=\"1748\" x2=\"1000\" y2=\"1848\" stroke=\"#FF6600\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- O \u2192 P   HARD DECLINE  O right=1960, down, P top=1660 -->\n    <line x1=\"1960\" y1=\"1556\" x2=\"1960\" y2=\"1654\" stroke=\"#CC2200\" stroke-width=\"2.5\" marker-end=\"url(#tds-ah-red)\"\/>\n\n    <!-- O \u2192 H   ALT ACQUIRER 62%  O left=1400 \u2192 x=1100 \u2192 up to y=750 \u2192 H left=1240 -->\n    <path d=\"M 1400 1508 L 1100 1508 L 1100 750 L 1234 750\" fill=\"none\" stroke=\"#FFB300\" stroke-width=\"2.5\" stroke-dasharray=\"10,5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- S \u2192 H   FEEDSBACK  S left=900 \u2192 x=700 \u2192 up to y=750 \u2192 H left=1240 -->\n    <path d=\"M 900 1893 L 700 1893 L 700 750 L 1234 750\" fill=\"none\" stroke=\"#AA7700\" stroke-width=\"2\" stroke-dasharray=\"8,5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 3 \u2014 ARROW LABEL BACKDROPS\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <rect x=\"686\"  y=\"362\"  width=\"148\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"868\"  y=\"243\"  width=\"76\"  height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"960\"  y=\"362\"  width=\"196\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"1168\" y=\"243\"  width=\"62\"  height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"1668\" y=\"1274\" width=\"44\"  height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"702\"  y=\"1272\" width=\"160\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"1722\" y=\"1374\" width=\"196\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"1830\" y=\"1576\" width=\"196\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"1080\" y=\"1486\" width=\"318\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n    <rect x=\"600\"  y=\"1360\" width=\"220\" height=\"22\" fill=\"#000\" opacity=\"0.9\"\/>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 4 \u2014 ARROW LABEL TEXT\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <text x=\"760\"  y=\"379\"  text-anchor=\"middle\" font-size=\"14\" fill=\"#CC2200\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">BLOCK<\/text>\n    <text x=\"906\"  y=\"260\"  text-anchor=\"middle\" font-size=\"14\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">PASS<\/text>\n    <text x=\"1058\" y=\"379\"  text-anchor=\"middle\" font-size=\"14\" fill=\"#CC2200\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">DUPLICATE<\/text>\n    <text x=\"1199\" y=\"260\"  text-anchor=\"middle\" font-size=\"14\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">PASS<\/text>\n    <text x=\"1690\" y=\"1291\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">3DS<\/text>\n    <text x=\"782\"  y=\"1289\" text-anchor=\"middle\" font-size=\"14\" fill=\"#448800\" font-family=\"'Share Tech Mono',monospace\">SUCCESS<\/text>\n    <text x=\"1820\" y=\"1391\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">SOFT DECLINE<\/text>\n    <text x=\"1928\" y=\"1593\" text-anchor=\"middle\" font-size=\"14\" fill=\"#CC2200\" font-family=\"'Share Tech Mono',monospace\">HARD DECLINE<\/text>\n    <text x=\"1239\" y=\"1503\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">ALT ACQUIRER \u00b7 62% retry rate<\/text>\n    <text x=\"710\"  y=\"1377\" text-anchor=\"middle\" font-size=\"14\" fill=\"#AA7700\" font-family=\"'Share Tech Mono',monospace\">\u27f2 feedsback<\/text>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 5 \u2014 ALL NODE SHAPES\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <!-- A  pill  cx=140  cy=260  x=20   y=224 w=240 h=72 rx=36 -->\n    <rect x=\"20\"   y=\"224\" width=\"240\" height=\"72\" rx=\"36\" fill=\"#0a0300\" stroke=\"#FF6600\"  stroke-width=\"2.5\"\/>\n    <rect x=\"56\"   y=\"224\" width=\"168\" height=\"3\"  fill=\"#FF6600\" opacity=\"0.9\"\/>\n\n    <!-- B  rect  cx=460  cy=260  x=340  y=216 w=240 h=88 -->\n    <rect x=\"340\"  y=\"216\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"340\"  y=\"216\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FF6600\" opacity=\"0.8\"\/>\n\n    <!-- C  diamond  cx=760  cy=260  hw=105 hh=70 -->\n    <polygon points=\"760,190 865,260 760,330 655,260\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n\n    <!-- D  pill  cx=760  cy=476  x=640  y=440 w=240 h=72 rx=36 -->\n    <rect x=\"640\"  y=\"440\" width=\"240\" height=\"72\" rx=\"36\" fill=\"#0a0300\" stroke=\"#CC2200\"  stroke-width=\"2\"\/>\n    <rect x=\"676\"  y=\"440\" width=\"168\" height=\"3\"  fill=\"#CC2200\" opacity=\"0.8\"\/>\n\n    <!-- E  diamond  cx=1060 cy=260  hw=105 hh=70 -->\n    <polygon points=\"1060,190 1165,260 1060,330 955,260\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n\n    <!-- F  pill  cx=1060 cy=476  x=940  y=440 w=240 h=72 rx=36 -->\n    <rect x=\"940\"  y=\"440\" width=\"240\" height=\"72\" rx=\"36\" fill=\"#0a0300\" stroke=\"#CC2200\"  stroke-width=\"2\"\/>\n    <rect x=\"976\"  y=\"440\" width=\"168\" height=\"3\"  fill=\"#CC2200\" opacity=\"0.8\"\/>\n\n    <!-- G  rect  cx=1360 cy=260  x=1240 y=216 w=240 h=88 -->\n    <rect x=\"1240\" y=\"216\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1240\" y=\"216\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FFB300\" opacity=\"0.8\"\/>\n\n    <!-- H  rect  cx=1360 cy=750  x=1240 y=706 w=240 h=88 -->\n    <rect x=\"1240\" y=\"706\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1240\" y=\"706\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FFB300\" opacity=\"0.8\"\/>\n\n    <!-- I  diamond  cx=1640 cy=750  hw=105 hh=70 -->\n    <polygon points=\"1640,680 1745,750 1640,820 1535,750\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n\n    <!-- J  rect  cx=1920 cy=650  x=1800 y=606 w=240 h=88 -->\n    <rect x=\"1800\" y=\"606\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1800\" y=\"606\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FFB300\" opacity=\"0.7\"\/>\n\n    <!-- K  rect  cx=1920 cy=838  x=1800 y=794 w=240 h=88 -->\n    <rect x=\"1800\" y=\"794\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1800\" y=\"794\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FFB300\" opacity=\"0.7\"\/>\n\n    <!-- L  rect  cx=1920 cy=1026 x=1800 y=982 w=240 h=88 -->\n    <rect x=\"1800\" y=\"982\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1800\" y=\"982\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FFB300\" opacity=\"0.7\"\/>\n\n    <!-- M  diamond  cx=1820 cy=1290 hw=105 hh=70 -->\n    <polygon points=\"1820,1220 1925,1290 1820,1360 1715,1290\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n\n    <!-- N  pill  cx=1540 cy=1290  x=1420 y=1254 w=240 h=72 rx=36 -->\n    <rect x=\"1420\" y=\"1254\" width=\"240\" height=\"72\" rx=\"36\" fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1456\" y=\"1254\" width=\"168\" height=\"3\"  fill=\"#FF6600\" opacity=\"0.8\"\/>\n\n    <!-- O  rect  cx=1680 cy=1508  x=1400 y=1460 w=560 h=96 -->\n    <rect x=\"1400\" y=\"1460\" width=\"560\" height=\"96\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"1400\" y=\"1460\" width=\"560\" height=\"3\"  rx=\"2\"  fill=\"#FF6600\" opacity=\"0.8\"\/>\n\n    <!-- P  pill  cx=1840 cy=1696  x=1720 y=1660 w=240 h=72 rx=36 -->\n    <rect x=\"1720\" y=\"1660\" width=\"240\" height=\"72\" rx=\"36\" fill=\"#0a0300\" stroke=\"#CC2200\"  stroke-width=\"2\"\/>\n    <rect x=\"1756\" y=\"1660\" width=\"168\" height=\"3\"  fill=\"#CC2200\" opacity=\"0.8\"\/>\n\n    <!-- Q  rect  cx=1000 cy=1504  x=880  y=1460 w=240 h=88 -->\n    <rect x=\"880\"  y=\"1460\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"880\"  y=\"1460\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#448800\" opacity=\"0.8\"\/>\n\n    <!-- R  rect  cx=1000 cy=1704  x=880  y=1660 w=240 h=88 -->\n    <rect x=\"880\"  y=\"1660\" width=\"240\" height=\"88\" rx=\"2\"  fill=\"#0a0300\" stroke=\"#CC4400\"  stroke-width=\"2\"\/>\n    <rect x=\"880\"  y=\"1660\" width=\"240\" height=\"3\"  rx=\"2\"  fill=\"#FF6600\" opacity=\"0.8\"\/>\n\n    <!-- S  cylinder  cx=1000  top_cy=1868 rx=100 ry=14 body=50 bot_cy=1918 -->\n    <line x1=\"900\"  y1=\"1868\" x2=\"900\"  y2=\"1918\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n    <line x1=\"1100\" y1=\"1868\" x2=\"1100\" y2=\"1918\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n    <ellipse cx=\"1000\" cy=\"1918\" rx=\"100\" ry=\"14\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n    <rect x=\"900\"  y=\"1868\" width=\"200\" height=\"50\" fill=\"#0a0300\"\/>\n    <ellipse cx=\"1000\" cy=\"1868\" rx=\"100\" ry=\"14\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"2\"\/>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 6 \u2014 ALL NODE TEXT\n    \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <!-- A -->\n    <text x=\"140\"  y=\"254\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">MERCHANT API<\/text>\n    <text x=\"140\"  y=\"276\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">REQUEST<\/text>\n\n    <!-- B -->\n    <text x=\"460\"  y=\"248\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">VALIDATE<\/text>\n    <text x=\"460\"  y=\"268\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">amount \u00b7 currency<\/text>\n    <text x=\"460\"  y=\"288\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">card \u00b7 MCC<\/text>\n\n    <!-- C -->\n    <text x=\"760\"  y=\"248\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">PRE-RISK<\/text>\n    <text x=\"760\"  y=\"267\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">VelocityScore<\/text>\n    <text x=\"760\"  y=\"284\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">MCC arbitrage<\/text>\n\n    <!-- D -->\n    <text x=\"760\"  y=\"470\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#CC2200\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ERR_RISK<\/text>\n    <text x=\"760\"  y=\"492\" text-anchor=\"middle\" font-size=\"14\" fill=\"#CC2200\" font-family=\"'Share Tech Mono',monospace\">_REJECTED<\/text>\n\n    <!-- E -->\n    <text x=\"1060\" y=\"252\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">DEDUP<\/text>\n    <text x=\"1060\" y=\"272\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">cache check<\/text>\n\n    <!-- F -->\n    <text x=\"1060\" y=\"470\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#CC2200\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ERR_DO_NOT<\/text>\n    <text x=\"1060\" y=\"492\" text-anchor=\"middle\" font-size=\"14\" fill=\"#CC2200\" font-family=\"'Share Tech Mono',monospace\">_RETRY<\/text>\n\n    <!-- G -->\n    <text x=\"1360\" y=\"248\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">GATEWAY ROUTER<\/text>\n    <text x=\"1360\" y=\"268\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">forMerchant()<\/text>\n    <text x=\"1360\" y=\"286\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">AcquirerCredential env-scoped<\/text>\n\n    <!-- H -->\n    <text x=\"1360\" y=\"738\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ROUTE SCORING<\/text>\n    <text x=\"1360\" y=\"759\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">EV formula \u00b7 RouteScore<\/text>\n    <text x=\"1360\" y=\"779\" text-anchor=\"middle\" font-size=\"13\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">statistical routing matrix<\/text>\n\n    <!-- I -->\n    <text x=\"1640\" y=\"742\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">ACQUIRER<\/text>\n    <text x=\"1640\" y=\"762\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">ADAPTER<\/text>\n\n    <!-- J -->\n    <text x=\"1920\" y=\"640\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">RAPYD<\/text>\n    <text x=\"1920\" y=\"662\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">VALITOR<\/text>\n\n    <!-- K -->\n    <text x=\"1920\" y=\"844\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">XPATE<\/text>\n\n    <!-- L -->\n    <text x=\"1920\" y=\"1026\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">QASHPAY<\/text>\n\n    <!-- M -->\n    <text x=\"1820\" y=\"1282\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">ISSUER<\/text>\n    <text x=\"1820\" y=\"1302\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">RESPONSE<\/text>\n\n    <!-- N -->\n    <text x=\"1540\" y=\"1284\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FF9944\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">RETURN<\/text>\n    <text x=\"1540\" y=\"1306\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">redirect_url \u2192 merchant<\/text>\n\n    <!-- O -->\n    <text x=\"1680\" y=\"1494\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">P(retry_success)<\/text>\n    <text x=\"1680\" y=\"1516\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">DeclineCode \u00b7 Issuer \u00b7 Acquirer \u00b7 TimeDelay \u00b7 3DS<\/text>\n    <text x=\"1680\" y=\"1536\" text-anchor=\"middle\" font-size=\"13\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">probabilistic retry model<\/text>\n\n    <!-- P -->\n    <text x=\"1840\" y=\"1690\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#CC2200\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ERR_DO_NOT<\/text>\n    <text x=\"1840\" y=\"1712\" text-anchor=\"middle\" font-size=\"14\" fill=\"#CC2200\" font-family=\"'Share Tech Mono',monospace\">_RETRY<\/text>\n\n    <!-- Q -->\n    <text x=\"1000\" y=\"1490\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#448800\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">STORE TOKEN<\/text>\n    <text x=\"1000\" y=\"1511\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">gatewayCardToken<\/text>\n    <text x=\"1000\" y=\"1530\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">PaymentInstrument record<\/text>\n\n    <!-- R -->\n    <text x=\"1000\" y=\"1692\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">WRITE TX<\/text>\n    <text x=\"1000\" y=\"1713\" text-anchor=\"middle\" font-size=\"14\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">acquirer_trans_id \u00b7 auth_code<\/text>\n    <text x=\"1000\" y=\"1732\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">status \u00b7 timestamp<\/text>\n\n    <!-- S -->\n    <text x=\"1000\" y=\"1897\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"bold\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">UPDATE ROUTING<\/text>\n    <text x=\"1000\" y=\"1916\" text-anchor=\"middle\" font-size=\"13\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">statistical matrix<\/text>\n\n    <!--\n    FINAL CHECK\n    max_x: trunk x=2060, J\/K\/L right=2040 \u2192 canvas_w=2120 \u2713\n    max_y: S bot cy=1918+14=1932 \u2192 canvas_h=2020 \u2713\n    P right: 1720+240=1960 < 2120 \u2713\n    O right: 1400+560=1960 < 2120 \u2713\n    M right: 1925 < 2120 \u2713\n    J\/K\/L gaps: J\u2013K=100px, K\u2013L=100px \u2713\n    All arrows before all nodes \u2713\n    Horizontal arrows at exact row cy \u2713\n    Vertical arrows at exact col cx \u2713\n    No arrow through any node bounding box \u2713\n    -->\n\n  <\/svg>\n\n  <div class=\"tds-footer\">\n    <span>FLOWCHART \u00b7 EVX DYNAMIC ROUTING ENGINE \u00b7 TRANSACTION AUTHORISATION LIFECYCLE<\/span>\n    <span>ORANGE = PRIMARY FLOW &nbsp;|&nbsp; DASHED AMBER = RETRY\/FEEDBACK &nbsp;|&nbsp; RED = ERROR TERMINUS &nbsp;|&nbsp; GREEN = SUCCESS &nbsp;|&nbsp; \u27f2 = FEEDBACK LOOP<\/span>\n  <\/div>\n\n<\/div>\n\n<style>\n  .tds-root {\n    background: #000000;\n    background-image: repeating-linear-gradient(\n      0deg,\n      transparent, transparent 2px,\n      rgba(255,102,0,0.018) 2px, rgba(255,102,0,0.018) 4px\n    );\n    font-family: 'Share Tech Mono', 'Courier New', monospace;\n    padding: 24px;\n    box-sizing: border-box;\n  }\n  .tds-root *, .tds-root *::before, .tds-root *::after {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n  }\n  .tds-root .tds-header {\n    border: 1px solid #CC4400;\n    background: #080200;\n    padding: 12px 20px;\n    margin-bottom: 16px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    box-shadow: 0 0 16px rgba(255,102,0,0.12);\n  }\n  .tds-root .tds-title {\n    font-size: 14px;\n    font-weight: 700;\n    letter-spacing: 0.14em;\n    color: #FFB300;\n    text-transform: uppercase;\n  }\n  .tds-root .tds-meta {\n    font-size: 11px;\n    color: #553311;\n    letter-spacing: 0.08em;\n  }\n  .tds-root .tds-dot {\n    display: inline-block;\n    width: 8px; height: 8px;\n    border-radius: 50%;\n    background: #FF6600;\n    margin-right: 10px;\n    box-shadow: 0 0 8px #FF6600;\n    animation: tds-blink 2s step-end infinite;\n  }\n  @keyframes tds-blink { 0%,100%{opacity:1} 50%{opacity:0.15} }\n  .tds-root .tds-footer {\n    margin-top: 16px;\n    border-top: 1px solid #331100;\n    padding-top: 10px;\n    display: flex;\n    justify-content: space-between;\n    font-size: 11px;\n    color: #553311;\n    letter-spacing: 0.08em;\n  }\n<\/style>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diagram 3 &#8211; Probability models and EV composition<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This diagram shows how the five probability models compose into the EV formula, route score, and final routing decision. The routing matrix sits at the centre &#8211; updated by transaction outcomes on the right and read by the approval model on the left &#8211; making the system self-improving with each completed transaction. Storing routing configuration in the data model rather than application logic was the decision that made this feedback loop possible without code deploys.<\/p>\n\n\n\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Share+Tech+Mono&#038;display=swap\" rel=\"stylesheet\">\n\n<div class=\"tds-root\">\n\n  <div class=\"tds-header\">\n    <div class=\"tds-title\"><span class=\"tds-dot\"><\/span>EVX DYNAMIC ROUTING ENGINE \u2014 PROBABILITY MODELS &amp; EV SCORING<\/div>\n    <div class=\"tds-meta\">SOFTLEMON ROUTING ENGINE \u00b7 DEEP-DIVE ARCHITECTURE \u00b7 MULTI-DIMENSIONAL ACQUIRER SCORING<\/div>\n  <\/div>\n\n  <svg viewBox=\"0 0 680 900\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:100%;display:block;font-family:'Share Tech Mono','Courier New',monospace;\">\n\n    <defs>\n      <!-- open chevron arrowheads, colour matched per flow type -->\n      <marker id=\"tds-ah-orange\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto\">\n        <path d=\"M1 1L9 5L1 9\" fill=\"none\" stroke=\"#FF6600\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n      <\/marker>\n      <marker id=\"tds-ah-amber\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto\">\n        <path d=\"M1 1L9 5L1 9\" fill=\"none\" stroke=\"#FFB300\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n      <\/marker>\n      <marker id=\"tds-ah-dim\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto\">\n        <path d=\"M1 1L9 5L1 9\" fill=\"none\" stroke=\"#993300\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n      <\/marker>\n    <\/defs>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 0 \u2014 ARROWS (drawn first, behind all nodes)\n         All coordinates are exact node centres.\n         Node centres computed as: cx = x + w\/2, cy = y + h\/2\n         \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <!--\n      NODE CENTRE REFERENCE (x, y, w, h \u2192 cx, cy)\n      INCOMING TRANSACTION   : 230,34,220,44   \u2192 340, 56\n      CARD SIGNALS           : 18,108,180,96   \u2192 108, 156\n      BEHAVIOUR SIGNALS      : 18,224,180,96   \u2192 108, 272\n      MERCHANT CONTEXT       : 18,340,180,96   \u2192 108, 388\n      CUSTOMER VALUE         : 18,456,180,72   \u2192 108, 492\n      P(APPROVAL)            : 232,108,216,72  \u2192 340, 144\n      P(FRAUD)               : 232,204,216,72  \u2192 340, 240\n      P(CHARGEBACK)          : 232,300,216,72  \u2192 340, 336\n      VELOCITY SCORE         : 232,396,216,52  \u2192 340, 422\n      STAT ROUTING MATRIX    : 232,468,216,52  \u2192 340, 494\n      EV FORMULA             : 470,108,190,96  \u2192 565, 156\n      ROUTE SCORE            : 470,222,190,100 \u2192 565, 272\n      CANDIDATE ROUTES       : 470,342,190,116 \u2192 565, 400\n      ROUTE\u2192ACQUIRER B       : 470,476,190,44  \u2192 565, 498\n      ISSUER RESPONSE        : 18,596,158,54   \u2192 97,  623\n      P(RETRY_SUCCESS)       : 222,596,220,54  \u2192 332, 623\n      RETRY DECISION         : 462,596,180,54  \u2192 552, 623\n      HARD STOP              : 18,670,130,44   \u2192 83,  692\n      RE-ENTER ROUTER        : 192,670,160,44  \u2192 272, 692\n      NON-3DS PATH           : 366,670,178,44  \u2192 455, 692\n      STORE VAULT TOKEN      : 18,752,192,54   \u2192 114, 779\n      WRITE TRANSACTION      : 224,752,190,54  \u2192 319, 779\n      UPDATE ROUTING MATRIX  : 428,752,234,54  \u2192 545, 779\n    -->\n\n    <!-- INCOMING TRANSACTION (340,56) \u2192 P(APPROVAL) centre (340,144) \u2014 straight down -->\n    <line x1=\"340\" y1=\"56\" x2=\"340\" y2=\"144\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- CARD SIGNALS (108,156) \u2192 P(APPROVAL) (340,144) -->\n    <line x1=\"108\" y1=\"156\" x2=\"340\" y2=\"144\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- BEHAVIOUR SIGNALS (108,272) \u2192 P(FRAUD) (340,240) -->\n    <line x1=\"108\" y1=\"272\" x2=\"340\" y2=\"240\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- MERCHANT CONTEXT (108,388) \u2192 P(CHARGEBACK) (340,336) -->\n    <line x1=\"108\" y1=\"388\" x2=\"340\" y2=\"336\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- CUSTOMER VALUE (108,492) \u2192 STAT ROUTING MATRIX (340,494) \u2014 near-horizontal -->\n    <line x1=\"108\" y1=\"492\" x2=\"340\" y2=\"494\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- P(APPROVAL) (340,144) \u2192 EV FORMULA (565,156) -->\n    <line x1=\"340\" y1=\"144\" x2=\"565\" y2=\"156\" stroke=\"#FFB300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- P(FRAUD) (340,240) \u2192 EV FORMULA (565,156) -->\n    <line x1=\"340\" y1=\"240\" x2=\"565\" y2=\"156\" stroke=\"#FFB300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- P(CHARGEBACK) (340,336) \u2192 EV FORMULA (565,156) \u2014 diagonal up-right -->\n    <line x1=\"340\" y1=\"336\" x2=\"565\" y2=\"156\" stroke=\"#FFB300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- VELOCITY SCORE (340,422) \u2192 ROUTE SCORE (565,272) \u2014 dashed, secondary input -->\n    <line x1=\"340\" y1=\"422\" x2=\"565\" y2=\"272\" stroke=\"#993300\" stroke-width=\"1\" stroke-dasharray=\"4 3\" marker-end=\"url(#tds-ah-dim)\"\/>\n\n    <!-- STAT ROUTING MATRIX (340,494) \u2192 ROUTE SCORE (565,272) -->\n    <line x1=\"340\" y1=\"494\" x2=\"565\" y2=\"272\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- EV FORMULA (565,156) \u2192 ROUTE SCORE (565,272) \u2014 straight down -->\n    <line x1=\"565\" y1=\"156\" x2=\"565\" y2=\"272\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- ROUTE SCORE (565,272) \u2192 CANDIDATE ROUTES (565,400) \u2014 straight down -->\n    <line x1=\"565\" y1=\"272\" x2=\"565\" y2=\"400\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- CANDIDATE ROUTES (565,400) \u2192 ROUTE\u2192ACQUIRER B (565,498) \u2014 straight down -->\n    <line x1=\"565\" y1=\"400\" x2=\"565\" y2=\"498\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- ROUTE\u2192ACQUIRER B (565,498) \u2192 ISSUER RESPONSE (97,623) \u2014 down-left to soft decline -->\n    <line x1=\"565\" y1=\"498\" x2=\"97\" y2=\"623\" stroke=\"#993300\" stroke-width=\"1\" stroke-dasharray=\"4 3\" marker-end=\"url(#tds-ah-dim)\"\/>\n\n    <!-- ISSUER RESPONSE (97,623) \u2192 P(RETRY_SUCCESS) (332,623) \u2014 horizontal -->\n    <line x1=\"97\" y1=\"623\" x2=\"332\" y2=\"623\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- P(RETRY_SUCCESS) (332,623) \u2192 RETRY DECISION (552,623) \u2014 horizontal -->\n    <line x1=\"332\" y1=\"623\" x2=\"552\" y2=\"623\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- ISSUER RESPONSE (97,623) \u2192 HARD STOP (83,692) \u2014 near-vertical -->\n    <line x1=\"97\" y1=\"623\" x2=\"83\" y2=\"692\" stroke=\"#993300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-dim)\"\/>\n\n    <!-- P(RETRY_SUCCESS) (332,623) \u2192 RE-ENTER ROUTER (272,692) -->\n    <line x1=\"332\" y1=\"623\" x2=\"272\" y2=\"692\" stroke=\"#FF6600\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-orange)\"\/>\n\n    <!-- RETRY DECISION (552,623) \u2192 NON-3DS PATH (455,692) -->\n    <line x1=\"552\" y1=\"623\" x2=\"455\" y2=\"692\" stroke=\"#FFB300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- HARD STOP \u2192 STORE VAULT TOKEN (114,779) \u2014 down -->\n    <line x1=\"83\" y1=\"692\" x2=\"114\" y2=\"779\" stroke=\"#993300\" stroke-width=\"1\" stroke-dasharray=\"4 3\" marker-end=\"url(#tds-ah-dim)\"\/>\n\n    <!-- RE-ENTER ROUTER (272,692) \u2192 WRITE TRANSACTION (319,779) -->\n    <line x1=\"272\" y1=\"692\" x2=\"319\" y2=\"779\" stroke=\"#FFB300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- NON-3DS PATH (455,692) \u2192 UPDATE ROUTING MATRIX (545,779) -->\n    <line x1=\"455\" y1=\"692\" x2=\"545\" y2=\"779\" stroke=\"#FFB300\" stroke-width=\"1.5\" marker-end=\"url(#tds-ah-amber)\"\/>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 1 \u2014 SECTION CHROME (behind nodes, above arrows)\n         \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <!-- column dividers -->\n    <line x1=\"222\" y1=\"30\" x2=\"222\" y2=\"720\" stroke=\"#331100\" stroke-width=\"0.5\" stroke-dasharray=\"3 3\"\/>\n    <line x1=\"460\" y1=\"30\" x2=\"460\" y2=\"720\" stroke=\"#331100\" stroke-width=\"0.5\" stroke-dasharray=\"3 3\"\/>\n\n    <!-- SOFT DECLINE section banner -->\n    <rect x=\"0\" y=\"556\" width=\"680\" height=\"18\" fill=\"#0D0500\"\/>\n    <rect x=\"0\" y=\"556\" width=\"680\" height=\"1\" fill=\"#FF6600\" opacity=\"0.5\"\/>\n    <rect x=\"0\" y=\"573\" width=\"680\" height=\"1\" fill=\"#993300\" opacity=\"0.4\"\/>\n    <text x=\"340\" y=\"569\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">\u25b6 SOFT DECLINE RECOVERY<\/text>\n\n    <!-- ON SUCCESS section banner -->\n    <rect x=\"0\" y=\"726\" width=\"680\" height=\"18\" fill=\"#0D0800\"\/>\n    <rect x=\"0\" y=\"726\" width=\"680\" height=\"1\" fill=\"#FFB300\" opacity=\"0.5\"\/>\n    <rect x=\"0\" y=\"743\" width=\"680\" height=\"1\" fill=\"#AA7700\" opacity=\"0.4\"\/>\n    <text x=\"340\" y=\"739\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">\u25b6 ON SUCCESS<\/text>\n\n    <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n         LAYER 2 \u2014 NODES (drawn last, on top of arrows)\n         \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n\n    <!-- column labels -->\n    <text x=\"118\" y=\"22\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">INPUTS<\/text>\n    <text x=\"340\" y=\"22\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">PROBABILITY MODELS<\/text>\n    <text x=\"562\" y=\"22\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"2\" font-family=\"'Share Tech Mono',monospace\">DECISION<\/text>\n\n    <!-- INCOMING TRANSACTION  cx=340, cy=56 -->\n    <rect x=\"230\" y=\"34\" width=\"220\" height=\"44\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"230\" y=\"34\" width=\"220\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"340\" y=\"54\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">INCOMING TRANSACTION<\/text>\n    <text x=\"340\" y=\"69\" text-anchor=\"middle\" font-size=\"8.5\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">entry point<\/text>\n\n    <!-- CARD SIGNALS  cx=108, cy=156 -->\n    <rect x=\"18\" y=\"108\" width=\"180\" height=\"96\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"18\" y=\"108\" width=\"180\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"108\" y=\"128\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">CARD SIGNALS<\/text>\n    <text x=\"108\" y=\"148\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">BIN \u00b7 card type<\/text>\n    <text x=\"108\" y=\"164\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">issuer bank<\/text>\n    <text x=\"108\" y=\"180\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">currency \u00b7 country<\/text>\n\n    <!-- BEHAVIOUR SIGNALS  cx=108, cy=272 -->\n    <rect x=\"18\" y=\"224\" width=\"180\" height=\"96\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"18\" y=\"224\" width=\"180\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"108\" y=\"244\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">BEHAVIOUR SIGNALS<\/text>\n    <text x=\"108\" y=\"262\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">velocity score<\/text>\n    <text x=\"108\" y=\"278\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">device fingerprint<\/text>\n    <text x=\"108\" y=\"294\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">geo mismatch<\/text>\n\n    <!-- MERCHANT CONTEXT  cx=108, cy=388 -->\n    <rect x=\"18\" y=\"340\" width=\"180\" height=\"96\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"18\" y=\"340\" width=\"180\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"108\" y=\"360\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">MERCHANT CONTEXT<\/text>\n    <text x=\"108\" y=\"378\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">MCC \u00b7 vertical<\/text>\n    <text x=\"108\" y=\"394\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">chargeback ratio<\/text>\n    <text x=\"108\" y=\"410\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">rolling reserve<\/text>\n\n    <!-- CUSTOMER VALUE  cx=108, cy=492 -->\n    <rect x=\"18\" y=\"456\" width=\"180\" height=\"72\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"18\" y=\"456\" width=\"180\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"108\" y=\"476\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">CUSTOMER VALUE<\/text>\n    <text x=\"108\" y=\"494\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">VIP \/ new player<\/text>\n    <text x=\"108\" y=\"510\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">historical success<\/text>\n\n    <!-- P(APPROVAL)  cx=340, cy=144 -->\n    <rect x=\"232\" y=\"108\" width=\"216\" height=\"72\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"232\" y=\"108\" width=\"216\" height=\"2\" fill=\"#FFB300\" opacity=\"0.9\"\/>\n    <text x=\"340\" y=\"128\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">P(APPROVAL)<\/text>\n    <text x=\"340\" y=\"146\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">BIN \u00b7 Acquirer \u00b7 MCC<\/text>\n    <text x=\"340\" y=\"162\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Amount \u00b7 Country \u00b7 Device \u00b7 3DS \u00b7 Velocity<\/text>\n\n    <!-- P(FRAUD)  cx=340, cy=240 -->\n    <rect x=\"232\" y=\"204\" width=\"216\" height=\"72\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"232\" y=\"204\" width=\"216\" height=\"2\" fill=\"#FFB300\" opacity=\"0.9\"\/>\n    <text x=\"340\" y=\"224\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">P(FRAUD)<\/text>\n    <text x=\"340\" y=\"242\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Device \u00b7 Velocity \u00b7 Geo \u00b7 BIN<\/text>\n    <text x=\"340\" y=\"258\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Amount \u00b7 Merchant \u00b7 Behaviour<\/text>\n\n    <!-- P(CHARGEBACK)  cx=340, cy=336 -->\n    <rect x=\"232\" y=\"300\" width=\"216\" height=\"72\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"232\" y=\"300\" width=\"216\" height=\"2\" fill=\"#FFB300\" opacity=\"0.9\"\/>\n    <text x=\"340\" y=\"320\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">P(CHARGEBACK)<\/text>\n    <text x=\"340\" y=\"338\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Merchant \u00b7 PlayerType \u00b7 Issuer<\/text>\n    <text x=\"340\" y=\"354\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">MCC \u00b7 Amount \u00b7 History<\/text>\n\n    <!-- VELOCITY SCORE  cx=340, cy=422 -->\n    <rect x=\"232\" y=\"396\" width=\"216\" height=\"52\" rx=\"1\" fill=\"#0a0300\" stroke=\"#993300\" stroke-width=\"1\" stroke-dasharray=\"4 3\"\/>\n    <text x=\"340\" y=\"418\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FF9944\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">VELOCITY SCORE<\/text>\n    <text x=\"340\" y=\"435\" text-anchor=\"middle\" font-size=\"9\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">actual txns \/ expected txns (window)<\/text>\n\n    <!-- STAT ROUTING MATRIX  cx=340, cy=494 -->\n    <rect x=\"232\" y=\"468\" width=\"216\" height=\"52\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"232\" y=\"468\" width=\"216\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"340\" y=\"488\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">STATISTICAL ROUTING MATRIX<\/text>\n    <text x=\"340\" y=\"505\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">live P(approval|BIN,MCC,amount,acquirer)<\/text>\n\n    <!-- EV FORMULA  cx=565, cy=156 -->\n    <rect x=\"470\" y=\"108\" width=\"190\" height=\"96\" rx=\"1\" fill=\"#0a0300\" stroke=\"#FF6600\" stroke-width=\"1.5\"\/>\n    <rect x=\"470\" y=\"108\" width=\"190\" height=\"2\" fill=\"#FF6600\" opacity=\"0.9\"\/>\n    <text x=\"565\" y=\"128\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">EV FORMULA<\/text>\n    <text x=\"565\" y=\"148\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">(P_approve \u00d7 Revenue)<\/text>\n    <text x=\"565\" y=\"164\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">\u2212 (P_fraud \u00d7 FraudLoss)<\/text>\n    <text x=\"565\" y=\"180\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">\u2212 (P_cb \u00d7 CBcost) \u2212 Fees<\/text>\n\n    <!-- ROUTE SCORE  cx=565, cy=272 -->\n    <rect x=\"470\" y=\"222\" width=\"190\" height=\"100\" rx=\"1\" fill=\"#0a0300\" stroke=\"#FF6600\" stroke-width=\"1.5\"\/>\n    <rect x=\"470\" y=\"222\" width=\"190\" height=\"2\" fill=\"#FF6600\" opacity=\"0.9\"\/>\n    <text x=\"565\" y=\"242\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ROUTE SCORE<\/text>\n    <text x=\"565\" y=\"260\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">(w\u2081 \u00d7 P_approve)<\/text>\n    <text x=\"565\" y=\"276\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">\u2212 (w\u2082 \u00d7 P_fraud)<\/text>\n    <text x=\"565\" y=\"292\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">\u2212 (w\u2083 \u00d7 P_cb) \u2212 (w\u2084 \u00d7 Cost)<\/text>\n    <text x=\"565\" y=\"308\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFB300\" font-family=\"'Share Tech Mono',monospace\">+ (w\u2085 \u00d7 CustomerValue)<\/text>\n\n    <!-- CANDIDATE ROUTES  cx=565, cy=400 -->\n    <rect x=\"470\" y=\"342\" width=\"190\" height=\"116\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"470\" y=\"342\" width=\"190\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"565\" y=\"362\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">CANDIDATE ROUTES<\/text>\n    <line x1=\"470\" y1=\"372\" x2=\"660\" y2=\"372\" stroke=\"#331100\" stroke-width=\"0.5\"\/>\n    <text x=\"484\" y=\"385\" text-anchor=\"start\" font-size=\"9\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">Route<\/text>\n    <text x=\"565\" y=\"385\" text-anchor=\"middle\" font-size=\"9\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">P_approve<\/text>\n    <text x=\"648\" y=\"385\" text-anchor=\"end\" font-size=\"9\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">EV<\/text>\n    <text x=\"484\" y=\"402\" text-anchor=\"start\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Acquirer A<\/text>\n    <text x=\"565\" y=\"402\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">91%<\/text>\n    <text x=\"648\" y=\"402\" text-anchor=\"end\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">\u00a32.90<\/text>\n    <rect x=\"470\" y=\"408\" width=\"190\" height=\"16\" fill=\"#0D0500\"\/>\n    <text x=\"484\" y=\"420\" text-anchor=\"start\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" font-family=\"'Share Tech Mono',monospace\">Acquirer B \u2713<\/text>\n    <text x=\"565\" y=\"420\" text-anchor=\"middle\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" font-family=\"'Share Tech Mono',monospace\">86%<\/text>\n    <text x=\"648\" y=\"420\" text-anchor=\"end\" font-size=\"9.5\" font-weight=\"bold\" fill=\"#FF6600\" font-family=\"'Share Tech Mono',monospace\">\u00a33.10<\/text>\n    <text x=\"484\" y=\"437\" text-anchor=\"start\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Acquirer C<\/text>\n    <text x=\"565\" y=\"437\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">94%<\/text>\n    <text x=\"648\" y=\"437\" text-anchor=\"end\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">\u00a31.20<\/text>\n\n    <!-- ROUTE \u2192 ACQUIRER B  cx=565, cy=498 -->\n    <rect x=\"470\" y=\"476\" width=\"190\" height=\"44\" rx=\"1\" fill=\"#0a0300\" stroke=\"#FF6600\" stroke-width=\"2\"\/>\n    <rect x=\"470\" y=\"476\" width=\"190\" height=\"2\" fill=\"#FF6600\"\/>\n    <rect x=\"470\" y=\"518\" width=\"190\" height=\"2\" fill=\"#FF6600\"\/>\n    <text x=\"565\" y=\"496\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FF6600\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">\u25b6 ROUTE \u2192 ACQUIRER B<\/text>\n    <text x=\"565\" y=\"512\" text-anchor=\"middle\" font-size=\"8.5\" fill=\"#FF9944\" font-family=\"'Share Tech Mono',monospace\">highest EV selected<\/text>\n\n    <!-- ISSUER RESPONSE  cx=97, cy=623 -->\n    <rect x=\"18\" y=\"596\" width=\"158\" height=\"54\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"18\" y=\"596\" width=\"158\" height=\"2\" fill=\"#FF6600\" opacity=\"0.8\"\/>\n    <text x=\"97\" y=\"616\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">ISSUER RESPONSE<\/text>\n    <text x=\"97\" y=\"634\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">05 \u00b7 65 \u00b7 R1 codes<\/text>\n\n    <!-- P(RETRY_SUCCESS)  cx=332, cy=623 -->\n    <rect x=\"222\" y=\"596\" width=\"220\" height=\"54\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"222\" y=\"596\" width=\"220\" height=\"2\" fill=\"#FFB300\" opacity=\"0.9\"\/>\n    <text x=\"332\" y=\"616\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">P(RETRY_SUCCESS)<\/text>\n    <text x=\"332\" y=\"634\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">DeclineCode \u00b7 Issuer \u00b7 Acquirer \u00b7 TimeDelay \u00b7 3DS<\/text>\n\n    <!-- RETRY DECISION  cx=552, cy=623 -->\n    <rect x=\"462\" y=\"596\" width=\"180\" height=\"54\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <rect x=\"462\" y=\"596\" width=\"180\" height=\"2\" fill=\"#FFB300\" opacity=\"0.9\"\/>\n    <text x=\"552\" y=\"616\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">RETRY DECISION<\/text>\n    <text x=\"552\" y=\"634\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">Alt. acquirer 62% \u00b7 Same 14%<\/text>\n\n    <!-- HARD STOP  cx=83, cy=692 -->\n    <rect x=\"18\" y=\"670\" width=\"130\" height=\"44\" rx=\"1\" fill=\"#0a0300\" stroke=\"#993300\" stroke-width=\"1\"\/>\n    <text x=\"83\" y=\"697\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#993300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">HARD STOP<\/text>\n\n    <!-- RE-ENTER ROUTER  cx=272, cy=692 -->\n    <rect x=\"192\" y=\"670\" width=\"160\" height=\"44\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <text x=\"272\" y=\"697\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">RE-ENTER ROUTER<\/text>\n\n    <!-- NON-3DS PATH  cx=455, cy=692 -->\n    <rect x=\"366\" y=\"670\" width=\"178\" height=\"44\" rx=\"1\" fill=\"#0a0300\" stroke=\"#CC4400\" stroke-width=\"1\"\/>\n    <text x=\"455\" y=\"697\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">NON-3DS PATH<\/text>\n\n    <!-- STORE VAULT TOKEN  cx=114, cy=779 -->\n    <rect x=\"18\" y=\"752\" width=\"192\" height=\"54\" rx=\"1\" fill=\"#0a0300\" stroke=\"#AA7700\" stroke-width=\"1\"\/>\n    <rect x=\"18\" y=\"752\" width=\"192\" height=\"2\" fill=\"#FFB300\" opacity=\"0.8\"\/>\n    <text x=\"114\" y=\"772\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">STORE VAULT TOKEN<\/text>\n    <text x=\"114\" y=\"790\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">PaymentInstrument record<\/text>\n\n    <!-- WRITE TRANSACTION  cx=319, cy=779 -->\n    <rect x=\"224\" y=\"752\" width=\"190\" height=\"54\" rx=\"1\" fill=\"#0a0300\" stroke=\"#AA7700\" stroke-width=\"1\"\/>\n    <rect x=\"224\" y=\"752\" width=\"190\" height=\"2\" fill=\"#FFB300\" opacity=\"0.8\"\/>\n    <text x=\"319\" y=\"772\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">WRITE TRANSACTION<\/text>\n    <text x=\"319\" y=\"790\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">status \u00b7 acquirer_trans_id<\/text>\n\n    <!-- UPDATE ROUTING MATRIX  cx=545, cy=779 -->\n    <rect x=\"428\" y=\"752\" width=\"234\" height=\"54\" rx=\"1\" fill=\"#0a0300\" stroke=\"#AA7700\" stroke-width=\"1\"\/>\n    <rect x=\"428\" y=\"752\" width=\"234\" height=\"2\" fill=\"#FFB300\" opacity=\"0.8\"\/>\n    <text x=\"545\" y=\"772\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#FFB300\" letter-spacing=\"1\" font-family=\"'Share Tech Mono',monospace\">UPDATE ROUTING MATRIX<\/text>\n    <text x=\"545\" y=\"790\" text-anchor=\"middle\" font-size=\"9\" fill=\"#FFDDAA\" font-family=\"'Share Tech Mono',monospace\">P(approval|\u2026) learns outcome<\/text>\n\n    <!-- feedback caption -->\n    <text x=\"340\" y=\"840\" text-anchor=\"middle\" font-size=\"9\" fill=\"#664422\" font-family=\"'Share Tech Mono',monospace\">\u2191 outcome feeds back into statistical routing matrix on next transaction<\/text>\n\n  <\/svg>\n\n  <div class=\"tds-footer\">\n    <span>ARCHITECTURE DIAGRAM \u00b7 EVX DYNAMIC ROUTING ENGINE \u00b7 PROBABILITY MODELS &amp; EV SCORING<\/span>\n    <span>ORANGE = FORWARD FLOW | AMBER = MODEL OUTPUT | DASHED = SOFT PATH | \u2713 = WINNING ROUTE<\/span>\n  <\/div>\n\n<\/div>\n\n<style>\n  .tds-root {\n    background: #000000;\n    background-image: repeating-linear-gradient(\n      0deg,\n      transparent, transparent 2px,\n      rgba(255,102,0,0.018) 2px, rgba(255,102,0,0.018) 4px\n    );\n    font-family: 'Share Tech Mono', 'Courier New', monospace;\n    padding: 24px;\n    box-sizing: border-box;\n    --tds-bg: #000000;\n    --tds-bg-node: #0a0300;\n    --tds-orange: #FF6600;\n    --tds-amber: #FFB300;\n  }\n\n  .tds-root *, .tds-root *::before, .tds-root *::after {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n  }\n\n  .tds-root .tds-header {\n    border: 1px solid #CC4400;\n    background: #080200;\n    padding: 9px 18px;\n    margin-bottom: 16px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    box-shadow: 0 0 16px rgba(255,102,0,0.12);\n  }\n\n  .tds-root .tds-title {\n    font-size: 13px;\n    font-weight: 700;\n    letter-spacing: 0.14em;\n    color: #FFB300;\n    text-transform: uppercase;\n    font-family: 'Share Tech Mono', 'Courier New', monospace;\n  }\n\n  .tds-root .tds-meta {\n    font-size: 9.5px;\n    color: #553311;\n    letter-spacing: 0.08em;\n    font-family: 'Share Tech Mono', 'Courier New', monospace;\n  }\n\n  .tds-root .tds-dot {\n    display: inline-block;\n    width: 7px;\n    height: 7px;\n    border-radius: 50%;\n    background: #FF6600;\n    margin-right: 10px;\n    box-shadow: 0 0 8px #FF6600;\n    animation: tds-blink 2s step-end infinite;\n  }\n\n  @keyframes tds-blink {\n    0%, 100% { opacity: 1; }\n    50% { opacity: 0.15; }\n  }\n\n  .tds-root .tds-footer {\n    margin-top: 16px;\n    border-top: 1px solid #331100;\n    padding-top: 8px;\n    display: flex;\n    justify-content: space-between;\n    font-size: 8.5px;\n    color: #553311;\n    letter-spacing: 0.08em;\n    font-family: 'Share Tech Mono', 'Courier New', monospace;\n  }\n<\/style>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR The EVX Technologies Ltd payment orchestration platform lifted debit card authorisation rates from 78% to 91% in production. The programme was a zero-to-one infrastructure build targeting clean high-risk merchants &#8211; a segment the mainstream acquiring industry rejects through blunt MCC-level risk categorisation. What made it hard was designing a five-model probabilistic routing architecture and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":44,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-66","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/pages\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=66"}],"version-history":[{"count":11,"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/pages\/66\/revisions"}],"predecessor-version":[{"id":201,"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/pages\/66\/revisions\/201"}],"up":[{"embeddable":true,"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=\/wp\/v2\/pages\/44"}],"wp:attachment":[{"href":"https:\/\/lukaskoren.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}