<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vaibhav Shakya</title>
    <description>The latest articles on DEV Community by Vaibhav Shakya (@vaibhav_shakya_e6b352bfc4).</description>
    <link>https://dev.to/vaibhav_shakya_e6b352bfc4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3417144%2Fe34677a0-1b3f-46ec-addb-f268f427af56.jpg</url>
      <title>DEV Community: Vaibhav Shakya</title>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaibhav_shakya_e6b352bfc4"/>
    <language>en</language>
    <item>
      <title>One Payment, One Intent: Architecting Replay-Resistant Mobile Transactions Beyond Idempotency</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Thu, 05 Nov 2026 05:20:23 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/one-payment-one-intent-architecting-replay-resistant-mobile-transactions-beyond-idempotency-3agl</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/one-payment-one-intent-architecting-replay-resistant-mobile-transactions-beyond-idempotency-3agl</guid>
      <description>&lt;p&gt;A payment request can be technically unique while representing a financial action the customer has already authorized.&lt;/p&gt;

&lt;p&gt;Consider a customer transferring ₹10,000 through a mobile application. The payment processor accepts the transaction, but the response is lost. The application times out, and the customer retries.&lt;/p&gt;

&lt;p&gt;If the retry generates a new idempotency key, the backend may treat it as an entirely new operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result could be two valid transactions for one intended payment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This exposes a critical architectural distinction: preventing duplicate API requests is not the same as preventing duplicate financial effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Idempotency Is Not Business Intent
&lt;/h2&gt;

&lt;p&gt;Idempotency keys help payment systems recognize repeated requests and recover previously initiated operations.&lt;/p&gt;

&lt;p&gt;However, their guarantees depend on the provider's implementation, scope, and retention policies.&lt;/p&gt;

&lt;p&gt;Consider two requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /payments
Idempotency-Key: pay_8f29c7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /payments
Idempotency-Key: pay_19d4a2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both might pass authentication and idempotency checks.&lt;/p&gt;

&lt;p&gt;Yet both could represent the same customer action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An idempotency key identifies a retryable operation. A payment intent represents the financial action that operation is supposed to perform.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A reliable architecture needs to preserve this relationship across retries, application restarts, and asynchronous processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Payment Execution Gets Difficult
&lt;/h2&gt;

&lt;p&gt;Several failure scenarios make request-level deduplication insufficient.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent execution:&lt;/strong&gt; Two backend instances may attempt to execute the same authorized payment simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambiguous timeouts:&lt;/strong&gt; A processor may complete a transaction even when its response never reaches the backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replayed authorization:&lt;/strong&gt; A previously valid signed request may be submitted again without effective freshness or consumption checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delayed callbacks:&lt;/strong&gt; Duplicate or out-of-order processor notifications may trigger inconsistent state transitions or accounting effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems cannot be reliably solved by disabling the Pay button or generating unique transaction identifiers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction: Make Intent Authoritative
&lt;/h2&gt;

&lt;p&gt;A stronger approach is to make the backend responsible for the payment lifecycle.&lt;/p&gt;

&lt;p&gt;The mobile application initiates the customer's intended action, but the backend controls authorization, execution eligibility, and financial state.&lt;/p&gt;

&lt;p&gt;The essential controls include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Persistent payment intents:&lt;/strong&gt; Associate every payment with a stable backend-owned identifier and validated financial details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transaction-bound authorization:&lt;/strong&gt; Bind approval to the amount, beneficiary, and other material payment attributes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atomic state transitions:&lt;/strong&gt; Prevent concurrent execution attempts from independently claiming the same authorized intent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stable processor references:&lt;/strong&gt; Recover existing processor operations instead of creating new transactions after ambiguous failures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Durable execution and reconciliation:&lt;/strong&gt; Use recoverable commands, appropriate uniqueness constraints, and authoritative provider evidence to resolve uncertain outcomes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For sensitive operations, cryptographic freshness controls can provide additional replay protection.&lt;/p&gt;

&lt;p&gt;However, signatures, nonces, device attestation, and hardware-backed keys complement the payment state machine. They do not replace backend authorization or business-level execution controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mobile Application Is Not the Financial Authority
&lt;/h2&gt;

&lt;p&gt;Android Keystore and iOS Secure Enclave capabilities can help protect cryptographic operations.&lt;/p&gt;

&lt;p&gt;But even a legitimate application instance does not automatically prove that every submitted payment represents a new customer authorization.&lt;/p&gt;

&lt;p&gt;Mobile applications should therefore preserve existing intent identifiers, recover authoritative transaction states after interruptions, and avoid generating new financial execution identities during automatic retries.&lt;/p&gt;

&lt;p&gt;A timeout should lead to &lt;strong&gt;status recovery or reconciliation&lt;/strong&gt;, not blind payment re-execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Reliable payment architecture is not about guaranteeing that messages travel through distributed systems exactly once.&lt;/p&gt;

&lt;p&gt;It is about ensuring that repeated delivery, delayed responses, and application failures do not silently create additional financial effects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One payment, one intent means execution must remain bound to a durable business authorization—not merely to an HTTP request.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read the complete article on Medium:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/one-payment-one-intent-architecting-replay-resistant-mobile-transactions-beyond-idempotency-c79484dde3f5" rel="noopener noreferrer"&gt;One Payment, One Intent: Architecting Replay-Resistant Mobile Transactions Beyond Idempotency&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow my work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write about software architecture, FinTech, AI, cybersecurity, distributed systems, mobile engineering, and production engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vaibhav-shakya-neo/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vaibhavshakya.com" rel="noopener noreferrer"&gt;Explore more at vaibhavshakya.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#FinTech #PaymentSecurity #SoftwareArchitecture #DistributedSystems&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>security</category>
      <category>architecture</category>
      <category>mobile</category>
    </item>
    <item>
      <title>When the KYC Document Is AI-Generated: Why OCR Success Does Not Mean Identity Trust</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Wed, 04 Nov 2026 04:38:50 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/when-the-kyc-document-is-ai-generated-why-ocr-success-does-not-mean-identity-trust-26b6</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/when-the-kyc-document-is-ai-generated-why-ocr-success-does-not-mean-identity-trust-26b6</guid>
      <description>&lt;h1&gt;
  
  
  When the KYC Document Is AI-Generated: Why OCR Success Does Not Mean Identity Trust
&lt;/h1&gt;

&lt;p&gt;A customer uploads an identity document. OCR successfully extracts the name, date of birth, and identification number. Every field passes format validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But what if the entire document was AI-generated?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OCR can recognize text with high accuracy, but it cannot independently establish whether the document is genuine or whether the applicant owns the identity.&lt;/p&gt;

&lt;p&gt;This distinction creates a critical trust boundary in digital onboarding systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architectural Problem
&lt;/h2&gt;

&lt;p&gt;A conventional KYC workflow may look like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document Capture → OCR → Field Validation → KYC Approval&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The weakness appears when successful information extraction is treated as sufficient evidence for identity verification.&lt;/p&gt;

&lt;p&gt;A synthetic document can contain readable text, realistic layouts, and internally consistent information while having no legitimate issuing history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OCR success is a processing result, not an identity-trust decision.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;p&gt;Identity verification introduces several challenges beyond extracting document fields.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Document authenticity:&lt;/strong&gt; A readable document may be synthetic, altered, or counterfeit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Applicant verification:&lt;/strong&gt; Even an authentic document may be presented by someone other than its rightful holder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture integrity:&lt;/strong&gt; Forged media may be injected through manipulated camera feeds or compromised application environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous verification:&lt;/strong&gt; Delayed provider responses, duplicate callbacks, or stale evidence may incorrectly influence onboarding decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Android Play Integrity and Apple App Attest can provide useful signals about the application environment, but neither proves that the submitted identity document is authentic.&lt;/p&gt;

&lt;p&gt;Similarly, an AI-generated-image detector should not independently determine whether an identity is trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A stronger KYC workflow separates extraction from verification:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capture → OCR → Document Authenticity → Attribute Validation → Applicant Binding → Risk Decision&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The backend should own the authoritative KYC state and enforce several principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCR success must never automatically change the identity status to &lt;code&gt;VERIFIED&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Verification results must be associated with the correct session and evidence version.&lt;/li&gt;
&lt;li&gt;Missing, failed, and inconclusive checks must not silently become successful outcomes.&lt;/li&gt;
&lt;li&gt;Approval must depend on the required verification evidence satisfying the applicable assurance policy.&lt;/li&gt;
&lt;li&gt;Retries and asynchronous callbacks must not create unauthorized state transitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider a document that passes OCR while its authenticity verification is still pending.&lt;/p&gt;

&lt;p&gt;The backend should preserve a non-approved state until the required evidence is available and evaluated.&lt;/p&gt;

&lt;p&gt;If authenticity verification later fails, the earlier OCR success must not override that result.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;AI-generated identity documents expose an architectural weakness that predates generative AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extracting identity information is not the same as establishing identity trust.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Secure onboarding depends on explicit trust boundaries, backend-controlled decisions, evidence binding, and verification policies appropriate to the financial risk.&lt;/p&gt;

