{
  "generatedFrom": "Payments Signal canonical architecture registry",
  "reviewDate": "2026-07-23",
  "blueprint": {
    "id": "architecture-payment-state",
    "slug": "payment-state-events-and-idempotency",
    "title": "Payment lifecycle, state, event, queue, and idempotency architecture",
    "shortTitle": "Payment state and events",
    "family": "foundation",
    "summary": "A payment is not one database row that changes mysteriously. It is an ordered history of commands, proven outcomes, deadlines, and external facts.",
    "audience": "Solution architects, engineers, analysts, testers, and operations teams designing recoverable payment processing",
    "reviewDate": "2026-07-23",
    "versionLabel": "Reference architecture v1",
    "status": "current",
    "nodes": [
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Command intake",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-command",
        "title": "Command intake",
        "kind": "service",
        "summary": "Receives a request to do something and assigns it one identity.",
        "responsibilities": [
          "Authenticate the caller",
          "Validate the requested command",
          "Apply idempotency"
        ],
        "owner": "Payment platform",
        "inputs": [
          "Submit, cancel, release, return, retry, or repair command"
        ],
        "outputs": [
          "Accepted command or reasoned rejection"
        ],
        "interfaceContracts": [
          "Command identity and expected-state contract"
        ],
        "controls": [
          "Caller entitlement",
          "Expected version",
          "Idempotency key"
        ],
        "failureModes": [
          "Stale command",
          "Repeated command",
          "Unauthorised action"
        ],
        "recovery": [
          "Return the prior result or reject the stale action"
        ],
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Payment state machine",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-machine",
        "title": "Payment state machine",
        "kind": "application",
        "summary": "Allows only transitions that make sense for the payment’s proven history.",
        "responsibilities": [
          "Evaluate transitions",
          "Issue downstream commands",
          "Record pending and final states"
        ],
        "owner": "Payment platform",
        "inputs": [
          "Commands and dependency outcomes"
        ],
        "outputs": [
          "New state, events, timers, and exceptions"
        ],
        "interfaceContracts": [
          "Transition table and result contract"
        ],
        "controls": [
          "Optimistic concurrency",
          "Final-state protection",
          "Reason codes"
        ],
        "failureModes": [
          "Impossible transition",
          "Two writers",
          "State ahead of evidence"
        ],
        "recovery": [
          "Quarantine conflicts",
          "Rebuild from the journal",
          "Reconcile external facts"
        ],
        "lenses": [
          "applications",
          "data",
          "controls",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Immutable event journal",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-journal",
        "title": "Immutable event journal",
        "kind": "data-store",
        "summary": "Keeps the ordered facts from which the current payment state can be explained.",
        "responsibilities": [
          "Append facts once",
          "Preserve order",
          "Link commands and results"
        ],
        "owner": "Payment platform",
        "inputs": [
          "Accepted state events"
        ],
        "outputs": [
          "Event stream and reconstructed history"
        ],
        "interfaceContracts": [
          "Append-only event contract"
        ],
        "controls": [
          "Sequence",
          "Integrity",
          "Retention",
          "Access control"
        ],
        "failureModes": [
          "Event gap",
          "Duplicate event",
          "Out-of-order event"
        ],
        "recovery": [
          "Detect sequence breaks",
          "Replay idempotently",
          "Repair projections without rewriting facts"
        ],
        "lenses": [
          "applications",
          "data",
          "controls",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Transactional outbox and queue",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-outbox",
        "title": "Transactional outbox and queue",
        "kind": "service",
        "summary": "Carries commands and events without losing them between the payment record and another system.",
        "responsibilities": [
          "Publish after durable commit",
          "Retry delivery",
          "Preserve ordering where required"
        ],
        "owner": "Payment platform",
        "inputs": [
          "Committed outbound work"
        ],
        "outputs": [
          "At-least-once delivery with stable message identity"
        ],
        "interfaceContracts": [
          "Event envelope, ordering, retry, and dead-letter contract"
        ],
        "controls": [
          "Stable message ID",
          "Retry backoff",
          "Dead-letter monitoring"
        ],
        "failureModes": [
          "Poison message",
          "Queue backlog",
          "Duplicate delivery"
        ],
        "recovery": [
          "Fix or quarantine poison data",
          "Replay safely",
          "Scale consumers"
        ],
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Timer and deadline service",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-timer",
        "title": "Timer and deadline service",
        "kind": "control",
        "summary": "Turns a business deadline into a recorded event instead of an untracked sleep.",
        "responsibilities": [
          "Schedule cut-offs and timeouts",
          "Fire once logically",
          "Cancel obsolete timers"
        ],
        "owner": "Payment platform",
        "inputs": [
          "Deadline and payment identity"
        ],
        "outputs": [
          "Timeout or cut-off event"
        ],
        "interfaceContracts": [
          "Durable timer contract"
        ],
        "controls": [
          "Clock source",
          "Deduplication",
          "Late-event handling"
        ],
        "failureModes": [
          "Timer fires twice",
          "Clock drift",
          "Timer lost"
        ],
        "recovery": [
          "Reconcile due timers",
          "Apply idempotent timeout handling"
        ],
        "lenses": [
          "applications",
          "data",
          "controls",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Ledger system",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-ledger",
        "title": "Ledger system",
        "kind": "ledger",
        "summary": "Owns the accounting fact independently from the payment engine’s processing state.",
        "responsibilities": [
          "Post once",
          "Return journal evidence",
          "Reverse through a separate entry"
        ],
        "owner": "Core banking and finance",
        "inputs": [
          "Posting command"
        ],
        "outputs": [
          "Posting result and journal reference"
        ],
        "interfaceContracts": [
          "Idempotent posting contract"
        ],
        "controls": [
          "Balanced entries",
          "Posting key",
          "No destructive edit"
        ],
        "failureModes": [
          "Unknown response",
          "Rejected posting",
          "Duplicate conflict"
        ],
        "recovery": [
          "Query",
          "Adopt",
          "Retry or reverse under authority"
        ],
        "lenses": [
          "interfaces",
          "data",
          "ledger",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "bis-cpmi-pfmi",
              "label": "official-requirement",
              "locator": "Principles 8, 17, and 22"
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "CPMI-IOSCO Principles for financial market infrastructures",
            "asOf": "2012-04-16"
          }
        ],
        "id": "state-network",
        "title": "External network",
        "kind": "external-network",
        "summary": "Owns delivery, acceptance, clearing, or settlement facts outside the bank.",
        "responsibilities": [
          "Apply network rules",
          "Return acknowledgement and status",
          "Preserve duplicate treatment"
        ],
        "owner": "External network or market infrastructure",
        "inputs": [
          "Network instruction"
        ],
        "outputs": [
          "Acknowledgement, status, settlement evidence, report"
        ],
        "interfaceContracts": [
          "Scheme or network contract"
        ],
        "controls": [
          "Message identity",
          "Participant entitlement",
          "Finality"
        ],
        "failureModes": [
          "Late status",
          "Unknown outcome",
          "Service outage"
        ],
        "recovery": [
          "Use network enquiry and contingency procedures"
        ],
        "lenses": [
          "business",
          "interfaces",
          "data",
          "ledger",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Read model and status API",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-projection",
        "title": "Read model and status API",
        "kind": "service",
        "summary": "Presents a useful current view without becoming a second source of truth.",
        "responsibilities": [
          "Project events",
          "Explain pending states",
          "Serve channels and operations"
        ],
        "owner": "Payment platform",
        "inputs": [
          "Payment event stream"
        ],
        "outputs": [
          "Current status, history, and next permitted actions"
        ],
        "interfaceContracts": [
          "Eventually consistent status contract"
        ],
        "controls": [
          "Freshness indicator",
          "Version",
          "No unauthorised actions"
        ],
        "failureModes": [
          "Stale projection",
          "Missing event",
          "Misleading final status"
        ],
        "recovery": [
          "Rebuild from the journal",
          "Expose freshness and uncertainty"
        ],
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment instruction and operational metadata"
        ],
        "nonFunctionalRequirements": [
          "Traceable processing with stable identifiers",
          "Capacity and availability matched to the supported payment service",
          "Auditable state changes and operator actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Component: Exception and reconciliation desk",
              "simplifications": "Component boundaries and product names vary between institutions."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-operations",
        "title": "Exception and reconciliation desk",
        "kind": "operations",
        "summary": "Resolves cases where internal state and external evidence do not yet tell one consistent story.",
        "responsibilities": [
          "Compare facts",
          "Stop unsafe replay",
          "Apply controlled recovery",
          "Close only on evidence"
        ],
        "owner": "Payment operations",
        "inputs": [
          "Payment history, ledger journal, network evidence, timers, alerts"
        ],
        "outputs": [
          "Reasoned command, escalation, or reconciled closure"
        ],
        "interfaceContracts": [
          "Case and controlled-command contract"
        ],
        "controls": [
          "Segregation of duties",
          "Evidence checklist",
          "State-aware action permissions"
        ],
        "failureModes": [
          "Premature closure",
          "Manual duplicate",
          "Action on stale state"
        ],
        "recovery": [
          "Refresh facts",
          "Reopen",
          "Apply compensating action under authority"
        ],
        "lenses": [
          "business",
          "controls",
          "ownership",
          "operations",
          "resilience"
        ]
      }
    ],
    "interfaces": [
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Expected-state command",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-command-to-machine",
        "from": "state-command",
        "to": "state-machine",
        "title": "Expected-state command",
        "kind": "api",
        "mode": "synchronous",
        "purpose": "Ask for one transition against a known payment version.",
        "failureBehaviour": "Reject stale, duplicate, or unauthorised commands.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "controls"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Append state event",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-machine-to-journal",
        "from": "state-machine",
        "to": "state-journal",
        "title": "Append state event",
        "kind": "event",
        "mode": "asynchronous",
        "purpose": "Record the accepted fact before publishing downstream work.",
        "failureBehaviour": "Do not expose an uncommitted transition.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Committed work",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-journal-to-outbox",
        "from": "state-journal",
        "to": "state-outbox",
        "title": "Committed work",
        "kind": "event",
        "mode": "asynchronous",
        "purpose": "Publish only work associated with a committed state.",
        "failureBehaviour": "Retry delivery with the same event identity.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Posting command",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-outbox-to-ledger",
        "from": "state-outbox",
        "to": "state-ledger",
        "title": "Posting command",
        "kind": "posting",
        "mode": "asynchronous",
        "purpose": "Request one posting using a stable key.",
        "failureBehaviour": "Duplicate delivery must return the existing posting result.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "ledger",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Network command",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-outbox-to-network",
        "from": "state-outbox",
        "to": "state-network",
        "title": "Network command",
        "kind": "message",
        "mode": "asynchronous",
        "purpose": "Release one network instruction after its prerequisite state is committed.",
        "failureBehaviour": "Use message identity and network enquiry before replay.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Network result",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-result-to-machine",
        "from": "state-network",
        "to": "state-machine",
        "title": "Network result",
        "kind": "event",
        "mode": "asynchronous",
        "purpose": "Advance the payment using external evidence.",
        "failureBehaviour": "Late or duplicate results are correlated and assessed against the current state.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "ledger",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Deadline event",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-timer-to-machine",
        "from": "state-timer",
        "to": "state-machine",
        "title": "Deadline event",
        "kind": "control",
        "mode": "asynchronous",
        "purpose": "Turn time expiry into a normal idempotent state input.",
        "failureBehaviour": "A duplicate timeout must not apply its effect twice.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "controls",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Projection feed",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-journal-to-projection",
        "from": "state-journal",
        "to": "state-projection",
        "title": "Projection feed",
        "kind": "event",
        "mode": "asynchronous",
        "purpose": "Build channel and operator views from authoritative events.",
        "failureBehaviour": "Expose staleness and rebuild without changing the event journal.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "operations",
          "resilience"
        ]
      },
      {
        "dataClassification": [
          "Payment and status data"
        ],
        "controls": [
          "Authentication",
          "Authorisation",
          "Integrity",
          "Correlation",
          "Audit"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Interface: Case evidence",
              "simplifications": "The transport and interface contract are illustrative; implementations select their own protocol."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ],
        "id": "state-facts-to-ops",
        "from": "state-projection",
        "to": "state-operations",
        "title": "Case evidence",
        "kind": "operator",
        "mode": "operator",
        "purpose": "Present current state, uncertainty, and permitted actions.",
        "failureBehaviour": "Refresh and reject commands if the payment version changed.",
        "lenses": [
          "applications",
          "interfaces",
          "data",
          "controls",
          "ownership",
          "operations"
        ]
      }
    ],
    "views": [
      {
        "id": "context",
        "label": "Context",
        "plainPurpose": "See commands enter, state become durable, and external results return.",
        "nodeIds": [
          "state-command",
          "state-machine",
          "state-journal",
          "state-outbox",
          "state-ledger",
          "state-network",
          "state-projection",
          "state-operations"
        ],
        "interfaceIds": [
          "state-command-to-machine",
          "state-machine-to-journal",
          "state-outbox-to-ledger",
          "state-outbox-to-network",
          "state-result-to-machine",
          "state-facts-to-ops"
        ],
        "placements": {
          "state-command": {
            "x": 70,
            "y": 210
          },
          "state-machine": {
            "x": 400,
            "y": 210
          },
          "state-journal": {
            "x": 400,
            "y": 500
          },
          "state-outbox": {
            "x": 740,
            "y": 210
          },
          "state-ledger": {
            "x": 1080,
            "y": 100
          },
          "state-network": {
            "x": 1080,
            "y": 380
          },
          "state-projection": {
            "x": 1420,
            "y": 210
          },
          "state-operations": {
            "x": 1420,
            "y": 500
          }
        }
      },
      {
        "id": "container",
        "label": "Container",
        "plainPurpose": "Separate command handling, durable history, reliable delivery, timers, projections, and operations.",
        "nodeIds": [
          "state-command",
          "state-machine",
          "state-journal",
          "state-outbox",
          "state-timer",
          "state-ledger",
          "state-network",
          "state-projection",
          "state-operations"
        ],
        "interfaceIds": [
          "state-command-to-machine",
          "state-machine-to-journal",
          "state-journal-to-outbox",
          "state-outbox-to-ledger",
          "state-outbox-to-network",
          "state-result-to-machine",
          "state-timer-to-machine",
          "state-journal-to-projection",
          "state-facts-to-ops"
        ],
        "placements": {
          "state-command": {
            "x": 60,
            "y": 200
          },
          "state-machine": {
            "x": 380,
            "y": 200
          },
          "state-journal": {
            "x": 380,
            "y": 500
          },
          "state-outbox": {
            "x": 710,
            "y": 340
          },
          "state-timer": {
            "x": 710,
            "y": 80
          },
          "state-ledger": {
            "x": 1040,
            "y": 140
          },
          "state-network": {
            "x": 1040,
            "y": 420
          },
          "state-projection": {
            "x": 1370,
            "y": 200
          },
          "state-operations": {
            "x": 1370,
            "y": 500
          }
        },
        "boundaries": [
          {
            "id": "state-core-boundary",
            "label": "AUTHORITATIVE PAYMENT STATE",
            "nodeIds": [
              "state-machine",
              "state-journal",
              "state-outbox",
              "state-timer"
            ],
            "kind": "data"
          },
          {
            "id": "state-external-facts",
            "label": "INDEPENDENT FACT OWNERS",
            "nodeIds": [
              "state-ledger",
              "state-network"
            ],
            "kind": "ownership"
          }
        ]
      },
      {
        "id": "component",
        "label": "Component",
        "plainPurpose": "Inspect the reliable-delivery and recovery contracts behind each state change.",
        "nodeIds": [
          "state-command",
          "state-machine",
          "state-journal",
          "state-outbox",
          "state-timer",
          "state-ledger",
          "state-network",
          "state-projection",
          "state-operations"
        ],
        "interfaceIds": [
          "state-command-to-machine",
          "state-machine-to-journal",
          "state-journal-to-outbox",
          "state-outbox-to-ledger",
          "state-outbox-to-network",
          "state-result-to-machine",
          "state-timer-to-machine",
          "state-journal-to-projection",
          "state-facts-to-ops"
        ],
        "placements": {
          "state-command": {
            "x": 60,
            "y": 160
          },
          "state-machine": {
            "x": 390,
            "y": 160
          },
          "state-journal": {
            "x": 390,
            "y": 460
          },
          "state-outbox": {
            "x": 730,
            "y": 310
          },
          "state-timer": {
            "x": 730,
            "y": 50
          },
          "state-ledger": {
            "x": 1070,
            "y": 100
          },
          "state-network": {
            "x": 1070,
            "y": 370
          },
          "state-projection": {
            "x": 1410,
            "y": 160
          },
          "state-operations": {
            "x": 1410,
            "y": 460
          }
        }
      },
      {
        "id": "deployment",
        "label": "Deployment",
        "plainPurpose": "See durable state, queue, timer, dependency, and operator zones that must survive partial failure.",
        "nodeIds": [
          "state-command",
          "state-machine",
          "state-journal",
          "state-outbox",
          "state-timer",
          "state-ledger",
          "state-network",
          "state-projection",
          "state-operations"
        ],
        "interfaceIds": [
          "state-command-to-machine",
          "state-machine-to-journal",
          "state-journal-to-outbox",
          "state-outbox-to-ledger",
          "state-outbox-to-network",
          "state-result-to-machine",
          "state-timer-to-machine",
          "state-journal-to-projection",
          "state-facts-to-ops"
        ],
        "placements": {
          "state-command": {
            "x": 60,
            "y": 160
          },
          "state-machine": {
            "x": 390,
            "y": 160
          },
          "state-journal": {
            "x": 390,
            "y": 460
          },
          "state-outbox": {
            "x": 730,
            "y": 310
          },
          "state-timer": {
            "x": 730,
            "y": 40
          },
          "state-ledger": {
            "x": 1070,
            "y": 100
          },
          "state-network": {
            "x": 1070,
            "y": 380
          },
          "state-projection": {
            "x": 1410,
            "y": 160
          },
          "state-operations": {
            "x": 1410,
            "y": 460
          }
        },
        "boundaries": [
          {
            "id": "state-write-zone",
            "label": "SINGLE-WRITER STATE ZONE",
            "nodeIds": [
              "state-machine",
              "state-journal",
              "state-outbox"
            ],
            "kind": "data"
          },
          {
            "id": "state-time-zone",
            "label": "DURABLE TIMER",
            "nodeIds": [
              "state-timer"
            ],
            "kind": "trust"
          },
          {
            "id": "state-dependency-zone",
            "label": "EXTERNAL FACT OWNERS",
            "nodeIds": [
              "state-ledger",
              "state-network"
            ],
            "kind": "trust"
          },
          {
            "id": "state-read-zone",
            "label": "READ AND OPERATIONS ZONE",
            "nodeIds": [
              "state-projection",
              "state-operations"
            ],
            "kind": "ownership"
          }
        ]
      }
    ],
    "traces": [
      {
        "id": "state-happy-path",
        "label": "One durable state journey",
        "summary": "Follow a payment from command to journal, posting, network result, and operator-visible status.",
        "viewId": "container",
        "steps": [
          {
            "id": "state-receive",
            "title": "Receive one command",
            "nodeId": "state-command",
            "plainExplanation": "The caller asks for one change against a known payment identity.",
            "businessState": "COMMAND_RECEIVED"
          },
          {
            "id": "state-transition",
            "title": "Accept one transition",
            "nodeId": "state-machine",
            "interfaceId": "state-command-to-machine",
            "plainExplanation": "The state machine confirms the command is valid for the current state.",
            "businessState": "TRANSITION_ACCEPTED"
          },
          {
            "id": "state-commit",
            "title": "Write the fact",
            "nodeId": "state-journal",
            "interfaceId": "state-machine-to-journal",
            "plainExplanation": "The accepted transition becomes durable before work leaves the core.",
            "businessState": "RECORDED"
          },
          {
            "id": "state-publish",
            "title": "Publish committed work",
            "nodeId": "state-outbox",
            "interfaceId": "state-journal-to-outbox",
            "plainExplanation": "The outbox carries the command using a stable identity and retry policy.",
            "businessState": "DISPATCHED"
          },
          {
            "id": "state-post",
            "title": "Record the accounting result",
            "nodeId": "state-ledger",
            "interfaceId": "state-outbox-to-ledger",
            "plainExplanation": "The ledger posts once and returns its own journal fact.",
            "businessState": "POSTED",
            "ledgerEffect": "Ledger journal reference linked to the payment"
          },
          {
            "id": "state-send",
            "title": "Release the network instruction",
            "nodeId": "state-network",
            "interfaceId": "state-outbox-to-network",
            "plainExplanation": "The external service receives one identified instruction.",
            "businessState": "SENT"
          },
          {
            "id": "state-result",
            "title": "Apply the external result",
            "nodeId": "state-machine",
            "interfaceId": "state-result-to-machine",
            "plainExplanation": "The payment advances only when the external evidence is compatible with its current state.",
            "businessState": "NETWORK_CONFIRMED"
          },
          {
            "id": "state-view",
            "title": "Present an explainable status",
            "nodeId": "state-projection",
            "interfaceId": "state-journal-to-projection",
            "plainExplanation": "Channels and operators see the current state, history, and any remaining uncertainty.",
            "businessState": "VISIBLE"
          }
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "State journey",
              "simplifications": "State names and ordering are illustrative; institutions and rails use different lifecycle models."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ]
      }
    ],
    "stressCases": [
      {
        "id": "state-duplicate-delivery",
        "label": "Queue delivers twice",
        "trigger": "The outbox retries after the consumer processed the first delivery but its acknowledgement was lost.",
        "divergesAfterStepId": "state-publish",
        "traceId": "state-happy-path",
        "affectedNodeIds": [
          "state-outbox",
          "state-ledger",
          "state-network"
        ],
        "affectedInterfaceIds": [
          "state-outbox-to-ledger",
          "state-outbox-to-network"
        ],
        "lastConfirmedState": "The outbound work is committed and may already have been processed.",
        "settlementState": "Depends on the first network delivery; the repeat cannot be assumed new.",
        "fundsState": "The posting may already exist under the original key.",
        "owner": "Payment-platform operations",
        "safeAction": "Consumers return the existing result for the same identity and reject changed reuse.",
        "requiredEvidence": [
          "Event ID",
          "Posting key",
          "Network message ID",
          "Consumer result"
        ],
        "recoverySteps": [
          "Deduplicate",
          "Return existing outcome",
          "Advance state once"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "At-least-once delivery stress case",
              "simplifications": "Queue products differ; the invariant is stable identity and idempotent consumption."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ]
      },
      {
        "id": "state-timeout-late-success",
        "label": "Timeout followed by late success",
        "trigger": "The business timer fires, then a positive network status arrives later.",
        "divergesAfterStepId": "state-send",
        "traceId": "state-happy-path",
        "affectedNodeIds": [
          "state-timer",
          "state-machine",
          "state-network",
          "state-operations"
        ],
        "affectedInterfaceIds": [
          "state-timer-to-machine",
          "state-result-to-machine",
          "state-facts-to-ops"
        ],
        "lastConfirmedState": "The instruction was sent; completion was not confirmed before the deadline.",
        "settlementState": "Unknown at timeout; the late status may prove that settlement succeeded.",
        "fundsState": "Any timeout restoration or release must be reconciled against the late success.",
        "owner": "Payment operations with payment-platform support",
        "safeAction": "Treat timeout as uncertainty, block blind retry, and reconcile the late status against the original payment.",
        "requiredEvidence": [
          "Timer event",
          "Original network ID",
          "Late status",
          "Ledger effects",
          "Customer adjustment"
        ],
        "recoverySteps": [
          "Correlate late status",
          "Determine settlement",
          "Correct any temporary customer treatment",
          "Close with evidence"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Late-success stress case",
              "simplifications": "Exact timeout and restoration rules depend on the payment service."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ]
      },
      {
        "id": "state-stale-operator-command",
        "label": "Operator acts on stale status",
        "trigger": "An operator opens a held payment, but a network result changes its state before the operator presses release.",
        "divergesAfterStepId": "state-view",
        "traceId": "state-happy-path",
        "affectedNodeIds": [
          "state-projection",
          "state-operations",
          "state-command",
          "state-machine"
        ],
        "affectedInterfaceIds": [
          "state-facts-to-ops",
          "state-command-to-machine"
        ],
        "lastConfirmedState": "The screen is older than the authoritative event journal.",
        "settlementState": "The current state may already be final.",
        "fundsState": "No second release or compensating posting is permitted from a stale view.",
        "owner": "Payment operations",
        "safeAction": "Use expected-version checks and reject the stale command before it changes anything.",
        "requiredEvidence": [
          "Displayed version",
          "Current version",
          "Operator identity",
          "Rejected command"
        ],
        "recoverySteps": [
          "Refresh",
          "Explain the new state",
          "Offer only currently permitted actions"
        ],
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Stale-command stress case",
              "simplifications": "User-interface implementation varies; the control is version-aware command handling."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ]
      }
    ],
    "overlays": [],
    "decisions": [
      {
        "id": "state-source-of-truth",
        "question": "Is the current-state row or the event journal authoritative?",
        "options": [
          {
            "label": "Event journal plus projection",
            "consequence": "Provides an explainable history and rebuild path but demands strict event governance."
          },
          {
            "label": "Current row plus audit log",
            "consequence": "Can be simpler, but the audit log must still prove every transition and partial failure."
          }
        ],
        "guidance": "Either model can work; name one authority, preserve immutable history, and test reconstruction after partial failure.",
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Architecture decision: state authority",
              "simplifications": "No payment standard prescribes the bank’s internal persistence pattern."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ]
      },
      {
        "id": "state-exactly-once",
        "question": "How does the design handle the claim of exactly-once processing?",
        "options": [
          {
            "label": "At-least-once plus idempotency",
            "consequence": "Accepts that delivery can repeat and makes every economic command safe to repeat."
          },
          {
            "label": "Single transactional boundary",
            "consequence": "Works only where all state and side effects truly share one transaction; external networks and ledgers usually do not."
          }
        ],
        "guidance": "Do not promise end-to-end exactly once across independent systems. Design stable identities, deduplication, enquiry, and reconciliation.",
        "evidence": [
          {
            "ref": {
              "sourceId": "payments-signal-editorial",
              "label": "simplified-educational-illustration",
              "locator": "Architecture decision: delivery semantics",
              "simplifications": "The limitation follows from independent transaction boundaries, not a scheme rule."
            },
            "verifiedDate": "2026-07-23",
            "versionContext": "Payments Signal reference architecture v1"
          }
        ]
      }
    ],
    "targets": [
      {
        "type": "topic",
        "id": "foundations.payment-lifecycle"
      },
      {
        "type": "topic",
        "id": "ops.exceptions-investigations"
      },
      {
        "type": "topic",
        "id": "ops.payment-hub-architecture"
      },
      {
        "type": "flow",
        "id": "flow-cbpr-corporate-lifecycle"
      }
    ],
    "glossaryTermIds": [
      "idempotency",
      "straight-through-processing",
      "cut-off",
      "reconciliation",
      "settlement-finality"
    ],
    "evidence": [
      {
        "ref": {
          "sourceId": "bis-cpmi-pfmi",
          "label": "official-requirement",
          "locator": "Principle 17 — operational risk"
        },
        "verifiedDate": "2026-07-23",
        "versionContext": "CPMI-IOSCO Principles for financial market infrastructures",
        "asOf": "2012-04-16"
      },
      {
        "ref": {
          "sourceId": "payments-signal-editorial",
          "label": "simplified-educational-illustration",
          "locator": "Payment-state synthesis",
          "simplifications": "This is a software reference pattern. Payment schemes define outcomes and timing; they do not prescribe this internal event architecture."
        },
        "verifiedDate": "2026-07-23",
        "versionContext": "Payments Signal reference architecture v1"
      }
    ],
    "simplifies": "The blueprint assumes one logical payment-state owner and uses one queue and one journal. Real estates may shard by product or region and may use several brokers, stores, and recovery coordinators."
  },
  "sources": [
    {
      "id": "bis-cpmi-pfmi",
      "publisher": "CPMI and IOSCO (Bank for International Settlements)",
      "title": "Principles for financial market infrastructures",
      "sourceType": "industry-paper",
      "publicationDate": "2012-04-16",
      "accessedDate": "2026-07-12",
      "url": "https://www.bis.org/cpmi/publ/d101.htm",
      "applicability": "International risk-management standards for systemically important payment systems and other financial market infrastructures.",
      "notes": "Published by the CPSS (now CPMI) and IOSCO; contains 24 principles plus responsibilities for authorities. This site uses it only for high-level concepts such as settlement finality."
    },
    {
      "id": "payments-signal-editorial",
      "publisher": "Payments Signal",
      "title": "Payments Signal editorial teaching models",
      "sourceType": "educational-simplification",
      "accessedDate": "2026-07-12",
      "applicability": "This site's own simplified teaching models.",
      "notes": "Used wherever diagrams, scenarios, figures, or example values are didactic constructions rather than sourced facts; every such use carries a simplifications disclosure. All people, companies, banks, and list entries in examples are fictional."
    }
  ],
  "relatedContent": [
    {
      "type": "article",
      "label": "ACK, NACK, and the Payment Status Report (pacs.002)",
      "href": "/2026/07/13/ack-nack-and-payment-status-report",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Batch and file-based payments",
      "href": "/2026/07/13/batch-and-file-payments",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Business Analyst Interview Question",
      "href": "/2026/07/13/business-analyst-interview-question",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "High-value payments and HVPS+",
      "href": "/2026/07/13/high-value-payments-and-hvps-plus",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "How a payment hub works: product capabilities",
      "href": "/2026/07/13/payment-hub-product-capabilities",
      "coverage": "direct"
    },
    {
      "type": "article",
      "label": "Misc Payment Concepts",
      "href": "/2026/07/13/misc-payment-concepts",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "One corporate payment: the full MX lifecycle and its MT migration path",
      "href": "/2026/07/18/corporate-payment-full-message-lifecycle",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Payment Engines",
      "href": "/2026/07/13/payment-engines",
      "coverage": "direct"
    },
    {
      "type": "article",
      "label": "Payment exceptions and investigations",
      "href": "/2026/07/13/payment-exceptions-and-investigations",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Payment hub reference and standing data",
      "href": "/2026/07/13/payment-hub-reference-and-standing-data",
      "coverage": "direct"
    },
    {
      "type": "article",
      "label": "Payment message templates",
      "href": "/2026/07/13/payment-message-templates",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Payment Messages",
      "href": "/2026/07/13/messages",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "PAYMENTS – BASIC TECHNICAL CONCEPTS – PART 1",
      "href": "/2026/07/13/payments-basic-technical-concepts-part-1",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Payments Interview Preparation",
      "href": "/2026/07/13/payments-interview-preparation",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Payments Interview Questions",
      "href": "/2026/07/13/payments-interview-question",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Payments Quiz – Basics 2",
      "href": "/2026/07/13/payments-quiz-basics-2",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Purpose codes in payments",
      "href": "/2026/07/13/purpose-codes-in-payments",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Reversals, returns, recalls, and cancellations",
      "href": "/2026/07/13/reversals-returns-and-cancellations",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Risks in Payment Systems",
      "href": "/2026/07/13/risks-in-payment-systems",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "SEPA Payment Messages",
      "href": "/2026/07/13/sepa-payment-messages",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Serial and cover in ISO 20022: pacs.008 and pacs.009 COV",
      "href": "/2026/07/13/iso-20022-serial-and-cover",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "Structured remittance information",
      "href": "/2026/07/13/structured-remittance-information",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "SWIFT Cancellations and Investigation Messages",
      "href": "/2026/07/13/swift-cancellations-and-investigation-messages",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "SWIFT financial-institution funds transfers",
      "href": "/2026/07/13/swift-financial-institution-funds-transfers",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "SWIFT investigation and exception messages",
      "href": "/2026/07/13/swift-investigation-and-exception-messages",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "The camt family: cash management and reporting",
      "href": "/2026/07/13/camt-cash-management-messages",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "The pain.001 payment initiation",
      "href": "/2026/07/13/the-pain-001-payment-initiation",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "The Payment Engine Problem",
      "href": "/2026/07/13/the-payment-engine-problem",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "The real cost of payments",
      "href": "/2026/07/13/the-real-cost-of-payments",
      "coverage": "derived"
    },
    {
      "type": "article",
      "label": "What a payment declares about itself — and who carries it",
      "href": "/2026/07/16/iso-20022-payment-codes-and-agents",
      "coverage": "derived"
    },
    {
      "type": "flow",
      "label": "CBPR+ corporate payment — full MX lifecycle",
      "href": "/explore/cbpr-corporate-lifecycle",
      "coverage": "direct"
    },
    {
      "type": "glossary",
      "label": "camt family",
      "href": "/glossary#camt",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "camt.029",
      "href": "/glossary#camt-029",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "camt.056",
      "href": "/glossary#camt-056",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pacs family",
      "href": "/glossary#pacs",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pacs.002",
      "href": "/glossary#pacs-002",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pacs.004",
      "href": "/glossary#pacs-004",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pacs.008",
      "href": "/glossary#pacs-008",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pacs.009",
      "href": "/glossary#pacs-009",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pain family",
      "href": "/glossary#pain",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "pain.001",
      "href": "/glossary#pain-001",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "Payment engine",
      "href": "/glossary#payment-engine",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "Payment hub",
      "href": "/glossary#payment-hub",
      "coverage": "derived"
    },
    {
      "type": "glossary",
      "label": "Value date",
      "href": "/glossary#value-date",
      "coverage": "derived"
    },
    {
      "type": "resource",
      "label": "CBPR+ implementation pack",
      "href": "/downloads/profile-packs/cbpr-plus",
      "coverage": "direct"
    },
    {
      "type": "resource",
      "label": "CBPR+ usage guidelines",
      "href": "/implementation-resources",
      "coverage": "direct"
    },
    {
      "type": "resource",
      "label": "ISO 20022 message definitions and XSDs",
      "href": "/implementation-resources",
      "coverage": "direct"
    },
    {
      "type": "resource",
      "label": "MT to MX migration notes",
      "href": "/downloads/assets/mt-mx-migration-notes",
      "coverage": "derived"
    },
    {
      "type": "resource",
      "label": "Payment lifecycle test cases",
      "href": "/downloads/assets/payment-lifecycle-test-cases",
      "coverage": "derived"
    },
    {
      "type": "topic",
      "label": "Exceptions and investigations",
      "href": "/learn/operations/exceptions-and-investigations",
      "coverage": "direct"
    },
    {
      "type": "topic",
      "label": "Payment engines and hub architecture",
      "href": "/learn/operations/payment-hub-architecture",
      "coverage": "direct"
    },
    {
      "type": "topic",
      "label": "The camt family: cash management & investigations",
      "href": "/learn/iso-20022/camt-family-cash-management",
      "coverage": "derived"
    },
    {
      "type": "topic",
      "label": "The pacs family: interbank messages",
      "href": "/learn/iso-20022/pacs-family-interbank-messages",
      "coverage": "derived"
    },
    {
      "type": "topic",
      "label": "The pain family: payment initiation",
      "href": "/learn/iso-20022/pain-family-payment-initiation",
      "coverage": "derived"
    },
    {
      "type": "topic",
      "label": "The payment lifecycle",
      "href": "/learn/foundations/payment-lifecycle",
      "coverage": "direct"
    }
  ]
}
