01
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1f2d', 'primaryTextColor': '#00c8ff', 'primaryBorderColor': '#005a72', 'lineColor': '#005a72', 'secondaryColor': '#0a1a10', 'tertiaryColor': '#1a1008', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'titleColor': '#00c8ff', 'nodeTextColor': '#c8e8f0', 'fontFamily': 'Share Tech Mono'}}}%%
graph LR
ALGOL["ALGOL 60\n1960"] --> PASCAL
SIMULA["Simula 67\n1967\nFirst OOP"] --> CPLUSPLUS
SIMULA --> SMALLTALK
PASCAL["Pascal\n1970\nWirth"] --> MODULA
PASCAL --> DELPHI
PASCAL --> ADA
MODULA["Modula-2\n1978\nWirth"] --> OBERON
OBERON["Oberon\n1987\nWirth"] --> GO
CPLUSPLUS["C++\n1979\nStroustrup"] --> JAVA
CPLUSPLUS --> RUST
CPLUSPLUS --> CSHARP
DELPHI["Delphi\n1995\nHejlsberg"] --> JAVA
DELPHI --> CSHARP
SMALLTALK["Smalltalk\n1972\nKay"] --> JAVA
SMALLTALK --> RUBY
RUBY --> ELIXIR
ERLANG["Erlang\n1986\nEricsson\nActor Model"] --> ELIXIR
ELIXIR["Elixir\n2011\nValim"] -.->|"BEAM VM\nprocess model"| JAVA21
ML["ML\n1973\nFunctional"] --> HASKELL
HASKELL["Haskell\n1990\nPure FP\nLazy"] --> SCALA
HASKELL -.->|"monads\nlambdas\nADTs"| JAVA8
LISP["Lisp\n1958\nMcCarthy"] --> CLOJURE
LISP --> HASKELL
CLOJURE["Clojure\n2007\nHickey\nImmutability"] -.->|"persistent\ncollections"| JAVA
JAVA["Java 1.0\n1995\nGosling/Sun"] --> JAVA8["Java 8\n2014\nLambdas\nStreams"]
JAVA8 --> JAVA21["Java 21\n2023\nVirtual Threads\nSealed+Records"]
JAVA --> SCALA
SCALA["Scala\n2004\nOdersky\nFP+OOP"] -.->|"pattern match\nsealed classes"| JAVA17["Java 17\n2021\nSealed\nPatterns"]
JAVA17 --> JAVA21
JAVA --> KOTLIN
KOTLIN["Kotlin\n2011\nJetBrains\nNull-safe"] -.->|"records\nextensions"| JAVA21
CSHARP["C#\n2000\nHejlsberg\nasync/await"] -.->|"records\npatterns\nvar"| JAVA21
CSHARP --> TYPESCRIPT["TypeScript\n2012\nHejlsberg"]
JAVASCRIPT["JavaScript\n1995\nEich"] --> TYPESCRIPT
GO["Go\n2009\nPike/Thompson\nGoroutines"] -.->|"virtual threads\nLoom"| JAVA21
RUST["Rust\n2015\nHoare\nOwnership"] -.->|"Valhalla\nvalue types"| JAVA25["Java 25\n2025 LTS"]
JAVA21 --> JAVA25
classDef javaNode fill:#0d2a1a,stroke:#39ff14,color:#39ff14,font-weight:bold
classDef influencer fill:#0d1f2d,stroke:#00c8ff,color:#00c8ff
classDef hejls fill:#1a0d2a,stroke:#a855f7,color:#a855f7
classDef functional fill:#1a1008,stroke:#ffaa00,color:#ffaa00
classDef systems fill:#1a0808,stroke:#ff2d9e,color:#ff2d9e
class JAVA,JAVA8,JAVA17,JAVA21,JAVA25 javaNode
class GO,KOTLIN,SCALA,CLOJURE,ELIXIR,ERLANG influencer
class PASCAL,DELPHI,CSHARP,TYPESCRIPT hejls
class HASKELL,ML,LISP,CLOJURE functional
class CPLUSPLUS,RUST,C systems
→ solid arrows = direct lineage / syntactic inheritance |
-.-> dashed arrows = conceptual borrowing (Java absorbed the idea) |
Purple cluster = the Hejlsberg thread: Pascal→Delphi→C#→TypeScript
02
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1f2d', 'primaryTextColor': '#00c8ff', 'lineColor': '#005a72', 'secondaryColor': '#0a1810', 'actorBkg': '#0d1f2d', 'actorBorder': '#00c8ff', 'actorTextColor': '#c8e8f0', 'activationBorderColor': '#39ff14', 'activationBkgColor': '#0a1a0a', 'signalColor': '#00c8ff', 'signalTextColor': '#c8e8f0', 'noteBkgColor': '#1a1008', 'noteBorderColor': '#ffaa00', 'noteTextColor': '#ffaa00', 'fontFamily': 'Share Tech Mono', 'fontSize': '12px'}}}%%
sequenceDiagram
actor User
participant Orch as Orchestrator
(LangChain4j) participant LLM as LLM
(Claude/GPT) participant Tools as Tool Registry
(Spring Services) participant Guard as Guardrails
(PII + Safety) participant Eval as Evaluator
(LLM-as-Judge) User->>Orch: "Why did payment PAY-991 fail?" Orch->>Guard: Sanitize input, inject system context Guard-->>Orch: Cleaned prompt + compliance rules Orch->>LLM: Thought prompt with tools schema Note over LLM: THOUGHT: Need to check
payment status first LLM-->>Orch: Action: get_payment("PAY-991") Orch->>Tools: Invoke PaymentService.findById() Tools-->>Orch: {status: DECLINED, code: "INSUFFICIENT_FUNDS", riskScore: 87} Orch->>LLM: Observation: payment data returned Note over LLM: THOUGHT: High risk score.
Need to check risk rules LLM-->>Orch: Action: get_risk_rules(score=87) Orch->>Tools: Invoke RiskService.getRulesForScore() Tools-->>Orch: {threshold: 85, action: "BLOCK", reason: "velocity limit"} Orch->>LLM: Observation: risk rules returned Note over LLM: THOUGHT: I have enough
context to answer LLM-->>Orch: Final Answer: structured response Orch->>Guard: Scrub PII from response Guard-->>Orch: Sanitized response Orch->>Eval: Grade: faithful? grounded? safe? Eval-->>Orch: Score 0.94 — PASS Orch-->>User: Grounded, audited answer Note over Orch,Eval: Full trace logged to LangSmith
Latency + tokens + tool calls recorded
(LangChain4j) participant LLM as LLM
(Claude/GPT) participant Tools as Tool Registry
(Spring Services) participant Guard as Guardrails
(PII + Safety) participant Eval as Evaluator
(LLM-as-Judge) User->>Orch: "Why did payment PAY-991 fail?" Orch->>Guard: Sanitize input, inject system context Guard-->>Orch: Cleaned prompt + compliance rules Orch->>LLM: Thought prompt with tools schema Note over LLM: THOUGHT: Need to check
payment status first LLM-->>Orch: Action: get_payment("PAY-991") Orch->>Tools: Invoke PaymentService.findById() Tools-->>Orch: {status: DECLINED, code: "INSUFFICIENT_FUNDS", riskScore: 87} Orch->>LLM: Observation: payment data returned Note over LLM: THOUGHT: High risk score.
Need to check risk rules LLM-->>Orch: Action: get_risk_rules(score=87) Orch->>Tools: Invoke RiskService.getRulesForScore() Tools-->>Orch: {threshold: 85, action: "BLOCK", reason: "velocity limit"} Orch->>LLM: Observation: risk rules returned Note over LLM: THOUGHT: I have enough
context to answer LLM-->>Orch: Final Answer: structured response Orch->>Guard: Scrub PII from response Guard-->>Orch: Sanitized response Orch->>Eval: Grade: faithful? grounded? safe? Eval-->>Orch: Score 0.94 — PASS Orch-->>User: Grounded, audited answer Note over Orch,Eval: Full trace logged to LangSmith
Latency + tokens + tool calls recorded
Key insight: The LLM decides the control flow — which tools to call, in what order, when to stop. |
Guardrails wrap both input and output — mandatory in PCI-regulated fintech environments. |
LLM-as-Judge evaluation runs on every response before delivery — non-deterministic systems require their own test harness.
03
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1a10', 'primaryTextColor': '#39ff14', 'primaryBorderColor': '#1a5020', 'lineColor': '#1a5020', 'secondaryColor': '#0d1f2d', 'tertiaryColor': '#1a0d10', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
subgraph CMD["COMMAND SIDE — Write Model"]
C1["REST Command\nPOST /payments"]
C2["Command Handler\nPaymentCommandService"]
C3["Payment Aggregate\nDomain Logic + Invariants"]
C4["Event Store\nPostgres — append only"]
C5["Outbox Table\nSame transaction"]
end
subgraph SAGA["SAGA ORCHESTRATOR"]
S1["PaymentSaga\nOrchestrator"]
S2["Step: Risk Check\nRiskService.assess()"]
S3["Step: Reserve Funds\nLedgerService.reserve()"]
S4["Step: Notify Processor\nCardNetwork.submit()"]
S5["Compensate: Release Funds\nLedgerService.release()"]
end
subgraph EVENTS["EVENT STREAM — Kafka"]
E1[("payment.events\ntopic")]
E2[("payment.commands\ntopic")]
end
subgraph QUERY["QUERY SIDE — Read Models"]
Q1["Projection Builder\nEvent Consumer"]
Q2["Payment Summary View\nPostgres Denormalized"]
Q3["Analytics View\nElasticsearch"]
Q4["Audit Log View\nImmutable S3"]
Q5["Query Handler\nGET /payments/:id"]
end
C1 --> C2
C2 --> C3
C3 -->|"validate invariants\ngenerate domain events"| C4
C4 -->|"same DB txn"| C5
C5 -->|"Debezium CDC\nor Poller"| E1
E1 --> S1
S1 --> S2
S2 -->|"pass"| S3
S3 -->|"pass"| S4
S4 -->|"fail"| S5
S5 -->|"compensation event"| E1
S2 -->|"fail → block"| S5
E1 --> Q1
Q1 --> Q2
Q1 --> Q3
Q1 --> Q4
Q2 --> Q5
Q3 --> Q5
Q5 -->|"Optimized read\nno JOIN with write model"| C1
classDef cmd fill:#0a1a10,stroke:#39ff14,color:#c8e8f0
classDef saga fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef evt fill:#1a0d2a,stroke:#a855f7,color:#c8e8f0
classDef qry fill:#1a1008,stroke:#ffaa00,color:#c8e8f0
class C1,C2,C3,C4,C5 cmd
class S1,S2,S3,S4,S5 saga
class E1,E2 evt
class Q1,Q2,Q3,Q4,Q5 qry
Event Store = source of truth. Read models are projections that can be rebuilt by replaying events. Saga compensations replace distributed transactions. Outbox guarantees at-least-once delivery. Together: the architecture can never lose a payment and can reconstruct any past state.
04
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1f2d', 'lineColor': '#005a72', 'primaryTextColor': '#00c8ff', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
subgraph ERA1["ERA 1: Java 1.0–4 · 1995–2004 · OS Threads"]
T1["Thread.start()\nOS Thread\n1MB+ stack\nMax ~500 threads"]
T2["synchronized\nwait/notify\nDeadlock-prone"]
T3["Thread Pool\nExecutorService\nJava 5 2004"]
end
subgraph ERA2["ERA 2: Java 5–8 · 2004–2014 · Concurrency Utilities"]
T4["java.util.concurrent\nLock, CAS, Atomic*\nFork/Join Pool"]
T5["CompletableFuture\nJava 8 2014\nAsync composition"]
T6["Reactive: RxJava\nProject Reactor\nBackpressure"]
end
subgraph ERA3["ERA 3: Java 19–21 · 2022–2023 · Project Loom"]
T7["Virtual Thread\nThread.ofVirtual()\n~1KB stack\nJVM-managed"]
T8["Carrier Thread Pool\nForkJoinPool\nM:N mapping"]
T9["Blocking IO auto-yields\nThread parks on carrier\nnot on OS thread"]
T10["StructuredTaskScope\nJava 21\nSupervised parallelism"]
end
subgraph COMPARE["SCALE COMPARISON · same hardware"]
S1["OS Threads\n~10K concurrent\n10GB RAM for stacks"]
S2["Reactive\n~100K concurrent\n Callback hell\nHard to debug"]
S3["Virtual Threads\n~1M concurrent\n1GB RAM for stacks\nBlocking code style"]
end
T1 --> T2 --> T3 --> T4
T3 --> T5
T4 --> T5
T5 --> T6
T5 -->|"replaced by"| T7
T6 -->|"simpler alternative"| T7
T7 --> T8
T8 --> T9
T9 --> T10
T1 -.-> S1
T6 -.-> S2
T7 -.-> S3
classDef era1 fill:#0d1a10,stroke:#39ff14,color:#c8e8f0
classDef era2 fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef era3 fill:#1a0d2a,stroke:#a855f7,color:#c8e8f0
classDef scale fill:#1a1008,stroke:#ffaa00,color:#c8e8f0
class T1,T2,T3 era1
class T4,T5,T6 era2
class T7,T8,T9,T10 era3
class S1,S2,S3 scale
Virtual threads mount onto carrier threads only during CPU work. During blocking IO (DB query, HTTP call) they unmount — carrier is free to run other virtual threads. |
The revolutionary part: you write simple blocking code; you get reactive-level scalability. |
Go had goroutines in 2009 — Java arrived 14 years later but with full JVM ecosystem compatibility.
05
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1a10', 'lineColor': '#1a5020', 'primaryTextColor': '#39ff14', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart LR
subgraph JVM["JVM MODEL — Shared Heap"]
direction TB
JH["SHARED HEAP\n~Xmx memory\nAll threads share"]
JT1["Thread 1\npayment handler"]
JT2["Thread 2\nrisk scorer"]
JT3["Thread 3\nnotification"]
JGC["STOP-THE-WORLD\nGC PAUSE\n(even ZGC: 1-5ms)"]
JT1 & JT2 & JT3 --> JH
JH -->|"GC pressure"| JGC
JGC -->|"pauses ALL threads"| JT1
JGC -->|"pauses ALL threads"| JT2
JGC -->|"pauses ALL threads"| JT3
end
subgraph BEAM["BEAM MODEL — Process Isolation"]
direction TB
BP1["Process P1\nown heap 300b\nown GC"]
BP2["Process P2\nown heap 300b\nown GC"]
BP3["Process P3\nown heap 300b\nown GC"]
BMAIL["Mailbox\nmessage passing\nno shared state"]
BG1["GC P1\npauses only P1"]
BG2["GC P2\npauses only P2"]
BP1 <-->|"immutable msg copy"| BMAIL
BP2 <-->|"immutable msg copy"| BMAIL
BP3 <-->|"immutable msg copy"| BMAIL
BP1 --> BG1
BP2 --> BG2
end
subgraph RESULT["CONSEQUENCE"]
R1["JVM: GC pause\naffects p99 latency\nacross entire service"]
R2["BEAM: 1M processes\nGC never global\nconsistent low latency"]
R3["Java Valhalla\nvalue types aim to\nreduce GC pressure"]
end
JGC --> R1
BG1 & BG2 --> R2
R1 -->|"motivates"| R3
classDef jvmStyle fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef beamStyle fill:#0a1a10,stroke:#39ff14,color:#c8e8f0
classDef result fill:#1a1008,stroke:#ffaa00,color:#ffaa00
class JH,JT1,JT2,JT3,JGC jvmStyle
class BP1,BP2,BP3,BMAIL,BG1,BG2 beamStyle
class R1,R2,R3 result
JVM innovation response: ZGC achieves sub-millisecond pauses by doing concurrent marking+relocation. Still global. Still coordinated. |
BEAM's bet: share nothing, copy messages, make processes cheap enough that isolation is free. |
Java Valhalla value types (Java 25) reduce heap allocation pressure by allowing structs on the stack — BEAM's influence on the JVM roadmap.
06
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#1a0808', 'lineColor': '#7a1010', 'primaryTextColor': '#ff2d9e', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
subgraph USER["USER LAYER"]
UA["Browser / Mobile App"]
PKCE["PKCE Challenge\ncode_verifier + SHA256"]
end
subgraph IDP["IDENTITY LAYER · Auth Server"]
AUTH["Authorization Server\nOkta / Auth0 / Keycloak"]
TOKEN["Token Endpoint\nPOST /oauth/token"]
JWKS["JWKS Endpoint\nPublic Key Set"]
end
subgraph EDGE["EDGE LAYER · API Gateway"]
GW["API Gateway\nKong / AWS API GW"]
RATE["Rate Limiter\n+ WAF"]
IDEM["Idempotency Key\nChecker"]
JWTVAL["JWT Validator\nSignature + Expiry + Scope"]
end
subgraph MESH["SERVICE MESH · Zero Trust Interior"]
direction LR
PS["Payment Service\nJava Spring Boot"]
RS["Risk Service\nPython FastAPI"]
LS["Ledger Service\nJava Spring Boot"]
ENV1["Envoy Sidecar\nmTLS cert"]
ENV2["Envoy Sidecar\nmTLS cert"]
ENV3["Envoy Sidecar\nmTLS cert"]
MTLS["mTLS Mutual Auth\nEven internal calls authenticated"]
end
subgraph SECRETS["SECRETS LAYER"]
VAULT["HashiCorp Vault\nDB passwords\nAPI keys\nSigning keys"]
end
UA --> PKCE
PKCE -->|"GET /authorize?code_challenge=..."| AUTH
AUTH -->|"authorization_code"| UA
UA -->|"POST /token + code_verifier"| TOKEN
TOKEN -->|"access_token JWT\nrefresh_token"| UA
UA -->|"Bearer JWT\nIdempotency-Key header"| GW
GW --> RATE
RATE --> IDEM
IDEM --> JWTVAL
AUTH --> JWKS
JWKS -->|"verify signature"| JWTVAL
JWTVAL -->|"scope: payments:write ✓"| PS
PS --- ENV1
RS --- ENV2
LS --- ENV3
ENV1 <-->|"mTLS: both sides present cert"| MTLS
ENV2 <-->|"service identity verified"| MTLS
ENV3 <-->|"no implicit trust"| MTLS
VAULT -->|"dynamic short-lived creds"| PS
VAULT -->|"dynamic short-lived creds"| RS
VAULT -->|"dynamic short-lived creds"| LS
classDef user fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef idp fill:#1a0d2a,stroke:#a855f7,color:#c8e8f0
classDef edge fill:#0d1a10,stroke:#39ff14,color:#c8e8f0
classDef mesh fill:#1a0808,stroke:#ff2d9e,color:#c8e8f0
classDef sec fill:#1a1008,stroke:#ffaa00,color:#ffaa00
class UA,PKCE user
class AUTH,TOKEN,JWKS idp
class GW,RATE,IDEM,JWTVAL edge
class PS,RS,LS,ENV1,ENV2,ENV3,MTLS mesh
class VAULT sec
PKCE = Proof Key for Code Exchange — prevents auth code interception on mobile/SPA. |
mTLS inside the mesh means a stolen JWT cannot be replayed from a non-authenticated service. Both the user and the calling service must authenticate. |
Vault dynamic creds = DB passwords that expire in 1 hour. No static secrets anywhere in the system.
07
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1f2d', 'lineColor': '#004a6a', 'primaryTextColor': '#00c8ff', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
Q["User Query\n'What are my GDPR rights\nregarding payment data?'"]
subgraph INGESTION["OFFLINE: DOCUMENT INGESTION PIPELINE"]
DOC["Source Docs\nPDFs · Policies · Regulations\nCode Comments"]
CHUNK["Chunker\nRecursive · Semantic\n512 token overlapping"]
EMB["Embedding Model\ntext-embedding-3-large"]
VDB[("Vector Store\npgvector / Pinecone\nHNSW index")]
BM25[("BM25 Index\nKeyword Search\nElasticsearch")]
DOC --> CHUNK --> EMB --> VDB
CHUNK --> BM25
end
subgraph ONLINE["ONLINE: QUERY PIPELINE"]
QR["Query Rewriter\nHyDE: generate hypothetical answer\nthen embed that for search"]
GUARD1["Input Guard\nPII scrub\nPrompt injection detect"]
HS["Hybrid Search\nVector sim + BM25\nRRF score fusion"]
RERANK["Cross-Encoder Reranker\ncohere-rerank-v3\nScore all candidates"]
TOPK["Top-K Chunks\nFiltered + Ranked\nContext window budget"]
PROMPT["Prompt Assembly\nSystem: compliance expert\nContext: {chunks}\nQuery: {rewritten}"]
LLM["LLM Generation\nStreaming response\nWith citations"]
GUARD2["Output Guard\nHallucination check\nCitation verification\nPII re-mask"]
EVAL["Eval Pipeline\nFaithfulness: is answer\ngrounded in context?\nRelevance score"]
CACHE["Semantic Cache\nSimilar query? Return cached\nCost: near zero"]
end
Q --> GUARD1 --> QR
QR -->|"embed rewritten query"| HS
VDB --> HS
BM25 --> HS
HS --> RERANK
RERANK --> TOPK
TOPK --> PROMPT
PROMPT --> LLM
LLM --> GUARD2
GUARD2 --> EVAL
EVAL -->|"score OK"| Q
QR -->|"cache hit?"| CACHE
CACHE -->|"hit → skip LLM"| Q
classDef ingest fill:#0a1a10,stroke:#39ff14,color:#c8e8f0
classDef online fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef guard fill:#1a0808,stroke:#ff2d9e,color:#c8e8f0
class DOC,CHUNK,EMB,VDB,BM25 ingest
class QR,HS,RERANK,TOPK,PROMPT,LLM,EVAL,CACHE online
class GUARD1,GUARD2 guard
HyDE (Hypothetical Document Embedding) = generate a fake answer to the query, then search for documents similar to that fake answer. Often 20-40% better retrieval than searching with the raw question. |
Hybrid search + RRF = vector search finds semantic matches; BM25 finds keyword matches; Reciprocal Rank Fusion combines both scores. Neither alone is sufficient. |
Semantic cache = if a new query is within cosine distance 0.95 of a previous query, return cached result. Reduces LLM API costs 30-60% in practice.
08
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'stateBkg': '#0d1f2d', 'stateBorder': '#005a72', 'labelColor': '#c8e8f0', 'transitionColor': '#005a72', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
stateDiagram-v2
direction LR
[*] --> INITIATED: createPayment()
INITIATED --> RISK_PENDING: submit for risk assessment
INITIATED --> DECLINED: invalid input / limit exceeded
RISK_PENDING --> AUTHORIZED: riskScore below threshold
RISK_PENDING --> DECLINED: riskScore exceeds threshold
RISK_PENDING --> MANUAL_REVIEW: riskScore in grey zone
MANUAL_REVIEW --> AUTHORIZED: analyst approves
MANUAL_REVIEW --> DECLINED: analyst rejects
AUTHORIZED --> CAPTURED: merchant triggers capture
AUTHORIZED --> VOIDED: merchant cancels pre-capture
AUTHORIZED --> EXPIRED: capture window exceeded (72h)
CAPTURED --> SETTLEMENT_PENDING: submitted to card network
CAPTURED --> REFUND_INITIATED: refund requested pre-settlement
SETTLEMENT_PENDING --> SETTLED: card network confirms
SETTLEMENT_PENDING --> SETTLEMENT_FAILED: card network rejects
SETTLEMENT_FAILED --> SETTLEMENT_PENDING: retry (max 3)
SETTLEMENT_FAILED --> FAILED: max retries exceeded
SETTLED --> REFUND_INITIATED: refund request
SETTLED --> CHARGEBACK_RECEIVED: customer disputes
REFUND_INITIATED --> REFUNDING: approved
REFUNDING --> REFUNDED: funds returned
REFUNDING --> REFUND_FAILED: reversal rejected
CHARGEBACK_RECEIVED --> CHARGEBACK_FIGHTING: merchant submits evidence
CHARGEBACK_RECEIVED --> CHARGEBACK_ACCEPTED: merchant concedes
CHARGEBACK_FIGHTING --> CHARGEBACK_WON: issuer sides with merchant
CHARGEBACK_FIGHTING --> CHARGEBACK_LOST: issuer sides with customer
DECLINED --> [*]: terminal — no funds moved
VOIDED --> [*]: terminal — authorization released
EXPIRED --> [*]: terminal — hold released
REFUNDED --> [*]: terminal — funds returned
CHARGEBACK_WON --> [*]: terminal — merchant keeps funds
CHARGEBACK_LOST --> [*]: terminal — chargeback deducted
FAILED --> [*]: terminal — manual reconciliation required
Every terminal state must be accounted for in the ledger — even FAILED requires reconciliation entries. |
CHARGEBACK_LOST triggers a compensation saga that debits the merchant's settlement account. |
Java implementation: sealed interface PaymentStatus with one record per state, pattern-matched switch in the domain service — the compiler enforces exhaustive handling of every state.
09
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#1a1008', 'lineColor': '#7a5000', 'primaryTextColor': '#ffaa00', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
START["What are your requirements?"]
Q1{"Network partition\nwill occur. Choose:"}
Q2{"Consistency\nrequired during partition?"}
Q3{"System available\nduring partition?"}
Q4{"Normal operation:\nLatency or Consistency?"}
Q5{"How strong\nconsistency needed?"}
Q6{"Global distribution\nrequired?"}
CP["CP System\nConsistent + Partition Tolerant\nMay be unavailable during partition"]
AP["AP System\nAvailable + Partition Tolerant\nMay serve stale data"]
PAC_L["PACELC: EL\nElse: prefer Latency\nAccept eventual consistency\nnormal operation"]
PAC_C["PACELC: EC\nElse: prefer Consistency\nAccept higher latency\nnormal operation"]
EVENTUAL["Eventual Consistency\nDynamoDB default\nCassandra default\nRedis replication"]
STRONG["Strong Consistency\nDynamoDB strong reads\nCockroachDB transactions\nSpanner"]
LINEARIZABLE["Linearizable\nZooKeeper / etcd\nConsul\nPostgres single-node"]
SPANNER["Globally Consistent\nGoogle Spanner\nCockroachDB global\nExternal consistency"]
USE1["Use for:\nAccount balances\nLedger entries\nIdempotency keys\nSESSION data"]
USE2["Use for:\nUser activity feeds\nProduct catalogs\nAnalytics\nSearch indexes"]
USE3["Use for:\nDistributed locks\nLeader election\nConfig management\nService registry"]
USE4["Use for:\nGlobal payment routing\nMulti-region ledger\nCompliance data"]
START --> Q1
Q1 --> Q2
Q2 -->|"YES — data integrity critical"| CP
Q2 -->|"NO — availability preferred"| AP
Q3 -->|"YES"| AP
Q3 -->|"NO — accept downtime"| CP
AP --> Q4
Q4 -->|"Latency matters more"| PAC_L
Q4 -->|"Consistency matters more"| PAC_C
PAC_L --> EVENTUAL
PAC_C --> STRONG
CP --> Q5
Q5 -->|"Causal or Sequential"| STRONG
Q5 -->|"Linearizable ops"| LINEARIZABLE
STRONG --> Q6
Q6 -->|"YES multi-region"| SPANNER
Q6 -->|"NO single region"| STRONG
EVENTUAL --> USE2
STRONG --> USE1
LINEARIZABLE --> USE3
SPANNER --> USE4
classDef decision fill:#1a1008,stroke:#ffaa00,color:#ffaa00
classDef cap fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef db fill:#0a1a10,stroke:#39ff14,color:#39ff14
classDef use fill:#1a0808,stroke:#ff2d9e,color:#c8e8f0
class START,Q1,Q2,Q3,Q4,Q5,Q6 decision
class CP,AP,PAC_L,PAC_C cap
class EVENTUAL,STRONG,LINEARIZABLE,SPANNER db
class USE1,USE2,USE3,USE4 use
10
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1a10', 'lineColor': '#1a5020', 'primaryTextColor': '#39ff14', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#0a1208', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
subgraph OUTER["DRIVING ADAPTERS — Primary Ports — Left Side"]
HTTP["REST Controller\n@RestController Spring\nMaps HTTP → Command"]
KAFKA_IN["Kafka Consumer\n@KafkaListener\nMaps Event → Command"]
GRPC["gRPC Service\nGenerated from .proto\nMaps RPC → Command"]
end
subgraph DOMAIN["DOMAIN CORE — No Framework Dependencies"]
subgraph APPSERVICE["APPLICATION LAYER"]
USECASE["Use Case / Application Service\nOrchestrates domain objects\nTransactional boundary"]
CMD["Commands\nCreatePaymentCmd\nAuthorizePaymentCmd"]
EVENTS["Domain Events\nPaymentCreated\nPaymentAuthorized"]
end
subgraph DOMAINCORE["DOMAIN MODEL"]
AGG["Aggregate Root\nPayment\nEnforces invariants"]
ENT["Entities\nPaymentLine\nMerchant"]
VO["Value Objects\nMoney · PaymentId\nCardToken · RiskScore"]
DS["Domain Services\nTransferService\nRiskEvaluationService"]
end
subgraph PORTS["PORTS — Interfaces only, no impl"]
REPO_PORT["PaymentRepositoryPort\ninterface in domain"]
RISK_PORT["RiskServicePort\ninterface in domain"]
EVENT_PORT["EventPublisherPort\ninterface in domain"]
end
end
subgraph INNER["DRIVEN ADAPTERS — Secondary Ports — Right Side"]
JPA["JPA Adapter\nPaymentJpaRepository\nimplements Port"]
RISK_ADAPT["Risk HTTP Adapter\nRestTemplate / WebClient\nimplements Port"]
KAFKA_OUT["Kafka Publisher Adapter\nKafkaTemplate\nimplements Port"]
S3["Audit S3 Adapter\nAWS SDK\nimplements Port"]
end
HTTP -->|"command"| USECASE
KAFKA_IN -->|"command"| USECASE
GRPC -->|"command"| USECASE
CMD --> USECASE
USECASE --> AGG
USECASE --> DS
AGG --> VO
AGG --> ENT
AGG -->|"emits"| EVENTS
EVENTS --> EVENT_PORT
USECASE --> REPO_PORT
DS --> RISK_PORT
REPO_PORT -->|"implemented by"| JPA
RISK_PORT -->|"implemented by"| RISK_ADAPT
EVENT_PORT -->|"implemented by"| KAFKA_OUT
EVENT_PORT -->|"also"| S3
classDef driving fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef domain fill:#0a1a10,stroke:#39ff14,color:#c8e8f0
classDef ports fill:#1a1008,stroke:#ffaa00,color:#ffaa00
classDef driven fill:#1a0808,stroke:#ff2d9e,color:#c8e8f0
class HTTP,KAFKA_IN,GRPC driving
class USECASE,CMD,EVENTS,AGG,ENT,VO,DS domain
class REPO_PORT,RISK_PORT,EVENT_PORT ports
class JPA,RISK_ADAPT,KAFKA_OUT,S3 driven
The Dependency Rule: arrows always point inward. Domain never imports Spring, JPA, or Kafka. |
Test implication: the entire domain core can be tested without starting a Spring context, a database, or a Kafka broker. Pure Java unit tests. |
Port naming: the port interface lives in the domain; the adapter that implements it lives in infrastructure. That inversion is the entire pattern.
11
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#1a0808', 'lineColor': '#7a0048', 'primaryTextColor': '#ff2d9e', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '11px'}}}%%
flowchart TD
subgraph CONWAY["CONWAY'S LAW — Org Mirrors Architecture"]
O1["UI Team"]
O2["Backend Team"]
O3["DBA Team"]
A1["Frontend App"]
A2["Monolith API\n(all features)"]
A3["Shared Database\n(all tables)"]
O1 -->|"builds"| A1
O2 -->|"builds"| A2
O3 -->|"owns"| A3
A1 <-->|"API contract"| A2
A2 <-->|"SQL"| A3
end
subgraph TRAP["THE TRAP — Distributed Monolith"]
S1["Payment Service"]
S2["Order Service"]
S3["User Service"]
SHARD["Shared Database\n(still one schema!)"]
SYNC["Synchronous HTTP\nbetween ALL services"]
S1 -->|"HTTP"| S2
S2 -->|"HTTP"| S3
S3 -->|"HTTP"| S1
S1 & S2 & S3 --> SHARD
NOTE1["❌ Still coupled\nworst of both worlds:\nnot a monolith,\nnot microservices"]
end
subgraph INVERSE["INVERSE CONWAY MANEUVER — Team Topology First"]
T1["Payment Team\nowns full stack:\nfrontend + API + DB"]
T2["Risk Team\nowns full stack:\nML + rules engine + DB"]
T3["Identity Team\nowns full stack:\nauth + profile + DB"]
SVC1["Payment Service\n+ own Postgres\n+ own Kafka topics"]
SVC2["Risk Service\n+ own Redis\n+ own ML model"]
SVC3["Identity Service\n+ own Postgres\n+ own schema"]
ASYNC["Async Events\nKafka — no sync HTTP\nbetween bounded contexts"]
T1 -->|"owns"| SVC1
T2 -->|"owns"| SVC2
T3 -->|"owns"| SVC3
SVC1 <-->|"PaymentCreated event"| ASYNC
SVC2 <-->|"RiskAssessed event"| ASYNC
SVC3 <-->|"UserVerified event"| ASYNC
end
CONWAY -->|"team split wrong way"| TRAP
TRAP -->|"redesign teams first"| INVERSE
classDef trap fill:#1a0808,stroke:#ff2d9e,color:#c8e8f0
classDef good fill:#0a1a10,stroke:#39ff14,color:#c8e8f0
classDef conway fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
class S1,S2,S3,SHARD,SYNC,NOTE1 trap
class T1,T2,T3,SVC1,SVC2,SVC3,ASYNC good
class O1,O2,O3,A1,A2,A3 conway
Distributed Monolith = microservices in name only. Multiple services deployed separately but sharing a database and calling each other synchronously. You get the operational complexity of microservices with the coupling of a monolith. |
The fix is not technical — it's organizational. Reorganize teams around business capabilities first. The decoupled architecture follows automatically.
12
%%{init: {'theme': 'dark', 'themeVariables': {'background': '#080c10', 'primaryColor': '#0d1f2d', 'lineColor': '#005a72', 'primaryTextColor': '#00c8ff', 'edgeLabelBackground': '#080c10', 'clusterBkg': '#080c10', 'fontFamily': 'Share Tech Mono', 'fontSize': '10px'}}}%%
flowchart LR
subgraph DEV["DEVELOP"]
direction TB
IDE["Cursor / Windsurf\nAI-First IDE"]
COP["GitHub Copilot\nInline completion"]
REV["CodeRabbit\nAI PR Review\n+ Risk Notes"]
DOCS["Mintlify / Swimm\nAI Documentation\nSync with code"]
IDE --> COP --> REV --> DOCS
end
subgraph TEST["TEST"]
direction TB
DIFF["Diffblue Cover\nAI Test Generation\nJUnit from bytecode"]
PITEST["PIT Mutation\nTest quality gate\nbranch coverage"]
TC["Testcontainers\nReal Postgres/Kafka\nIntegration tests"]
PACT["Pact Contract\nConsumer-driven\nAPI contracts"]
DIFF --> PITEST --> TC --> PACT
end
subgraph SEC["SECURE"]
direction TB
SONAR["SonarQube\nSAST + Code Quality\nAI-suggested fixes"]
DEPCHK["OWASP Dep-Check\nCVE scanning\nLibrary vulnerabilities"]
GITSEC["Trufflehog\nSecrets detection\nin Git history"]
TRIVY["Trivy\nContainer vuln scan\nDistroless base"]
SONAR --> DEPCHK --> GITSEC --> TRIVY
end
subgraph BUILD["BUILD & CONTAINERIZE"]
direction TB
MAV["Maven / Gradle\nAI-generated build\noptimized caching"]
DOCKER["Dockerfile\nAI-generated\nMulti-stage distroless"]
IaC["Terraform / CDK\nAI-generated IaC\nvalidated by checkov"]
MAV --> DOCKER --> IaC
end
subgraph DEPLOY["DEPLOY"]
direction TB
GHA["GitHub Actions\nAI-scaffolded\nworkflow YAML"]
ECS["AWS ECS Fargate\nor GCP Cloud Run\nServerless containers"]
K8S["Kubernetes\nHelm charts\nAI-generated configs"]
GHA --> ECS --> K8S
end
subgraph OBSERVE["OBSERVE"]
direction TB
OTEL["OpenTelemetry\nTraces + Metrics\nSpring Boot auto"]
PROM["Prometheus\n+ Grafana\nAlert rules"]
QUERY["AI Log Query\n'Why is P99 high?'\nNatural language"]
OTEL --> PROM --> QUERY
end
DEV -->|"git push\nPR created"| TEST
TEST -->|"all tests pass"| SEC
SEC -->|"no critical vulns"| BUILD
BUILD -->|"image pushed\nto ECR"| DEPLOY
DEPLOY -->|"canary deploy\nfeature flag"| OBSERVE
OBSERVE -->|"metrics OK\nauto-rollout"| DEV
OBSERVE -->|"anomaly detected\nrollback"| DEPLOY
classDef devStyle fill:#0d1f2d,stroke:#00c8ff,color:#c8e8f0
classDef testStyle fill:#0a1a10,stroke:#39ff14,color:#c8e8f0
classDef secStyle fill:#1a0808,stroke:#ff2d9e,color:#c8e8f0
classDef buildStyle fill:#1a1008,stroke:#ffaa00,color:#c8e8f0
classDef deployStyle fill:#1a0d2a,stroke:#a855f7,color:#c8e8f0
classDef obsStyle fill:#0d1a1a,stroke:#00ffcc,color:#c8e8f0
class IDE,COP,REV,DOCS devStyle
class DIFF,PITEST,TC,PACT testStyle
class SONAR,DEPCHK,GITSEC,TRIVY secStyle
class MAV,DOCKER,IaC buildStyle
class GHA,ECS,K8S deployStyle
class OTEL,PROM,QUERY obsStyle
Every box = a real tool from the job description's tech stack or curriculum. |
The loop: Observe → feedback to Develop → commit → pipeline → Deploy → Observe is the DevSecOps cycle. AI participates at every stage, not just in the IDE. |
The meta-insight: Cursor can generate the GitHub Actions YAML. Copilot can generate the Dockerfile. LLMs can generate the Terraform. The AI doesn't just write the application — it writes the infrastructure that runs it.