&lt;p&gt;A document can be perfectly readable and still be untrustworthy.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, Android/iOS security considerations, backend state-management patterns, failure scenarios, and implementation trade-offs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/when-the-kyc-document-is-ai-generated-why-ocr-success-does-not-mean-identity-trust-a9ed9f2bf0c8" rel="noopener noreferrer"&gt;Read the complete article on Medium&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow my work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write about software architecture, FinTech, AI, cybersecurity, distributed systems, mobile engineering, and production engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vaibhav-shakya-neo/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vaibhavshakya.com" rel="noopener noreferrer"&gt;Explore more at vaibhavshakya.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#KYC #IdentityVerification #FinTech #Cybersecurity&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>cybersecurity</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>Fraud Is a Network, Not a Transaction: Architecting Identity and Payment Graphs for FinTech</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Tue, 03 Nov 2026 05:09:46 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/fraud-is-a-network-not-a-transaction-architecting-identity-and-payment-graphs-for-fintech-4li9</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/fraud-is-a-network-not-a-transaction-architecting-identity-and-payment-graphs-for-fintech-4li9</guid>
      <description>&lt;h1&gt;
  
  
  Fraud Is a Network, Not a Transaction: Architecting Identity and Payment Graphs for FinTech
&lt;/h1&gt;

&lt;p&gt;A transaction can look completely normal when viewed in isolation.&lt;/p&gt;

&lt;p&gt;The account is authenticated. The device looks familiar. The amount is within acceptable limits. Transaction velocity has not crossed any configured threshold.&lt;/p&gt;

&lt;p&gt;Yet the payment may still sit inside a suspicious network.&lt;/p&gt;

&lt;p&gt;That is the key architectural problem with purely transaction-centric fraud detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Many fraud systems still reason primarily like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transaction
    ↓
features
    ↓
score
    ↓
decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That model is useful, but it can miss coordinated behavior spread across multiple identities and events.&lt;/p&gt;

&lt;p&gt;Consider several accounts that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use the same device&lt;/li&gt;
&lt;li&gt;use different payment instruments&lt;/li&gt;
&lt;li&gt;stay below individual velocity limits&lt;/li&gt;
&lt;li&gt;transfer toward the same beneficiary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually, each account may appear normal.&lt;/p&gt;

&lt;p&gt;Together, the relationship structure can look very different.&lt;/p&gt;

&lt;p&gt;A more relationship-aware pipeline looks closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event
  ↓
resolve entities
  ↓
update relationships
  ↓
inspect relevant neighborhood
  ↓
calculate contextual risk
  ↓
apply policy
  ↓
approve / challenge / review / decline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transaction still matters.&lt;/p&gt;

&lt;p&gt;It is simply no longer the entire unit of reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;p&gt;Graph-based fraud detection introduces several problems of its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entity resolution
&lt;/h3&gt;

&lt;p&gt;Connecting two nodes is easy.&lt;/p&gt;

&lt;p&gt;Knowing whether two observations actually represent the same device, person, payment identity, or account is much harder.&lt;/p&gt;

&lt;p&gt;A wrong merge can propagate risk across legitimate users.&lt;/p&gt;

&lt;p&gt;A missed merge can hide coordinated fraud.&lt;/p&gt;

&lt;p&gt;That is why uncertain relationships should remain uncertain instead of being silently promoted into permanent security facts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared infrastructure is not automatically fraud
&lt;/h3&gt;

&lt;p&gt;A device linked to multiple accounts can represent abuse.&lt;/p&gt;

&lt;p&gt;It can also represent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a shared household device&lt;/li&gt;
&lt;li&gt;a merchant terminal&lt;/li&gt;
&lt;li&gt;a corporate device&lt;/li&gt;
&lt;li&gt;a kiosk&lt;/li&gt;
&lt;li&gt;a resold phone&lt;/li&gt;
&lt;li&gt;legitimate account switching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same applies to IP addresses and beneficiaries.&lt;/p&gt;

&lt;p&gt;Graph density is evidence.&lt;/p&gt;

&lt;p&gt;It is not a verdict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication and fraud are different questions
&lt;/h3&gt;

&lt;p&gt;Successful authentication does not automatically mean a payment is safe.&lt;/p&gt;

&lt;p&gt;A system may legitimately have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;authentication confidence = high
transaction risk = high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An attacker may control an authenticated session, or a legitimate customer may be socially engineered into authorizing an unwanted payment.&lt;/p&gt;

&lt;p&gt;Fraud decisioning therefore has to survive the authentication boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Freshness and consistency matter
&lt;/h3&gt;

&lt;p&gt;A graph can also produce the wrong answer when its state is stale.&lt;/p&gt;

&lt;p&gt;A newly blocked beneficiary may require stronger freshness than historical device relationships.&lt;/p&gt;

&lt;p&gt;This means the architecture should not treat every graph signal the same way.&lt;/p&gt;

&lt;p&gt;Some can tolerate eventual consistency.&lt;/p&gt;

&lt;p&gt;Others may require stronger enforcement semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A useful design separates several concerns instead of building one oversized "fraud score."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clients contribute signals, but the backend remains authoritative.&lt;/li&gt;
&lt;li&gt;Entity resolution maps observations into graph identities.&lt;/li&gt;
&lt;li&gt;Relationships carry temporal information such as &lt;code&gt;first_seen&lt;/code&gt;, &lt;code&gt;last_seen&lt;/code&gt;, and observation counts.&lt;/li&gt;
&lt;li&gt;Graph-derived features feed rules, statistical models, ML, or manual-review policies.&lt;/li&gt;
&lt;li&gt;Risk estimation remains separate from the business policy that decides what action to take.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, graph features might include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;device_account_count_24h = 5
beneficiary_unique_senders_1h = 11
account_new_payment_instruments_7d = 4
distance_to_confirmed_fraud = 2
device_relationship_age_seconds = 940
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those values are much easier to operationalize than starting immediately with an opaque graph score.&lt;/p&gt;

&lt;p&gt;They can answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many accounts recently used this device?&lt;/li&gt;
&lt;li&gt;How quickly are new relationships appearing?&lt;/li&gt;
&lt;li&gt;How many independent accounts converge on one beneficiary?&lt;/li&gt;
&lt;li&gt;How close is the current entity to confirmed fraud?&lt;/li&gt;
&lt;li&gt;Is this relationship minutes old or months old?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keep the Mobile Client in the Right Trust Boundary
&lt;/h2&gt;

&lt;p&gt;Mobile applications can provide useful observations such as session context, app version, device-bound information, lifecycle state, or platform integrity evidence.&lt;/p&gt;

&lt;p&gt;But the client should not determine whether a payment is safe.&lt;/p&gt;

&lt;p&gt;The backend should correlate those observations against broader account and graph context.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client:
device_key_id = DK-8291

Backend:
DK-8291 belongs to session S18
S18 belongs to account A72
DK-8291 was first observed 14 minutes ago
DK-8291 is also associated with A81 and A93
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client sees its immediate environment.&lt;/p&gt;

&lt;p&gt;The backend can see the relationship network.&lt;/p&gt;

&lt;p&gt;That distinction is essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Scenario
&lt;/h2&gt;

&lt;p&gt;Imagine 12 customer accounts.&lt;/p&gt;

&lt;p&gt;None exceeds an individual transaction threshold.&lt;/p&gt;

&lt;p&gt;Each performs only a few low-value payments.&lt;/p&gt;

&lt;p&gt;Different payment credentials are used.&lt;/p&gt;

&lt;p&gt;From a transaction table, the cases may appear unrelated.&lt;/p&gt;

&lt;p&gt;But relationship analysis reveals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;12 accounts
    ↓
3 devices
    ↓
9 payment identities
    ↓
2 beneficiaries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The architectural lesson is not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shared device = fraud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lesson is that the original risk boundary stopped at the account.&lt;/p&gt;

&lt;p&gt;The attacker did not.&lt;/p&gt;

&lt;p&gt;Graph-derived evidence can therefore increase scrutiny without automatically converting every connected account into a fraud case.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Fraud is often expressed through transactions.&lt;/p&gt;

&lt;p&gt;But sophisticated fraud may only become visible through the relationships surrounding those transactions.&lt;/p&gt;

&lt;p&gt;Identity and payment graphs can help expose that context, but they do not create certainty.&lt;/p&gt;

&lt;p&gt;They introduce their own challenges around entity resolution, false positives, stale state, privacy, idempotency, explainability, and latency.&lt;/p&gt;

&lt;p&gt;The goal is not simply to decline more payments.&lt;/p&gt;

&lt;p&gt;The goal is to understand risk that exists across identities, devices, payment instruments, beneficiaries, sessions, and historical events — where a transaction-only view may never see it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, consistency trade-offs, privacy concerns, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/fraud-is-a-network-not-a-transaction-architecting-identity-and-payment-graphs-for-fintech-aef14bad62a7" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow my work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write about software architecture, FinTech, AI, cybersecurity, distributed systems, mobile engineering, and production engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vaibhav-shakya-neo/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vaibhavshakya.com" rel="noopener noreferrer"&gt;Explore more at vaibhavshakya.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#FinTech #FraudDetection #SoftwareArchitecture #PaymentSecurity&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>cybersecurity</category>
      <category>architecture</category>
      <category>payments</category>
    </item>
    <item>
      <title>When Software Gets a Wallet: Architecting Payments for Autonomous AI Agents</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Wed, 28 Oct 2026 04:29:48 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/when-software-gets-a-wallet-architecting-payments-for-autonomous-ai-agents-4i08</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/when-software-gets-a-wallet-architecting-payments-for-autonomous-ai-agents-4i08</guid>
      <description>&lt;p&gt;AI agents are moving from recommendation systems toward systems that can actually take actions.&lt;/p&gt;

&lt;p&gt;That becomes much more serious when the action involves money.&lt;/p&gt;

&lt;p&gt;An autonomous agent may discover a product, compare alternatives, select a merchant, and initiate a purchase without a human being present at the exact moment payment happens.&lt;/p&gt;

&lt;p&gt;At that point, the problem is no longer simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we let an AI agent pay?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we let probabilistic software request economic actions while deterministic systems retain authority over what is actually allowed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The dangerous design is to treat an AI agent like a human user with a wallet.&lt;/p&gt;

&lt;p&gt;Giving the model direct access to card numbers, private keys, bank credentials, or unrestricted wallet balances creates an unnecessarily large privilege boundary.&lt;/p&gt;

&lt;p&gt;A safer architecture separates responsibilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User or business intent
        ↓
AI agent reasoning
        ↓
Structured payment request
        ↓
Policy and risk checks
        ↓
Bounded payment capability
        ↓
Payment infrastructure
        ↓
Merchant
        ↓
Ledger and reconciliation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model may decide that a purchase is useful.&lt;/p&gt;

&lt;p&gt;It should not automatically possess the authority required to execute that purchase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;p&gt;Several problems become significantly more important once agents can initiate payments.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prompt injection becomes a financial-control problem
&lt;/h3&gt;

&lt;p&gt;An agent may read webpages, emails, PDFs, API responses, or merchant descriptions before deciding what action to take.&lt;/p&gt;

&lt;p&gt;Any of those inputs could contain misleading or adversarial instructions.&lt;/p&gt;

&lt;p&gt;If the same model can both interpret that content and freely spend money, a content-security failure can become a financial loss.&lt;/p&gt;

&lt;p&gt;The stronger control is not simply making the model harder to manipulate.&lt;/p&gt;

&lt;p&gt;The stronger control is ensuring that even a manipulated model still has to pass an independent payment policy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A timeout does not mean the payment failed
&lt;/h3&gt;

&lt;p&gt;Imagine the agent submits a purchase.&lt;/p&gt;

&lt;p&gt;The payment succeeds, but the network response is lost.&lt;/p&gt;

&lt;p&gt;The agent sees a timeout.&lt;/p&gt;

&lt;p&gt;A naive autonomous system may reason:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No response → probably failed → try again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can create duplicate charges.&lt;/p&gt;

&lt;p&gt;Payment infrastructure therefore needs stable business identifiers and idempotency semantics so that multiple execution attempts can still represent one economic action.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agent memory cannot become the financial ledger
&lt;/h3&gt;

&lt;p&gt;An AI agent may have conversation history, long-term memory, retrieval systems, or stored context.&lt;/p&gt;

&lt;p&gt;None of those should be the authoritative source of financial truth.&lt;/p&gt;

&lt;p&gt;The backend needs durable records of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which user or organization authorized the action&lt;/li&gt;
&lt;li&gt;Which agent initiated it&lt;/li&gt;
&lt;li&gt;What permission existed&lt;/li&gt;
&lt;li&gt;Which policy evaluated it&lt;/li&gt;
&lt;li&gt;What amount was requested&lt;/li&gt;
&lt;li&gt;What actually succeeded&lt;/li&gt;
&lt;li&gt;What retries occurred&lt;/li&gt;
&lt;li&gt;Whether approval was required&lt;/li&gt;
&lt;li&gt;What was ultimately delivered or refunded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model's explanation can be useful context.&lt;/p&gt;

&lt;p&gt;It should not replace the transaction record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;The core design principle is &lt;strong&gt;delegated authority&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of giving an agent general permission to "make payments," grant narrowly scoped capabilities.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A may spend up to ₹5,000
at SOFTWARE merchants
for PROJECT-42
until 18:00 UTC
with a maximum of one transaction.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is very different from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A may make payments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful constraints can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maximum amount&lt;/li&gt;
&lt;li&gt;Cumulative budget&lt;/li&gt;
&lt;li&gt;Merchant or merchant category&lt;/li&gt;
&lt;li&gt;Product or SKU&lt;/li&gt;
&lt;li&gt;Currency&lt;/li&gt;
&lt;li&gt;Validity period&lt;/li&gt;
&lt;li&gt;Transaction count&lt;/li&gt;
&lt;li&gt;One-time versus recurring payment&lt;/li&gt;
&lt;li&gt;Human approval requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not every payment rail supports every restriction directly.&lt;/p&gt;

&lt;p&gt;Some constraints may be enforced by the agent platform, some by a backend policy engine, and others by the PSP, payment network, wallet, or merchant.&lt;/p&gt;

&lt;p&gt;The important part is that the rules are deterministic and independently enforced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human Intent Should Be Durable
&lt;/h2&gt;

&lt;p&gt;Suppose a user tells an agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Book me a nonstop flight to Bengaluru next Friday evening for less than ₹9,000.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The payment may happen hours later.&lt;/p&gt;

&lt;p&gt;The conversation itself should not be the only proof of authorization.&lt;/p&gt;

&lt;p&gt;A stronger system converts that instruction into a durable mandate containing constraints such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"purchase_flight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BLR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"departure_after"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"18:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_amount_minor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;900000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nonstop_only"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the agent later finds a flight, the payment system compares the proposed transaction against that stored authority.&lt;/p&gt;

&lt;p&gt;The key audit question becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What had the user actually authorized when this transaction executed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;rather than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did the model think the user wanted?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Payment State Still Belongs to the Backend
&lt;/h2&gt;

&lt;p&gt;Agents do not remove normal distributed-systems problems.&lt;/p&gt;

&lt;p&gt;They make some of them more dangerous.&lt;/p&gt;

&lt;p&gt;A payment may move through states such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REQUESTED
POLICY_APPROVED
PAYMENT_AUTHORIZED
CAPTURE_PENDING
CAPTURED
FULFILLED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may also reach states such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POLICY_REJECTED
REQUIRES_HUMAN_APPROVAL
PAYMENT_UNKNOWN
CAPTURE_FAILED
REFUNDED
REVERSED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These exact states vary by payment provider and payment rail.&lt;/p&gt;

&lt;p&gt;The architectural point is that payment state must be explicit and authoritative.&lt;/p&gt;

&lt;p&gt;The agent should not infer financial truth from conversational tool responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;The interesting part of an "AI wallet" is not the wallet.&lt;/p&gt;

&lt;p&gt;It is the delegation architecture around it.&lt;/p&gt;

&lt;p&gt;A trustworthy system needs to establish something equivalent to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am Agent X.
I am acting for Principal Y.
Principal Y authorized action Z.
That authority is valid under conditions C.
This requested transaction satisfies those conditions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payment infrastructure then independently decides whether those claims are sufficient to allow money movement.&lt;/p&gt;

&lt;p&gt;The AI may discover the opportunity and request the purchase.&lt;/p&gt;

&lt;p&gt;But identity, policy, scoped authority, transaction state, idempotency, auditability, and reconciliation are what make autonomous payments viable as financial infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/when-software-gets-a-wallet-architecting-payments-for-autonomous-ai-agents-93ead4bcc498" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow my work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write about software architecture, FinTech, AI, cybersecurity, distributed systems, mobile engineering, and production engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vaibhav-shakya-neo/" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vaibhavshakya.com" rel="noopener noreferrer"&gt;Explore more at vaibhavshakya.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#AgenticAI #FinTech #SoftwareArchitecture #Payments&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>fintech</category>
      <category>architecture</category>
      <category>payments</category>
    </item>
    <item>
      <title>Your AI Agent Needs an IAM Strategy Too: Least-Privilege Design for Autonomous Financial Systems</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Tue, 27 Oct 2026 04:58:06 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/your-ai-agent-needs-an-iam-strategy-too-least-privilege-design-for-autonomous-financial-systems-2ldk</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/your-ai-agent-needs-an-iam-strategy-too-least-privilege-design-for-autonomous-financial-systems-2ldk</guid>
      <description>&lt;p&gt;AI agents are moving beyond answering questions.&lt;/p&gt;

&lt;p&gt;They can increasingly retrieve financial data, prepare payments, issue refunds, reconcile settlements, create beneficiaries, and trigger actions across backend systems.&lt;/p&gt;

&lt;p&gt;Once an agent can perform financial operations, it is no longer just an AI component.&lt;/p&gt;

&lt;p&gt;It becomes part of the &lt;strong&gt;identity and access management architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A common implementation looks simple:&lt;/p&gt;

&lt;p&gt;Mobile App → Backend → AI Agent → Financial APIs&lt;/p&gt;

&lt;p&gt;The backend already has credentials for internal APIs, so the easiest approach is to let the agent reuse that authority.&lt;/p&gt;

&lt;p&gt;That creates a dangerous boundary.&lt;/p&gt;

&lt;p&gt;The agent may need permission to perform one specific operation for one customer, but the backend identity may have access to many customers, accounts, payment operations, refunds, configuration APIs, or settlement systems.&lt;/p&gt;

&lt;p&gt;The agent effectively inherits authority based on where it runs rather than what the current task requires.&lt;/p&gt;

&lt;p&gt;A stronger model is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User identity → Delegation → Agent identity → Limited capability → Resource authorization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent should have identifiable execution context and receive only the authority required for the current workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Authentication is not authorization
&lt;/h3&gt;

&lt;p&gt;Knowing that the authenticated customer is &lt;code&gt;user_82741&lt;/code&gt; does not answer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can this particular agent transfer ₹18,000 from this account to this beneficiary right now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authorization may need to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which user delegated the authority&lt;/li&gt;
&lt;li&gt;which agent is acting&lt;/li&gt;
&lt;li&gt;which account is involved&lt;/li&gt;
&lt;li&gt;which operation is requested&lt;/li&gt;
&lt;li&gt;the transaction amount&lt;/li&gt;
&lt;li&gt;beneficiary status&lt;/li&gt;
&lt;li&gt;consent state&lt;/li&gt;
&lt;li&gt;risk state&lt;/li&gt;
&lt;li&gt;approval requirements&lt;/li&gt;
&lt;li&gt;credential lifetime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A broad permission such as &lt;code&gt;payments:create&lt;/code&gt; may therefore be insufficient on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt instructions are not security controls
&lt;/h3&gt;

&lt;p&gt;A system prompt might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never transfer more than ₹25,000.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That can guide model behavior.&lt;/p&gt;

&lt;p&gt;It should not be the control that protects the payment system.&lt;/p&gt;

&lt;p&gt;If policy says the agent cannot execute ₹25,001, the payment service should reject that transaction regardless of what the model reasons.&lt;/p&gt;

&lt;p&gt;The model can decide what it wants to attempt.&lt;/p&gt;

&lt;p&gt;Deterministic authorization should decide what it is actually allowed to execute.&lt;/p&gt;

&lt;h3&gt;
  
  
  Short-lived credentials are not enough
&lt;/h3&gt;

&lt;p&gt;Short credential lifetimes reduce exposure, but they do not fix excessive privileges.&lt;/p&gt;

&lt;p&gt;A five-minute administrator credential is still an administrator credential.&lt;/p&gt;

&lt;p&gt;Least privilege should reduce both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;how long authority exists&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;what that authority can actually do&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Retries can become financial incidents
&lt;/h3&gt;

&lt;p&gt;Suppose the agent sends a payment request and the network times out before the result is returned.&lt;/p&gt;

&lt;p&gt;The orchestration layer retries.&lt;/p&gt;

&lt;p&gt;Without idempotency, the same logical payment could potentially be processed more than once.&lt;/p&gt;

&lt;p&gt;Authorization and transactional idempotency therefore solve different but complementary problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this operation allowed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Has this logical operation already been executed?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A safer autonomous financial architecture gives the agent narrowly scoped authority rather than inheriting a broad backend credential.&lt;/p&gt;

&lt;p&gt;Useful design principles include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give each agent execution an identifiable identity and delegation context.&lt;/li&gt;
&lt;li&gt;Prefer task-specific and short-lived authority.&lt;/li&gt;
&lt;li&gt;Restrict authority to relevant customers, accounts, resources, and actions.&lt;/li&gt;
&lt;li&gt;Separate &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;prepare&lt;/code&gt;, &lt;code&gt;approve&lt;/code&gt;, and &lt;code&gt;execute&lt;/code&gt; capabilities when the risk justifies it.&lt;/li&gt;
&lt;li&gt;Keep financial limits and business rules outside model reasoning.&lt;/li&gt;
&lt;li&gt;Let the protected resource independently authorize the requested action.&lt;/li&gt;
&lt;li&gt;Preserve user → agent → policy → tool → transaction auditability.&lt;/li&gt;
&lt;li&gt;Combine authorization with idempotency, risk controls, revocation, and monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, an invoice-payment agent might be allowed to prepare a payment for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer A&lt;/li&gt;
&lt;li&gt;Funding Account X&lt;/li&gt;
&lt;li&gt;Supplier Y&lt;/li&gt;
&lt;li&gt;Invoice 7821&lt;/li&gt;
&lt;li&gt;Maximum amount ₹42,000&lt;/li&gt;
&lt;li&gt;A limited execution window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the model attempts ₹43,000, policy rejects it.&lt;/p&gt;

&lt;p&gt;If it references another customer's account, resource authorization rejects it.&lt;/p&gt;

&lt;p&gt;If the request is retried after a timeout, idempotency prevents the same logical payment from becoming another transaction.&lt;/p&gt;

&lt;p&gt;The model still contributes intelligence.&lt;/p&gt;

&lt;p&gt;It simply does not grant itself authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Autonomous financial systems introduce another identity question into modern architecture.&lt;/p&gt;

&lt;p&gt;Traditional IAM asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is the user?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Distributed systems also ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which workload is calling?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agentic systems add:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which agent is acting, under whose authority, and exactly what has it been allowed to do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI agent may reason broadly.&lt;/p&gt;

&lt;p&gt;Its financial authority should remain deliberately narrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, IAM boundaries, sender-constrained credential discussion, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read the full article on Medium:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/your-ai-agent-needs-an-iam-strategy-too-least-privilege-design-for-autonomous-financial-systems-9f54da7b8b28" rel="noopener noreferrer"&gt;https://medium.com/@vaibhav.shakya786/your-ai-agent-needs-an-iam-strategy-too-least-privilege-design-for-autonomous-financial-systems-9f54da7b8b28&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow my work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write about software architecture, FinTech, AI, cybersecurity, distributed systems, mobile engineering, and production engineering.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vaibhav-shakya-neo/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/vaibhav-shakya-neo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explore more at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vaibhavshakya.com" rel="noopener noreferrer"&gt;https://vaibhavshakya.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#AIArchitecture #FinTech #Cybersecurity #AgenticAI&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>fintech</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Policy Before Prompt: Enforcing Machine-Readable Financial Rules on Autonomous AI Agents</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Fri, 23 Oct 2026 04:22:50 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/policy-before-prompt-enforcing-machine-readable-financial-rules-on-autonomous-ai-agents-1pmj</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/policy-before-prompt-enforcing-machine-readable-financial-rules-on-autonomous-ai-agents-1pmj</guid>
      <description>&lt;p&gt;An autonomous financial agent receives a simple instruction: pay approved suppliers before their invoices become overdue.&lt;/p&gt;

&lt;p&gt;It identifies an invoice, checks the beneficiary, and proposes a transfer. The reasoning looks sensible. But does the customer’s delegation permit the payment? Have the beneficiary’s bank details changed? Has another worker already consumed the remaining spending allowance?&lt;/p&gt;

&lt;p&gt;A prompt can describe these constraints. Trusted services must enforce them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;“Policy before prompt” describes an order of authority. Financial rules remain authoritative regardless of what the model generates.&lt;/p&gt;

&lt;p&gt;The agent proposes a structured operation. The backend verifies resource ownership, retrieves authoritative context, evaluates policy, and satisfies execution conditions.&lt;/p&gt;

&lt;p&gt;Fields such as &lt;code&gt;supplier_approved&lt;/code&gt; or &lt;code&gt;approval_complete&lt;/code&gt; must not become trusted merely because the agent supplies valid JSON.&lt;/p&gt;

&lt;p&gt;Likewise, authenticating the agent workload does not establish which customer delegated authority or which accounts that delegation covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;An allow decision does not reserve a budget.&lt;/strong&gt; Suppose two workers each propose ₹20,000 payments against a remaining allowance of ₹30,000. Both can pass policy evaluation against the same snapshot. An atomic reservation mechanism must coordinate their combined consumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approval must match execution.&lt;/strong&gt; Human approval should bind to a specific version of the transaction details. Changing the amount, fees, or beneficiary’s underlying bank details should invalidate the previous approval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A timeout does not establish payment failure.&lt;/strong&gt; The provider may have accepted the operation before the response was lost. Creating a replacement transfer can produce a duplicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current policy can still receive stale facts.&lt;/strong&gt; Policy freshness and the freshness of delegation, approval, and beneficiary data require separate controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A practical execution path should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieve decision-critical facts from authoritative services.&lt;/li&gt;
&lt;li&gt;Require an explicit successful allow decision.&lt;/li&gt;
&lt;li&gt;Reserve shared allowances atomically.&lt;/li&gt;
&lt;li&gt;Bind approvals and idempotency records to fixed transaction details.&lt;/li&gt;
&lt;li&gt;Resolve uncertain provider outcomes through supported recovery procedures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enforcement belongs at the financial execution boundary. An early tool-call check helps, but another caller must not be able to bypass the same controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Authorization establishes permission. Transaction coordination and recovery carry that permission through execution.&lt;/p&gt;

&lt;p&gt;Machine-readable policy makes financial authority explicit and reviewable. Its effectiveness still depends on trusted inputs, enforced boundaries, and reliable payment state management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the full architectural breakdown, Rego example, approval design, and operational considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/policy-before-prompt-enforcing-machine-readable-financial-rules-on-autonomous-ai-agents-b6a81016ac4b" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>fintech</category>
      <category>architecture</category>
      <category>security</category>
    </item>
    <item>
      <title>Designing FinTech for the Day Everything Fails: Cyberattacks, Outages, Dependencies, and Recovery</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Wed, 21 Oct 2026 04:08:18 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/designing-fintech-for-the-day-everything-fails-cyberattacks-outages-dependencies-and-recovery-35e</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/designing-fintech-for-the-day-everything-fails-cyberattacks-outages-dependencies-and-recovery-35e</guid>
      <description>&lt;p&gt;A payment provider accepts a transaction, but its response never reaches your backend. The customer sees a timeout. An operator considers switching traffic to another provider.&lt;/p&gt;

&lt;p&gt;That recovery decision can create a duplicate charge.&lt;/p&gt;

&lt;p&gt;FinTech resilience requires more than restoring services. The architecture must preserve financial correctness while transaction outcomes remain uncertain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A local database transaction does not atomically include a payment provider’s processing decision. When a request times out, your backend knows it stopped waiting. It does not necessarily know whether money moved.&lt;/p&gt;

&lt;p&gt;Treating that uncertainty as failure can encourage another attempt against an obligation that was already collected.&lt;/p&gt;

&lt;p&gt;An explicit state such as &lt;code&gt;OUTCOME_UNKNOWN&lt;/code&gt; gives the system something actionable to manage: the original provider reference, the next inquiry, the evidence received, and the threshold for manual review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Atomic acceptance does not guarantee external execution
&lt;/h3&gt;

&lt;p&gt;Recording a payment intent and its outbox event in one database transaction closes a local consistency gap.&lt;/p&gt;

&lt;p&gt;However, a worker can submit the payment and crash before recording delivery. Processing the outbox again may repeat the external request.&lt;/p&gt;

&lt;p&gt;Stable provider identifiers, provider-specific idempotency behavior, and outcome resolution still matter. A unique request key also needs to work alongside an enforced business-operation identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Provider failover has two separate responsibilities
&lt;/h3&gt;

&lt;p&gt;Routing eligible new payments to another provider differs from resolving payments already submitted.&lt;/p&gt;

&lt;p&gt;Independent providers generally do not share an idempotency namespace. An unresolved payment should remain associated with its original provider reference until sufficient evidence establishes its outcome.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Restoring data does not restore the outside world
&lt;/h3&gt;

&lt;p&gt;A database recovery point may precede a payment that succeeded externally.&lt;/p&gt;

&lt;p&gt;Recreating and resubmitting that missing operation can repeat its financial effect. Recovery therefore needs reconciliation against provider records, authenticated callbacks, settlement evidence, and independently retained transaction evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cyber recovery requires a trusted environment
&lt;/h3&gt;

&lt;p&gt;During an infrastructure outage, moving traffic may restore availability. During a compromise, it may also carry stolen credentials or malicious configuration into the recovery environment.&lt;/p&gt;

&lt;p&gt;Isolation, credential revocation, validated deployment artifacts, and rebuilding from a trusted baseline become part of the recovery decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A practical design should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preserve payment identity across retries and mobile-app restarts.&lt;/li&gt;
&lt;li&gt;Record accepted work and dispatch instructions atomically.&lt;/li&gt;
&lt;li&gt;Separate status inquiries from money-moving submissions.&lt;/li&gt;
&lt;li&gt;Apply controlled state transitions and idempotent ledger-posting controls.&lt;/li&gt;
&lt;li&gt;Reconcile uncertain operations before reopening capabilities that depend on their correctness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, after a provider timeout, the mobile app retrieves the existing payment rather than creating another one. The backend keeps investigating through the original provider reference.&lt;/p&gt;

&lt;p&gt;When an authenticated inquiry confirms success, the backend applies the permitted transition and records the corresponding ledger entry under a unique business reference. A duplicate callback must not create another posting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Replication supports availability. Backups provide historical recovery options. Reconciliation accounts for financial effects beyond the restored database.&lt;/p&gt;

&lt;p&gt;Recovery dashboards should therefore track unknown-outcome age, reconciliation breaks, settlement delays, and ledger-posting failures alongside infrastructure metrics.&lt;/p&gt;

&lt;p&gt;The recovery goal is an explainable financial state, including operations whose answers arrived late.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/designing-fintech-for-the-day-everything-fails-cyberattacks-outages-dependencies-and-recovery-62ac25e7b2e4" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>architecture</category>
      <category>distributedsystems</category>
      <category>security</category>
    </item>
    <item>
      <title>Putting a Control Plane Between the LLM and the Bank: Architecture for Governed AI Execution</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:32:13 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/putting-a-control-plane-between-the-llm-and-the-bank-architecture-for-governed-ai-execution-52ke</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/putting-a-control-plane-between-the-llm-and-the-bank-architecture-for-governed-ai-execution-52ke</guid>
      <description>&lt;p&gt;An AI assistant receives a simple instruction: “Pay the approved supplier invoice.”&lt;/p&gt;

&lt;p&gt;It identifies the invoice, generates valid JSON, and calls an authenticated tool. Yet the backend still needs to establish whether the customer authorized this exact payment, whether the beneficiary details remain valid, and whether another worker has already submitted it.&lt;/p&gt;

&lt;p&gt;These questions belong to the execution architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Authentication establishes who is calling. Business authorization determines which financial action that caller may perform.&lt;/p&gt;

&lt;p&gt;A workload credential does not, by itself, establish permission to debit a customer’s account. Similarly, a confirmation screen provides limited assurance if the amount or beneficiary can change between approval and execution.&lt;/p&gt;

&lt;p&gt;The architectural boundary is straightforward: the model proposes an action, while trusted application code controls its admission and submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Approval must identify the exact operation
&lt;/h3&gt;

&lt;p&gt;Bind approval to a backend-created payment intent containing the relevant account, beneficiary version, amount, currency, fees, and expiration.&lt;/p&gt;

&lt;p&gt;Include the intent identifier and revision so that approval cannot simply be copied onto another payment. Changes to approved details should invalidate the previous approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concurrent workers can consume the same authority
&lt;/h3&gt;

&lt;p&gt;Checking permission and later writing a queue message leaves a timing gap.&lt;/p&gt;

&lt;p&gt;Within the application’s consistency boundary, coordinate approval consumption, state transitions, invoice reservations, limit reservations, and durable dispatch preparation.&lt;/p&gt;

&lt;p&gt;Locking one intent does not automatically protect an account-wide allowance or prevent a separate intent from paying the same invoice.&lt;/p&gt;

&lt;h3&gt;
  
  
  A timeout leaves an uncertain outcome
&lt;/h3&gt;

&lt;p&gt;A bank may receive a request even when the execution worker never receives its response.&lt;/p&gt;

&lt;p&gt;Creating a replacement payment can therefore introduce a duplicate. Preserve the existing intent and resolve its status through supported lookup, authenticated callbacks, or reconciliation.&lt;/p&gt;

&lt;p&gt;Provider idempotency behavior must be checked against the specific endpoint, API version, and retention window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;Separate policy management from runtime enforcement.&lt;/p&gt;

&lt;p&gt;The control plane manages permitted operations, delegation rules, approval thresholds, policy versions, and emergency restrictions. The execution layer gathers trusted context, evaluates each intent, records the admission decision, and invokes a constrained payment adapter.&lt;/p&gt;

&lt;p&gt;A practical implementation should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolve invoice, beneficiary, and delegation details from authoritative backend records.&lt;/li&gt;
&lt;li&gt;Keep provider credentials within the execution environment.&lt;/li&gt;
&lt;li&gt;Bind approval to an exact, versioned intent.&lt;/li&gt;
&lt;li&gt;Coordinate local admission changes with an outbox record.&lt;/li&gt;
&lt;li&gt;Handle repeated delivery and uncertain provider outcomes explicitly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These responsibilities can initially live in one backend application. Separate services should follow operational needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Short Example
&lt;/h2&gt;

&lt;p&gt;A customer approves a ₹48,000 supplier payment on Android. The backend reserves the invoice amount and applicable allowance, then prepares durable dispatch.&lt;/p&gt;

&lt;p&gt;The bank response times out.&lt;/p&gt;

&lt;p&gt;The application displays “Payment status pending confirmation” and retrieves the same intent when reopened. A later authenticated bank event confirms acceptance, and the backend continues tracking the payment according to the rail’s status model.&lt;/p&gt;

&lt;p&gt;The conversation can resume without creating a fresh payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;An authorization decision and a payment outcome are separate records.&lt;/p&gt;

&lt;p&gt;Governed AI execution needs explicit authority, transaction-bound approval, coordinated admission, and a recovery path for uncertainty. The mobile application and the assistant should explain the backend’s recorded state.&lt;/p&gt;

&lt;p&gt;For the admission pseudocode, revocation trade-offs, audit considerations, and full architectural reasoning, &lt;a href="https://medium.com/@vaibhav.shakya786/putting-a-control-plane-between-the-llm-and-the-bank-architecture-for-governed-ai-execution-2c66bf41b28f" rel="noopener noreferrer"&gt;read the full article on Medium&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>security</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Who Authenticated the Agent? Building Identity for AI That Acts on a Customer’s Behalf</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Wed, 14 Oct 2026 04:25:22 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/who-authenticated-the-agent-building-identity-for-ai-that-acts-on-a-customers-behalf-5e1e</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/who-authenticated-the-agent-building-identity-for-ai-that-acts-on-a-customers-behalf-5e1e</guid>
      <description>&lt;h1&gt;
  
  
  Who Authenticated the Agent? Building Identity for AI That Acts on a Customer’s Behalf
&lt;/h1&gt;

&lt;p&gt;A customer asks an AI assistant to pay an invoice. The assistant selects an account and submits the payment through an API.&lt;/p&gt;

&lt;p&gt;The backend receives a valid token. But does that token identify the customer, the software executing the action, or both?&lt;/p&gt;

&lt;p&gt;A customer credential alone may obscure the executing actor. A service credential alone does not establish the customer’s permission. An agent acting on someone’s behalf needs an enforceable relationship between these identities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Passing the customer’s existing access token into an agent runtime carries session authority into another execution environment. Its permissions may exceed the task, and downstream records may attribute every action solely to the customer.&lt;/p&gt;

&lt;p&gt;A clearer architecture separates three concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customer:&lt;/strong&gt; Whose resources are affected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workload:&lt;/strong&gt; Which authenticated software invokes the operation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegation grant:&lt;/strong&gt; What that workload may do for that customer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication establishes the actor. Delegation defines its authority. Authorization determines whether the requested operation fits that authority.&lt;/p&gt;

&lt;p&gt;A prompt saying “you represent this customer” establishes none of those boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Broad consent creates ambiguous authority
&lt;/h3&gt;

&lt;p&gt;“Allow AI access” does not describe a useful payment boundary.&lt;/p&gt;

&lt;p&gt;“Pay this biller once, from this account, up to ₹3,000, before this date” can become a structured grant with enforceable constraints.&lt;/p&gt;

&lt;p&gt;Natural language may propose the permission. The backend should validate and store the approved policy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Token protection does not authorize the transaction
&lt;/h3&gt;

&lt;p&gt;Sender-constrained tokens can reduce the usefulness of a stolen token without its associated key. They do not establish customer approval of the payment.&lt;/p&gt;

&lt;p&gt;DPoP, for example, does not sign the payment body or bind consent to its amount and beneficiary. Credential protection and transaction authorization address different risks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retries interact with consumed grants
&lt;/h3&gt;

&lt;p&gt;Suppose the backend accepts a ₹2,750 payment and reserves the grant’s single permitted operation. The response is lost.&lt;/p&gt;

&lt;p&gt;The retry must not consume authority again. After checking access and matching the request, the backend should return the existing operation associated with the scoped idempotency key.&lt;/p&gt;

&lt;p&gt;Checking only whether the grant still has unused authority can incorrectly reject that recovery path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Valid identity does not resolve prompt injection
&lt;/h3&gt;

&lt;p&gt;A retrieved invoice or email may influence a legitimate agent’s tool use.&lt;/p&gt;

&lt;p&gt;Backend constraints can reject an excessive amount or unapproved destination. They cannot always detect a harmful decision that remains within a broad grant.&lt;/p&gt;

&lt;p&gt;Permission design must account for that residual risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;Keep credentials in a controlled execution component outside model context and generated output. Authenticate the workload independently, then associate its permitted actions with a backend delegation record.&lt;/p&gt;

&lt;p&gt;At payment acceptance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate credentials and resolve the customer and current actor.&lt;/li&gt;
&lt;li&gt;Check whether the scoped idempotency key already identifies an operation.&lt;/li&gt;
&lt;li&gt;For an existing operation, verify access and matching payment details.&lt;/li&gt;
&lt;li&gt;For a new operation, enforce grant status, limits, destination, and approval requirements.&lt;/li&gt;
&lt;li&gt;Atomically record authorization consumption, idempotency, and durable dispatch intent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Define how revocation competes with acceptance. Revoking future authority does not necessarily cancel a payment already dispatched.&lt;/p&gt;

&lt;p&gt;Preserve the initiating actor and delegation reference across queues and workers. A worker’s service identity should not erase who initiated the business operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;An authenticated agent is only one part of the design.&lt;/p&gt;

&lt;p&gt;The backend must explain which software acted, whose authority it used, what that authority permitted, and how the operation recovered when execution became uncertain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/who-authenticated-the-agent-building-identity-for-ai-that-acts-on-a-customers-behalf-0a034f65979d" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>architecture</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Signing the Intent, Not Just the Request: Designing Transaction Authorization for Mobile FinTech</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Tue, 13 Oct 2026 04:29:13 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/signing-the-intent-not-just-the-request-designing-transaction-authorization-for-mobile-fintech-2ka5</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/signing-the-intent-not-just-the-request-designing-transaction-authorization-for-mobile-fintech-2ka5</guid>
      <description>&lt;h1&gt;
  
  
  Signing the Intent, Not Just the Request: Designing Transaction Authorization for Mobile FinTech
&lt;/h1&gt;

&lt;p&gt;A customer reviews a ₹5,000 transfer and confirms with a fingerprint.&lt;/p&gt;

&lt;p&gt;The application has authenticated the customer locally. But what evidence tells the backend which amount, destination, and charges the customer approved?&lt;/p&gt;

&lt;p&gt;That is the architectural problem transaction intent signing addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Authentication establishes identity. Transaction authorization determines whether a specific operation may proceed.&lt;/p&gt;

&lt;p&gt;A signed request can implement transaction authorization when it contains the complete business contract and execution follows that contract. Problems arise when downstream services reinterpret its meaning.&lt;/p&gt;

&lt;p&gt;For example, signing a beneficiary identifier is insufficient if its destination account can change before execution. The signature may remain valid while the payment reaches a different account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Signed bytes must be unambiguous.&lt;/strong&gt; Ordinary JSON serialization can vary across platforms. Define deterministic encoding, schema validation, numeric limits, and signature rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protected key use does not prove informed consent.&lt;/strong&gt; Android Keystore and iOS Secure Enclave can protect signing keys and govern their use. They do not independently establish that the application displayed accurate transaction details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enrollment is an authorization boundary.&lt;/strong&gt; If a stolen session can register a replacement signing key, the signing protocol loses much of its value. Enrollment, recovery, and revocation need explicit controls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approval and execution have different failure modes.&lt;/strong&gt; Accepting an approval atomically does not guarantee one-time processing by an external payment provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;Separate preparation, approval, and execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The backend resolves the destination and creates an immutable intent containing the material transaction fields.&lt;/li&gt;
&lt;li&gt;The application renders the confirmation screen from that intent and signs its defined bytes.&lt;/li&gt;
&lt;li&gt;The backend verifies ownership, signature, key eligibility, expiry, and policy before atomically accepting approval and recording a durable execution command.&lt;/li&gt;
&lt;li&gt;The execution worker uses the accepted snapshot, checks current execution eligibility, and follows the provider’s supported retry and recovery rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A transactional outbox keeps local acceptance and the execution command durable together. Duplicate delivery still requires consumer deduplication.&lt;/p&gt;

&lt;p&gt;Consider a lost approval response. The application retries with the same intent identifier, and the backend returns the existing operation’s status. If the provider call later times out, the worker treats the result as uncertain and follows the supported recovery process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Transaction authorization requires continuity between what the customer reviews, what the device signs, and what the backend executes.&lt;/p&gt;

&lt;p&gt;A signature provides evidence of key use over a defined message. Immutable transaction meaning, trustworthy presentation, backend enforcement, and controlled recovery determine how useful that evidence becomes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/signing-the-intent-not-just-the-request-designing-transaction-authorization-for-mobile-fintech-6202cd7a92ea" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>security</category>
      <category>architecture</category>
      <category>mobile</category>
    </item>
    <item>
      <title>From Mobile Tap to Autonomous Agent: A Reference Architecture for the AI-Native FinTech Stack</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Mon, 12 Oct 2026 04:39:07 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/from-mobile-tap-to-autonomous-agent-a-reference-architecture-for-the-ai-native-fintech-stack-3pbd</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/from-mobile-tap-to-autonomous-agent-a-reference-architecture-for-the-ai-native-fintech-stack-3pbd</guid>
      <description>&lt;p&gt;AI-native FinTech changes more than the user interface.&lt;/p&gt;

&lt;p&gt;It changes how we need to think about &lt;strong&gt;authority, execution, and financial truth&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A traditional payment flow is relatively straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Mobile App
  ↓
API
  ↓
Financial Service
  ↓
Payment Rail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Introduce an autonomous agent and another decision-making layer appears:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer Intent
      ↓
Agent Reasoning
      ↓
Policy / Authorization
      ↓
Financial Services
      ↓
Payment Rail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important architectural question is no longer only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who authenticated?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What exactly is software acting on behalf of that customer allowed to do?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;An AI agent can interpret ambiguous instructions, gather information, choose tools, retry operations, and coordinate multiple services.&lt;/p&gt;

&lt;p&gt;That flexibility is useful.&lt;/p&gt;

&lt;p&gt;But financial systems cannot allow probabilistic reasoning to become the final source of authority.&lt;/p&gt;

&lt;p&gt;Consider a customer instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pay my broadband bill every month if it stays below ₹1,500.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not a direct payment command.&lt;/p&gt;

&lt;p&gt;It contains several constraints that first need to become structured financial intent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"intentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PAY_BILL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"billerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ISP_291"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maximumAmountMinor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;150000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INR"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent can help interpret the instruction.&lt;/p&gt;

&lt;p&gt;But the payment system should execute the structured contract—not the original natural-language sentence.&lt;/p&gt;

&lt;p&gt;That boundary creates a useful architectural rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning may be probabilistic. Financial execution should remain deterministic.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Authentication is not delegated authority
&lt;/h3&gt;

&lt;p&gt;A customer may successfully authenticate, but that does not mean an agent should automatically receive every permission available to the customer.&lt;/p&gt;

&lt;p&gt;Instead of handing the agent broad account authority, the platform can create a bounded delegation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;action: PAY_BILL
biller: ISP_291
maxAmount: 150000
expiresAt: ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact implementation might use scopes, server-side grants, capability tokens, mandates, or another authorization model.&lt;/p&gt;

&lt;p&gt;The principle is the same:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give the agent only the authority required for the specific task.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tool access is not transaction authorization
&lt;/h3&gt;

&lt;p&gt;An agent might have an approved capability such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;executePayment()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That does not mean every invocation should execute.&lt;/p&gt;

&lt;p&gt;A specific request could still violate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delegated amount limits&lt;/li&gt;
&lt;li&gt;beneficiary restrictions&lt;/li&gt;
&lt;li&gt;transaction velocity rules&lt;/li&gt;
&lt;li&gt;account state&lt;/li&gt;
&lt;li&gt;risk policy&lt;/li&gt;
&lt;li&gt;regulatory controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the agent request this type of operation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The policy layer must still answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can this exact operation execute now?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Retries become dangerous around money
&lt;/h3&gt;

&lt;p&gt;Imagine the agent submits a payment.&lt;/p&gt;

&lt;p&gt;The processor receives and completes it, but the network response is lost.&lt;/p&gt;

&lt;p&gt;The agent sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TimeoutException
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A reasonable software reaction might be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Retry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No response != No payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the retry creates a new transaction, an ordinary distributed-systems timeout becomes a duplicate-payment problem.&lt;/p&gt;

&lt;p&gt;The safer approach is to create a stable operation ID and query the existing payment state.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P7123

PROCESSING
   ↓
UNKNOWN
   ↓
RECONCILED
   ↓
SUCCEEDED / FAILED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An uncertain state is better than falsely declaring failure.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Agent memory cannot become financial truth
&lt;/h3&gt;

&lt;p&gt;The agent may say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I paid your broadband bill.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That statement is conversational state.&lt;/p&gt;

&lt;p&gt;It is not accounting evidence.&lt;/p&gt;

&lt;p&gt;The authoritative result should come from the financial platform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent requests payment
        ↓
Payment service creates operation
        ↓
Processor invoked
        ↓
Provider result / event received
        ↓
Authoritative transaction state advances
        ↓
Agent reads final state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The direction matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Financial state informs the agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent should not tell the financial system what happened merely because the model believes it happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A practical AI-native FinTech stack can separate responsibilities into several boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobile / Web Client
        ↓
Identity + Device Signals
        ↓
Intent Service
        ↓
Agent Runtime
        ↓
Policy &amp;amp; Authorization Engine
        ↓
Capability Gateway
        ↓
Financial Domain Services
        ↓
Payment Orchestrator
        ↓
Ledger / Authoritative State
        ↓
Banks / Networks / Payment Rails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few principles become especially important.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert natural-language requests into structured intents before financial execution.&lt;/li&gt;
&lt;li&gt;Keep enforceable financial rules outside prompts.&lt;/li&gt;
&lt;li&gt;Give agents narrowly scoped capabilities rather than unrestricted service access.&lt;/li&gt;
&lt;li&gt;Revalidate authorization immediately before consequential execution.&lt;/li&gt;
&lt;li&gt;Use stable operation identifiers and idempotency for retry-sensitive mutations.&lt;/li&gt;
&lt;li&gt;Represent pending and ambiguous outcomes explicitly.&lt;/li&gt;
&lt;li&gt;Keep conversational state separate from authoritative financial state.&lt;/li&gt;
&lt;li&gt;Design reconciliation as part of the payment flow, not as an afterthought.&lt;/li&gt;
&lt;li&gt;Correlate customer, device, agent, policy, and payment identities for auditability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Events Matter Too
&lt;/h2&gt;

&lt;p&gt;AI workflows should not become the synchronization mechanism for the entire financial platform.&lt;/p&gt;

&lt;p&gt;Many important payment outcomes happen asynchronously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;processor callbacks&lt;/li&gt;
&lt;li&gt;settlement&lt;/li&gt;
&lt;li&gt;reversals&lt;/li&gt;
&lt;li&gt;refunds&lt;/li&gt;
&lt;li&gt;fraud decisions&lt;/li&gt;
&lt;li&gt;reconciliation findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A payment platform may therefore produce events such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PaymentRequested
PaymentAuthorized
PaymentSubmitted
PaymentSucceeded
PaymentFailed
PaymentReversed
SettlementCompleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But asynchronous architecture introduces its own failure modes.&lt;/p&gt;

&lt;p&gt;Messages may be delivered more than once.&lt;/p&gt;

&lt;p&gt;Consumers may crash and retry.&lt;/p&gt;

&lt;p&gt;A database write may succeed while event publication fails.&lt;/p&gt;

&lt;p&gt;Ordering may differ from expectations.&lt;/p&gt;

&lt;p&gt;Patterns such as a transactional outbox can help coordinate local state changes and event publication, but consumers should still tolerate duplicate delivery.&lt;/p&gt;

&lt;p&gt;Exactly-once assumptions are dangerous around money.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Consider the customer's instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pay my broadband bill every month if it remains below ₹1,500.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The platform stores a bounded delegation.&lt;/p&gt;

&lt;p&gt;Later, a ₹1,249 bill arrives.&lt;/p&gt;

&lt;p&gt;The agent prepares the payment.&lt;/p&gt;

&lt;p&gt;Before execution, deterministic systems verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the biller is approved&lt;/li&gt;
&lt;li&gt;the amount is below the delegated limit&lt;/li&gt;
&lt;li&gt;the authorization has not expired&lt;/li&gt;
&lt;li&gt;relevant account and risk conditions still permit execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The orchestrator creates payment operation &lt;code&gt;P7123&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The provider processes the transaction, but the response times out.&lt;/p&gt;

&lt;p&gt;A weak implementation creates another payment.&lt;/p&gt;

&lt;p&gt;A stronger implementation asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is the state of P7123?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transaction remains &lt;code&gt;PROCESSING&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Later, the provider reports success.&lt;/p&gt;

&lt;p&gt;The authoritative financial state moves to &lt;code&gt;SUCCEEDED&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Only then does the agent tell the customer that the payment completed.&lt;/p&gt;

&lt;p&gt;The agent did not decide that money moved.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;observed financial state produced by the payment platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction is fundamental.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;AI agents can reduce friction across financial workflows.&lt;/p&gt;

&lt;p&gt;They can understand intent, coordinate services, personalize experiences, and automate decisions that previously required multiple screens and manual actions.&lt;/p&gt;

&lt;p&gt;But greater autonomy requires stronger infrastructure underneath:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bounded delegation&lt;/li&gt;
&lt;li&gt;least privilege&lt;/li&gt;
&lt;li&gt;deterministic authorization&lt;/li&gt;
&lt;li&gt;capability isolation&lt;/li&gt;
&lt;li&gt;idempotent execution&lt;/li&gt;
&lt;li&gt;explicit transaction state&lt;/li&gt;
&lt;li&gt;reconciliation&lt;/li&gt;
&lt;li&gt;auditability&lt;/li&gt;
&lt;li&gt;revocation&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture should not become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobile App
   ↓
AI Agent
   ↓
Payment API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A safer direction is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer Intent
      ↓
Bounded Delegation
      ↓
Agent Reasoning
      ↓
Deterministic Policy
      ↓
Controlled Capability
      ↓
Financial State Machine
      ↓
Authoritative Financial State
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interface may become conversational.&lt;/p&gt;

&lt;p&gt;The orchestration may become intelligent.&lt;/p&gt;

&lt;p&gt;The customer may perform fewer explicit actions.&lt;/p&gt;

&lt;p&gt;But the closer software gets to autonomous money movement, the more precisely the platform must define &lt;strong&gt;where reasoning ends and financial authority begins&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/from-mobile-tap-to-autonomous-agent-a-reference-architecture-for-the-ai-native-fintech-stack-7e5c19b29920" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#FinTechArchitecture #AgenticAI #PaymentSystems #SoftwareArchitecture&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>ai</category>
      <category>architecture</category>
      <category>payments</category>
    </item>
    <item>
      <title>From Document Upload to Provenance Chain: Architecting Verifiable Evidence for AI-Assisted KYC</title>
      <dc:creator>Vaibhav Shakya</dc:creator>
      <pubDate>Thu, 08 Oct 2026 04:50:48 +0000</pubDate>
      <link>https://dev.to/vaibhav_shakya_e6b352bfc4/from-document-upload-to-provenance-chain-architecting-verifiable-evidence-for-ai-assisted-kyc-4di2</link>
      <guid>https://dev.to/vaibhav_shakya_e6b352bfc4/from-document-upload-to-provenance-chain-architecting-verifiable-evidence-for-ai-assisted-kyc-4di2</guid>
      <description>&lt;p&gt;A customer uploads an identity document.&lt;/p&gt;

&lt;p&gt;OCR extracts the name and document number. A model classifies the image. Another component detects suspicious regions. AI compares extracted attributes with application data, and eventually the customer becomes KYC-approved.&lt;/p&gt;

&lt;p&gt;From the application perspective, this can look simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document Upload
    ↓
OCR
    ↓
AI
    ↓
KYC Approved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Architecturally, that hides an important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can we reconstruct exactly what evidence, transformation, model, rule, and human decision produced the final result?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is where KYC starts becoming an &lt;strong&gt;evidence provenance problem&lt;/strong&gt; rather than only a document-processing problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A document is evidence.&lt;/p&gt;

&lt;p&gt;An OCR result is a derived interpretation of that evidence.&lt;/p&gt;

&lt;p&gt;An AI-generated conclusion is another derived claim.&lt;/p&gt;

&lt;p&gt;A final KYC status is a policy or human decision based on some combination of those artifacts.&lt;/p&gt;

&lt;p&gt;These should not be treated as equivalent.&lt;/p&gt;

&lt;p&gt;For example, OCR may correctly extract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name: Rahul Sharma
Document Number: ABC12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That does not prove the document is genuine.&lt;/p&gt;

&lt;p&gt;Similarly, a cryptographic hash can help establish that stored bytes have not changed, but it does not establish that the underlying document is authentic.&lt;/p&gt;

&lt;p&gt;The architecture needs to preserve these distinctions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Difficult
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Derived data can silently replace evidence
&lt;/h3&gt;

&lt;p&gt;Suppose OCR initially extracts the wrong document number and a later model produces the correct value.&lt;/p&gt;

&lt;p&gt;If the system simply updates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document_number = corrected_value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the historical reasoning disappears.&lt;/p&gt;

&lt;p&gt;A better model keeps the lineage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SOURCE_DOCUMENT:v1
    ↓
OCR_RESULT:v3
    ↓
ATTRIBUTE_SET:v2
    ↓
POLICY_EVALUATION:v7
    ↓
KYC_DECISION:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If OCR is rerun later using another model version, it should create another branch rather than rewrite the evidence used by the original decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI inference can become accidental truth
&lt;/h3&gt;

&lt;p&gt;AI may be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comparing names,&lt;/li&gt;
&lt;li&gt;identifying inconsistent fields,&lt;/li&gt;
&lt;li&gt;classifying unusual layouts,&lt;/li&gt;
&lt;li&gt;summarizing discrepancies,&lt;/li&gt;
&lt;li&gt;prioritizing manual reviews.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But an AI result should remain a &lt;strong&gt;derived claim&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If one document contains:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VAIBHAV S SHAKYA&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and another contains:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VAIBHAV SHAKYA&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;a model may conclude:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Likely same identity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That conclusion can be useful without rewriting either source.&lt;/p&gt;

&lt;p&gt;The system should preserve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;both source values,&lt;/li&gt;
&lt;li&gt;the comparison operation,&lt;/li&gt;
&lt;li&gt;model or algorithm version,&lt;/li&gt;
&lt;li&gt;resulting interpretation,&lt;/li&gt;
&lt;li&gt;downstream policy decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Retries can create competing evidence chains
&lt;/h3&gt;

&lt;p&gt;Imagine an upload reaches the backend, but the client times out before receiving the response.&lt;/p&gt;

&lt;p&gt;The client retries.&lt;/p&gt;

&lt;p&gt;Without idempotency, the platform may create two evidence records, trigger two OCR jobs, and run two policy evaluations for what the user considers one submission.&lt;/p&gt;

&lt;p&gt;One branch may pass automatically while another reaches manual review.&lt;/p&gt;

&lt;p&gt;For evidence-processing workflows, idempotency is not only a reliability concern.&lt;/p&gt;

&lt;p&gt;It protects the coherence of the provenance chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Current state is not historical reasoning
&lt;/h3&gt;

&lt;p&gt;A customer profile might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kyc_status = VERIFIED
verified_name = "Ananya Rao"
risk_level = LOW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful operational state.&lt;/p&gt;

&lt;p&gt;It cannot answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which artifact introduced the name?&lt;/li&gt;
&lt;li&gt;Which validator confirmed it?&lt;/li&gt;
&lt;li&gt;Which model or normalization version processed it?&lt;/li&gt;
&lt;li&gt;Which policy approved the customer?&lt;/li&gt;
&lt;li&gt;Did a reviewer override an earlier decision?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current state and historical evidence usually need different models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Direction
&lt;/h2&gt;

&lt;p&gt;A stronger design treats every material artifact as part of a provenance graph.&lt;/p&gt;

&lt;p&gt;The raw uploaded document becomes a source node.&lt;/p&gt;

&lt;p&gt;Every processor creates a derived artifact that references its input.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw Evidence
    ↓
OCR Extraction
    ↓
Document Validation
    ↓
Attribute Verification
    ↓
AI Interpretation
    ↓
Policy Evaluation
    ↓
Human Review
    ↓
KYC Decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few principles make this architecture much easier to reason about.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preserve source evidence separately
&lt;/h3&gt;

&lt;p&gt;Do not retain only the resized, enhanced, cropped, or OCR-optimized representation.&lt;/p&gt;

&lt;p&gt;Where retention policy permits, preserve the original source artifact separately from derived versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build around evidence IDs
&lt;/h3&gt;

&lt;p&gt;Derived artifacts should reference their parent evidence instead of overwriting it.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Evidence&lt;/span&gt; &lt;span class="n"&gt;derived&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;evidenceRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Evidence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;EvidenceType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OCR_RESULT&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;rawDocument&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ocrJson&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;ocrEngine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instant&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important idea is &lt;code&gt;append&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The OCR result becomes another artifact in the chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep inference separate from policy
&lt;/h3&gt;

&lt;p&gt;Avoid allowing a probabilistic component to directly mutate customer state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model.score &amp;gt; 0.91
→ VERIFIED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI inference
    ↓
Derived signals
    ↓
Versioned policy
    ↓
APPROVE / REVIEW / REJECT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model produces signals.&lt;/p&gt;

&lt;p&gt;The policy decides what the organization is allowed to do with those signals.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version anything that can influence a decision
&lt;/h3&gt;

&lt;p&gt;That may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCR models,&lt;/li&gt;
&lt;li&gt;AI models,&lt;/li&gt;
&lt;li&gt;normalization algorithms,&lt;/li&gt;
&lt;li&gt;prompt or task definitions,&lt;/li&gt;
&lt;li&gt;schemas,&lt;/li&gt;
&lt;li&gt;policy rules,&lt;/li&gt;
&lt;li&gt;decision thresholds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without versions, historical reconstruction becomes guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Example
&lt;/h2&gt;

&lt;p&gt;Suppose rejection rates suddenly increase after a deployment.&lt;/p&gt;

&lt;p&gt;The current database only says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status = REJECTED
reason = NAME_MISMATCH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without provenance, engineers start reproducing uploads and searching logs.&lt;/p&gt;

&lt;p&gt;With lineage, they can follow the decision.&lt;/p&gt;

&lt;p&gt;The rejection used policy version 17.&lt;/p&gt;

&lt;p&gt;Policy version 17 evaluated:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RAHUL K SHARMA&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That value came from normalization service version 6.&lt;/p&gt;

&lt;p&gt;The parent OCR value was:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RAHUL KUMAR SHARMA&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Another evidence source contained:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RAHUL SHARMA&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The customer's documents did not change.&lt;/p&gt;

&lt;p&gt;The transformation in the middle of the chain did.&lt;/p&gt;

&lt;p&gt;That is exactly what evidence provenance should make visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;AI-assisted KYC should not treat the uploaded document, AI output, and final KYC status as interchangeable truth.&lt;/p&gt;

&lt;p&gt;They represent different layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence&lt;/strong&gt; records what existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interpretation&lt;/strong&gt; records what the system inferred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy&lt;/strong&gt; records what the organization decided to do with that inference.&lt;/p&gt;

&lt;p&gt;The goal is not to log everything forever.&lt;/p&gt;

&lt;p&gt;The goal is to make consequential decisions &lt;strong&gt;reconstructable&lt;/strong&gt; without silently destroying the evidence and reasoning that produced them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want the deeper architectural breakdown, implementation considerations, failure scenarios, privacy trade-offs, cryptographic chaining discussion, and full reasoning?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@vaibhav.shakya786/from-document-upload-to-provenance-chain-architecting-verifiable-evidence-for-ai-assisted-kyc-a241abd362d3" rel="noopener noreferrer"&gt;Read the full article on Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#SoftwareArchitecture #ArtificialIntelligence #KYC #SecurityArchitecture&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ai</category>
      <category>security</category>
      <category>fintech</category>
    </item>
  </channel>
</rss>
