{
  "manifest": {
    "formatVersion": 1,
    "kind": "model",
    "name": "Simple Bank",
    "branch": "main",
    "ref": "v1.0.0",
    "commit": "0000000000000000000000000000000000000000",
    "exportedAt": "2026-10-01T00:00:00Z"
  },
  "model": {
    "annotations": [
      {
        "annotations": [],
        "body": "A minimal bank, modelled in URDAD as a reference and teaching model.",
        "formalizationOf": [],
        "formalizationSnapshots": [],
        "id": "b04bdd46-d514-5e1f-bdfc-e875197cd242",
        "language": "en",
        "markup": "text_plain",
        "name": "Description",
        "purpose": "shortDescription"
      },
      {
        "annotations": [],
        "body": "Customers register, open accounts, deposit, withdraw, transfer, pay salaries, move large amounts, ask for a balance and close accounts — nine use cases over three entities. Between them the processes use every construct of the method: alternate and concurrent flows, for-each and while loops, and exceptions both handled and raised.\n\nRead it top-down, as the method works: start at *Bank › Customer Services*, look at a use case's functional requirements (its pre- and post-conditions), see which lower-level service each requirement is allocated to, and then how the process orchestrates them. Every requirement is formal, most of them in URDAD-OCL, and the post-conditions use `@pre` to say how a service changes the bank's state.\n\nGenerated by `models/simpleBank/generate.py`.",
        "formalizationOf": [],
        "formalizationSnapshots": [],
        "id": "b5e59ccd-9065-574c-99ce-3c6d7f9fac9e",
        "language": "en",
        "markup": "text_markdown",
        "name": "Details",
        "purpose": "detailedDescription"
      }
    ],
    "formalizationOf": [],
    "formalizationSnapshots": [],
    "id": "7742bc95-d4b3-54de-a128-f4f9ea675057",
    "name": "Simple Bank",
    "isModel": true,
    "responsibilityDomains": [
      {
        "annotations": [
          {
            "annotations": [],
            "body": "The bank's customers — the party its services are offered to.",
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "60f29b5d-d07f-5724-8b9d-effb5a2852f4",
            "language": "en",
            "markup": "text_plain",
            "name": "Description",
            "purpose": "shortDescription"
          },
          {
            "annotations": [],
            "body": "An external party, owning nothing in this model. Every customer service is *published* to it, which is what makes the service callable from outside, and every advice is sent to it.",
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "64120f0e-ddd3-5a05-8ee2-b09543389c82",
            "language": "en",
            "markup": "text_markdown",
            "name": "Details",
            "purpose": "detailedDescription"
          }
        ],
        "formalizationOf": [],
        "formalizationSnapshots": [],
        "id": "da52fff1-738b-57ed-a694-218d358d17b8",
        "name": "Customers",
        "dataTypes": [],
        "entities": [],
        "exceptions": [],
        "processes": [],
        "responsibilityDomains": [],
        "serviceContracts": []
      },
      {
        "annotations": [
          {
            "annotations": [],
            "body": "The bank: its shared vocabulary and the departments that answer for its services.",
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "1857d41b-ee8c-57a2-a888-bc89b2c4c769",
            "language": "en",
            "markup": "text_plain",
            "name": "Description",
            "purpose": "shortDescription"
          },
          {
            "annotations": [],
            "body": "Responsibility is divided by what each department can guarantee: *Customer Services* orchestrates, *Customer Register* knows who the customers are, *Accounts* keeps the accounts, and *Ledger* is the only thing that moves money.",
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "ef90779a-cf93-595d-b863-30b178aabef1",
            "language": "en",
            "markup": "text_markdown",
            "name": "Details",
            "purpose": "detailedDescription"
          }
        ],
        "formalizationOf": [],
        "formalizationSnapshots": [],
        "id": "32c55e79-d299-52dd-9c82-84b5d0ff3040",
        "name": "Bank",
        "dataTypes": [
          {
            "annotations": [
              {
                "annotations": [],
                "body": "Free text: a name, a notice.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "9f12bdb9-105a-5928-942c-33ff2c78dbca",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
            "name": "Text",
            "dataType": "string",
            "invariances": [],
            "variant": "PrimitiveType"
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "Yes or no.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "26191b5a-b825-5a2a-8656-86e4efeb0139",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "67051e77-402b-58f5-aa79-4b35808d3983",
            "name": "Flag",
            "dataType": "boolean",
            "invariances": [],
            "variant": "PrimitiveType"
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "A number the bank issues once and never reuses — an account number, a customer number.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "448bfc1d-15ef-54e3-b5a2-5b90a718b124",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              },
              {
                "annotations": [],
                "body": "Distinct from `Text` so a reader can tell a key from a label. An identifier is what an entity is matched by, before and after a service, so it never changes once issued.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "e5e764ae-5224-5299-b87d-c0deb7f36c3d",
                "language": "en",
                "markup": "text_markdown",
                "name": "Details",
                "purpose": "detailedDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "9b674c86-8d9e-5b07-9423-d106c79100a7",
            "name": "Identifier",
            "dataType": "string",
            "invariances": [],
            "variant": "PrimitiveType"
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "An amount of money, exact to the cent.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "12904d70-bb57-5eeb-b4be-578142b1f589",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              },
              {
                "annotations": [],
                "body": "A `decimal`, never a `real`: a ledger that sums a million amounts must reconcile to the cent, and binary floating point does not.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "2dde8130-bad5-515c-bf5e-7209d04aaba0",
                "language": "en",
                "markup": "text_markdown",
                "name": "Details",
                "purpose": "detailedDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
            "name": "Money",
            "dataType": "decimal",
            "invariances": [],
            "variant": "PrimitiveType"
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "Whether an account can still be used.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "2af21d6d-16db-5b7a-9357-3706fdececa5",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              },
              {
                "annotations": [],
                "body": "A closed account is kept, not deleted: its history is a record the bank must retain.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "a7b7fece-a0c1-5357-9ca2-3be5e4651df0",
                "language": "en",
                "markup": "text_markdown",
                "name": "Details",
                "purpose": "detailedDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "003e4b86-0a53-5766-80d0-1a03c71b7075",
            "name": "AccountStatus",
            "invariances": [],
            "options": [
              "open",
              "closed"
            ],
            "variant": "Enumeration"
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "The kind of account a customer opens. Informational in this model.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "8dc5418e-9172-515b-b05f-29f6cda159cf",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "dafbd62c-6a4b-5e99-8589-053569be0f64",
            "name": "AccountType",
            "invariances": [],
            "options": [
              "current",
              "savings"
            ],
            "variant": "Enumeration"
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "Whether a ledger entry added money to an account or took it away.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "c0997c36-3e9d-5d3a-8483-29e24e240c03",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "8353956f-b202-59b7-87fd-5d8bd331a974",
            "name": "EntryKind",
            "invariances": [],
            "options": [
              "credit",
              "debit"
            ],
            "variant": "Enumeration"
          }
        ],
        "entities": [],
        "exceptions": [],
        "processes": [],
        "responsibilityDomains": [
          {
            "annotations": [
              {
                "annotations": [],
                "body": "The use cases a customer is offered — where reading this model starts.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "94c40a4d-ce25-5b36-8a3b-2bd3f9396cff",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              },
              {
                "annotations": [],
                "body": "Each service here has a process, and every one of them is realized by requesting lower-level services of the departments below. None changes an account itself.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "f9069c06-d274-5624-882f-b17b3e8b14bf",
                "language": "en",
                "markup": "text_markdown",
                "name": "Details",
                "purpose": "detailedDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "d118cbf8-9a30-5345-a868-c2d1b875af4f",
            "name": "Customer Services",
            "dataTypes": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "A notice sent to an account holder about their account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "bf28283a-51ba-51c6-aef2-ac0d646f4e41",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A **notification**: it tells the customer that something happened and obliges nobody to act. The recipient is a party — the `Customers` domain — and which customer is the send's selector, never an address: how an advice reaches a customer is a design decision, not a requirement.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "b34f6c8d-268f-5620-b4d5-d6231de8f94d",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "8319e7a2-6d49-5478-9106-610c76d16b93",
                "name": "AccountAdvice",
                "abstract": false,
                "fields": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account the advice is about.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a1a14f9b-f0d3-5250-9086-736c67ce7b8e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "aca34941-0620-58d6-a628-16db57ccd6b6",
                    "name": "accountNumber",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "What happened, in words.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b71da2a1-5cfc-54ae-9a00-a039afab19ab",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7ab77cc0-9672-5de0-97f7-ddcb1d7e8a60",
                    "name": "notice",
                    "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition"
                  }
                ],
                "invariances": [],
                "variant": "DataStructure"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "One payment in a batch: who is paid, and how much.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "056ec5c9-4fae-5ea8-a042-17791fa6caf7",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "5f6abb6d-e827-5c77-aaec-cc5858c75c29",
                "name": "Payment",
                "abstract": false,
                "fields": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account paid.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1ba45798-5a89-5b39-88ea-51f6895de20a",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c9a4617f-5836-57c5-89a4-76397fa8a307",
                    "name": "toAccount",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "How much.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "93868417-8b2e-5b4c-871d-9d9f5163c7ec",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "20f1027e-3033-5e19-bb7f-be27e5571583",
                    "name": "amount",
                    "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition"
                  }
                ],
                "invariances": [],
                "variant": "DataStructure"
              }
            ],
            "entities": [],
            "exceptions": [],
            "processes": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Records the person as a customer under the login they asked with.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e7b8ae03-57e5-5b8e-a595-12263f73a42f",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "941163b5-87fd-5247-ac67-bb67cf6ac174",
                "name": "Register as customer",
                "serviceContract": "6dec6376-d9f8-57eb-b8cc-93166e8ef491",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Identity not yet registered' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ec4b05a4-1047-5bec-a54e-ad32f28c0e01",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "85771711-9f4e-5d33-a28c-336ce109a467",
                    "name": "Identity not yet registered",
                    "preCondition": "06cb86b1-b803-54c7-8800-8d70cc3d470e",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Put the customer on record.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "598fd3a1-c742-5bcc-bfcc-bb51bf4a6e95",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ea7f3ce8-f8b8-5cc9-925d-7dbe7f86c1d3",
                    "name": "Record customer",
                    "service": "9fc85d24-76a6-54b7-82f6-42deaaf03593",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'name' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "5b0634b3-8349-5995-89ab-e61b06cfee3c",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2e646150-812a-571f-9b6a-d8320baff7c3",
                        "name": "name",
                        "formalSpecification": {
                          "body": "providerRequest.name = request.name",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'identityNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "ec6240b0-b3cd-5ceb-8a67-f1176bc58c32",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2251fbed-7d16-5d04-8df2-4ea23e9a06f8",
                        "name": "identityNumber",
                        "formalSpecification": {
                          "body": "providerRequest.identityNumber = request.identityNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'login' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "991c5b0d-37ce-5961-a7c2-540a675c1f05",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2947bb0f-9b74-5bf5-9ac5-8fc541ffdca0",
                        "name": "login",
                        "formalSpecification": {
                          "body": "providerRequest.login = caller",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the number issued.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "67f1fab0-3316-5291-87e4-004d5a4f9fd8",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "24bddd4c-4408-5cdd-9181-d35a2fbb853b",
                          "name": "Report the customer number",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's customerNumber is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "ae0c5fa7-6a5b-5e3e-84b9-9243e780eb61",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "7c781de1-ded1-55db-a563-9455832eeb32",
                              "name": "customerNumber",
                              "formalSpecification": {
                                "body": "response.customerNumber = recorded.customerNumber",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "69b72c45-4fa1-5d86-a595-3e30465ab3f5",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "Somebody registered this identity after the check: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "45364371-9c9f-5e79-ab3b-4017bffe7f50",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "2b348fdd-1303-52e4-897f-51a8b574eee6",
                            "name": "Refuse: Identity not yet registered not met",
                            "variant": "RaiseException",
                            "exception": "88c03e16-2a76-50fd-86f5-3e5a7bc6cb55",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Record customer' refuses because 'Identity not yet registered' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "41c3492c-b718-5386-ba4f-500e021e726c",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ee339d15-8101-5cfc-bceb-9e22dc90be39",
                        "name": "handle Identity not yet registered not met",
                        "variant": "ExceptionHandler",
                        "exception": "e08f6526-8111-56ec-b92d-94fd53cae883"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The customer as recorded.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b09c49ad-e08e-5876-8258-82cfed8dec1c",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "0fc0c848-8da7-5b22-b946-63b072b0ff33",
                      "name": "recorded",
                      "invariances": [],
                      "dataType": "f9451c70-1da4-5563-bcf6-0f7d82b98d40",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Record customer' is the step that discharges 'Customer registered'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a2bc65c8-965c-5550-9631-d0705554a3d1",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d2c1e127-e81b-5ef6-9115-93680ff8ae0f",
                    "name": "Customer registered ← Record customer",
                    "toAddress": "9e437801-8792-5049-b022-b5ff1df03109",
                    "addressedBy": "ea7f3ce8-f8b8-5cc9-925d-7dbe7f86c1d3"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "941163b5-87fd-5247-ac67-bb67cf6ac174-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Opens the account in Accounts, then advises the customer.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a7ffacd2-5e6c-58d6-ae05-bad7c03677cb",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "e9d53867-0f69-5981-838a-4826a3076fbe",
                "name": "Open account",
                "serviceContract": "811d4abc-8d99-5779-ab37-54d321a69dbc",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Customer is registered' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8413ee40-3883-5dfd-a400-8884792c6a29",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e322d110-871a-5860-8345-68e07ef29c39",
                    "name": "Customer is registered",
                    "preCondition": "5b0ee8cb-1083-56bb-9965-a8db7b19c2ca",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Open a new, empty account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "18ef6e1f-4d93-5e28-96b1-eb9e3bce2920",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ad857208-af1d-5f7e-ba6c-b2047298a1a4",
                    "name": "Create account",
                    "service": "fd563d9a-4d51-57a9-8af3-a3a1daf4bae1",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'holder' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "f1148f35-599e-5e8d-911d-2766d35fedd3",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b2b951f6-a102-5920-86d7-6862d22622a1",
                        "name": "holder",
                        "formalSpecification": {
                          "body": "providerRequest.holder = request.customerNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountType' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "de4e2028-fcd7-5d99-9208-354965de108f",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "03b092f0-a168-56ff-b0cb-a4983ecd3dbd",
                        "name": "accountType",
                        "formalSpecification": {
                          "body": "providerRequest.accountType = request.accountType",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Tell the customer the account is open.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "4e80e271-d294-5141-90cc-3069a256cd12",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "c2376a4e-5c7b-5aab-a8a8-b6477e166fa6",
                          "name": "Send AccountAdvice",
                          "variant": "SendMessage",
                          "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                          "distribution": "notification",
                          "messageConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What the message's accountNumber is.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "0c19d258-4060-54d4-84ce-3117ac3ec95e",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "bdc632eb-7a13-5e6b-aa6d-3a2af0e998aa",
                              "name": "accountNumber",
                              "formalSpecification": {
                                "body": "sent.accountNumber = opened.accountNumber",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "MessageConstraint"
                            },
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What the message's notice is.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "7e22ceae-fee6-5825-9a66-e4814901152b",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "cc3381fd-ffae-55fc-ac5a-7f316be0eeb1",
                              "name": "notice",
                              "formalSpecification": {
                                "body": "sent.notice = 'Your account is open.'",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "MessageConstraint"
                            }
                          ],
                          "recipient": "da52fff1-738b-57ed-a694-218d358d17b8",
                          "recipientSelector": "request.customerNumber"
                        },
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the new account's number.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "9bf06732-28c1-5328-997a-1574d5720ccd",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "bdc0bb0d-3813-5a6f-b484-cd6b5891a757",
                          "name": "Report the account number",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's accountNumber is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "0e370211-ad46-5f70-8b9b-786202fd97bf",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "123592ae-a05a-5f79-a2cb-d41459831406",
                              "name": "accountNumber",
                              "formalSpecification": {
                                "body": "response.accountNumber = opened.accountNumber",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "08afd36d-2825-5fe0-a800-a26c99c36733",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "Accounts knows no such holder: the customer is not registered, in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "11faa9bf-3d63-5572-a950-2e78ebdd6623",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "c3e0f91a-cbbd-5380-bd0b-cf91fae0c2bf",
                            "name": "Refuse: Customer is registered not met",
                            "variant": "RaiseException",
                            "exception": "dcbe869a-8f7f-536d-986c-b8ee5467ed83",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Create account' refuses because 'Holder is registered' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "635027e0-9a14-58f4-b882-f69e15727cdb",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "21c6a51c-131c-5417-8c88-0b93d9a0e80e",
                        "name": "handle Holder is registered not met",
                        "variant": "ExceptionHandler",
                        "exception": "57ed1214-3715-5810-89d8-b117cb6310eb"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The new account's number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "c6154c94-d1bc-5ef5-8a57-a872d9d265f2",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "595e2e7a-0de1-5779-b2a1-0fea62a36793",
                      "name": "opened",
                      "invariances": [],
                      "dataType": "5bc520f7-4624-515c-9221-37328aa54125",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Create account' is the step that discharges 'Account opened'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5271bb06-d34e-58e5-aff3-8f6b51f21323",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3a485aeb-5362-51d7-afd9-52f8415a22bf",
                    "name": "Account opened ← Create account",
                    "toAddress": "09187624-e765-52d2-a106-c583bb44476c",
                    "addressedBy": "ad857208-af1d-5f7e-ba6c-b2047298a1a4"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Send AccountAdvice' is the step that discharges 'Holder advised'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2e150d40-a553-5955-be02-96e63459be5d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5fa09924-0094-5305-81ef-e1ef4e153581",
                    "name": "Holder advised ← Send AccountAdvice",
                    "toAddress": "b3932c50-8bc4-5cc1-b687-a5c9a88f635e",
                    "addressedBy": "c2376a4e-5c7b-5aab-a8a8-b6477e166fa6"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e9d53867-0f69-5981-838a-4826a3076fbe-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Credits the account through the ledger, and lets the ledger say whether it is open.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c0eb6190-9c40-5ec0-90ab-4690e547eab2",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "**Catching an exception, and raising one.** This process does not check *Account is open* itself: the ledger's *Credit account* has the same pre-condition and refuses a closed account anyway. Checking twice would be two statements of one rule. So the process requests the credit and **handles** the ledger's refusal — by **raising** its own *Account is open not met*, so a customer is refused in this service's terms rather than the ledger's.\n\nBecause the request handles an exception, its answer is read only on its success lane: past the merge the service may not have answered.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1444aac9-9d73-57d7-8a9b-e285d61c2765",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "3d59b9a3-8b3f-5567-9253-d3240473c804",
                "name": "Deposit cash",
                "serviceContract": "3d431e6a-406e-58bc-95cf-f5137154c153",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Amount is positive' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "763b7e59-262a-5ffc-99d2-deb534215c93",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6973b368-c3a4-556d-b555-288b3a416f03",
                    "name": "Amount is positive",
                    "preCondition": "ffc2687e-5078-5e4d-835c-4bea9bf5f650",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Add the amount to the account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "7a089bb8-115f-5369-b914-9f5df9f7d7f1",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "498c5a9a-c671-5fd5-a2c8-02ed030666c5",
                    "name": "Credit account",
                    "service": "d70ecf09-3aef-55eb-92b7-a27c419e8a88",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "0e043dbb-7d8d-53a8-9572-ad7a931d1ba5",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5299b3a7-9739-5011-8a7d-408b1573f865",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "providerRequest.accountNumber = request.accountNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'amount' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "b2ae0b23-1013-5351-8c8c-46b0f7fcd104",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e065e515-d624-587e-aabe-1975cd36c630",
                        "name": "amount",
                        "formalSpecification": {
                          "body": "providerRequest.amount = request.amount",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the balance after the deposit.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "156bc8e3-7a1d-586e-af0f-73375fe65096",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "88216373-3131-5d15-809d-33278eb99680",
                          "name": "Report the new balance",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's newBalance is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "69f753dd-8fb8-5037-97db-dc9bbe1981c8",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "e7da2f04-314b-5c5d-8527-88d3b8289cfe",
                              "name": "newBalance",
                              "formalSpecification": {
                                "body": "response.newBalance = credited.newBalance",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1ef54dff-6a64-5401-ba96-101095fcc660",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "Refuse the deposit, as this service's own exception.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "4eda167c-40a4-540c-bfbb-49c101692e0b",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "ed7564cd-f733-56b5-8c79-88dc3f40b443",
                            "name": "Refuse: the account is not open",
                            "variant": "RaiseException",
                            "exception": "905b13e5-1730-5109-894f-6bb4ad21f960",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Credit account' refuses because 'Account is open' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "6def46f7-1eff-5ab3-8195-0d7d9b228df9",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b03d631c-aac5-530b-9487-37d758d7551f",
                        "name": "handle Account is open not met",
                        "variant": "ExceptionHandler",
                        "exception": "1d9ce1c1-ad00-5b45-93d7-cb04c9e3da54"
                      },
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The ledger refused the amount: refuse the deposit for the same reason.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "4801d5ee-4f1a-5846-b953-a0fc921df62e",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "44b84789-9639-59b3-a03e-fb2a8d2cd2fd",
                            "name": "Refuse: Amount is positive not met",
                            "variant": "RaiseException",
                            "exception": "57867959-c0d2-5342-b989-0ef870399115",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Credit account' refuses because 'Amount is positive' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "1f95b98a-0ae9-5022-a5d8-b3ea79496e42",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e2eaaee4-c687-5c18-860c-2339cd6db239",
                        "name": "handle Amount is positive not met",
                        "variant": "ExceptionHandler",
                        "exception": "66a3b20e-2707-5d78-8581-3e82684644c9"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The balance after the credit.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "cc0c45e3-6753-5a14-9d80-58d3f92d2c1c",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "94746238-a6a1-551f-b497-a2fe6cd67379",
                      "name": "credited",
                      "invariances": [],
                      "dataType": "93292d4e-bc45-5ced-a4d4-5f49cd164c6c",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Refuse: the account is not open' is the step that discharges 'Account is open'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bf69f6e8-5943-5596-80ba-43f78aaef84e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "778d1b2f-3241-5739-a508-7d0c94fcd2d5",
                    "name": "Account is open ← Refuse: the account is not open",
                    "toAddress": "43d316a2-f5bc-522d-802d-47d2ff0a300d",
                    "addressedBy": "ed7564cd-f733-56b5-8c79-88dc3f40b443"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Credit account' is the step that discharges 'Balance increased'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "f6ee75fd-d136-52c5-bbd0-4b9ee0a7be0b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3e8a3835-5afc-5aa4-80b0-f32f42d8b36c",
                    "name": "Balance increased ← Credit account",
                    "toAddress": "c0b14fd5-babd-5757-889b-11e68c5e2497",
                    "addressedBy": "498c5a9a-c671-5fd5-a2c8-02ed030666c5"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Report the new balance' is the step that discharges 'New balance reported'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "6c5036c6-3204-5b4d-890d-cc8ee6c0f229",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f91a61f3-3e48-5901-b5ad-a691261d0844",
                    "name": "New balance reported ← Report the new balance",
                    "toAddress": "8d59f222-6bfb-5071-8bec-90c972cbad36",
                    "addressedBy": "88216373-3131-5d15-809d-33278eb99680"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "3d59b9a3-8b3f-5567-9253-d3240473c804-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Looks the account up, then either debits it or refuses for lack of funds.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "831548b9-27b2-5802-9ba7-e2b07c63232d",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "**Alternate flows, and raising an exception.** Rather than a check step, the process looks the account up and branches on what it finds: with enough money it debits the account and reports the new balance; otherwise it **raises** *Sufficient funds not met*, stating its `shortfall` from the account it found. Exactly one branch runs. The pre-condition is allocated to the branch as a whole, since the two flows together are what meet it.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "437b60aa-7d0a-5dc7-8d1c-bb5b2e6afb5e",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "1096fafe-5849-573a-a623-330c75cbba48",
                "name": "Withdraw cash",
                "serviceContract": "2434a418-f1be-535d-a990-ab254229e747",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Amount is positive' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8c5c1028-2313-5c5c-80a5-b8e6c04ae1e7",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f1c399fa-9e1b-5710-979a-3a4125354ab8",
                    "name": "Amount is positive",
                    "preCondition": "84962f18-91e7-5a3d-b435-e6d4a2e1f424",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Account is open' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "aabfd7c2-84a2-5ad7-82d9-14961f12cc94",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1eb164ed-b490-55c8-b567-40b6cec64759",
                    "name": "Account is open",
                    "preCondition": "739affb4-c838-55b4-bb43-b745d5be44c0",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Requested by the holder' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bc302e44-9a86-58b2-8d44-bae098c3348b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3a3025d6-4718-56d0-8ec3-7bab258bd0c1",
                    "name": "Requested by the holder",
                    "preCondition": "75535ba9-fe57-5bb6-bd6c-340fd2026405",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Look the account up.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "74e92abf-c6d5-5da1-8897-0ad220cdad29",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8e089381-f02b-5c11-accc-c8daece3bcc4",
                    "name": "Retrieve account",
                    "service": "32fc8143-0e59-5f8f-a7c8-d196357d97aa",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "daa85513-486c-5316-a450-267719e01dbb",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9af10a72-cd9f-5b06-99fc-500228b4ee1a",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "providerRequest.accountNumber = request.accountNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Debit the account if it holds the amount; refuse otherwise.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "eafc3c43-4166-5a99-8039-d304fc84f02f",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "f8671ea3-7112-527d-82d2-af967dac74bd",
                          "name": "Enough in the account?",
                          "variant": "AlternateFlows",
                          "conditionalFlows": [
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "Take the amount out of the account.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "8615155e-5c92-5755-a4dd-af8661d272db",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "f1b217b5-292d-5f5b-b5ca-0864a4198b6c",
                                  "name": "Debit account",
                                  "service": "e568d0c3-102a-57c7-a834-3a34ad6b32ef",
                                  "instanceKind": "singleInstance",
                                  "processingMode": "parallel",
                                  "variant": "RequestService",
                                  "requestConstraints": [
                                    {
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "How 'accountNumber' is populated for this request.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "38cd5831-2399-5c9f-a664-1718aa1b5dd3",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "fe4585a7-83eb-5c93-adf0-d44b714f83f9",
                                      "name": "accountNumber",
                                      "formalSpecification": {
                                        "body": "providerRequest.accountNumber = request.accountNumber",
                                        "specificationLanguage": "OCL"
                                      },
                                      "variant": "RequestConstraint"
                                    },
                                    {
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "How 'amount' is populated for this request.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "501e4ebe-072d-5633-ac93-94a1fd001ae0",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "21d0749b-22b4-5cd5-b529-41f84379c3c2",
                                      "name": "amount",
                                      "formalSpecification": {
                                        "body": "providerRequest.amount = request.amount",
                                        "specificationLanguage": "OCL"
                                      },
                                      "variant": "RequestConstraint"
                                    }
                                  ],
                                  "defaultFlow": {
                                    "activities": [
                                      {
                                        "annotations": [
                                          {
                                            "annotations": [],
                                            "body": "Return the balance after the withdrawal.",
                                            "formalizationOf": [],
                                            "formalizationSnapshots": [],
                                            "id": "4814d1e1-ae99-59a7-873d-0e993bed5b9d",
                                            "language": "en",
                                            "markup": "text_plain",
                                            "name": "Description",
                                            "purpose": "shortDescription"
                                          }
                                        ],
                                        "formalizationOf": [],
                                        "formalizationSnapshots": [],
                                        "id": "f6ed317f-5d58-54bf-b158-e73a8893cd8c",
                                        "name": "Report the new balance",
                                        "variant": "PopulateResponse",
                                        "responseConstraints": [
                                          {
                                            "annotations": [
                                              {
                                                "annotations": [],
                                                "body": "How the response's newBalance is populated.",
                                                "formalizationOf": [],
                                                "formalizationSnapshots": [],
                                                "id": "c3a54b1d-be2d-5f7a-8fd2-1ec9b50900c9",
                                                "language": "en",
                                                "markup": "text_plain",
                                                "name": "Description",
                                                "purpose": "shortDescription"
                                              }
                                            ],
                                            "formalizationOf": [],
                                            "formalizationSnapshots": [],
                                            "id": "76ff24e9-7997-522e-ae23-11f71d6b5538",
                                            "name": "newBalance",
                                            "formalSpecification": {
                                              "body": "response.newBalance = debited.newBalance",
                                              "specificationLanguage": "OCL"
                                            },
                                            "variant": "ResponseConstraint"
                                          }
                                        ]
                                      }
                                    ],
                                    "annotations": [],
                                    "formalizationOf": [],
                                    "formalizationSnapshots": [],
                                    "id": "685ebd8a-786b-5fd2-88c9-41bfd205a9f3",
                                    "name": "default",
                                    "variant": "ActivitySequence"
                                  },
                                  "exceptionHandlers": [
                                    {
                                      "activities": [
                                        {
                                          "annotations": [
                                            {
                                              "annotations": [],
                                              "body": "The account was closed after the check: refuse in this service's terms.",
                                              "formalizationOf": [],
                                              "formalizationSnapshots": [],
                                              "id": "fc17c787-6f95-54a6-935a-5a2ecabf4862",
                                              "language": "en",
                                              "markup": "text_plain",
                                              "name": "Description",
                                              "purpose": "shortDescription"
                                            }
                                          ],
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "7b1318cd-9f8a-5a27-b408-3eeeca6c1201",
                                          "name": "Refuse: Account is open not met",
                                          "variant": "RaiseException",
                                          "exception": "2b6e54b9-b747-5685-a1b7-6d3a93a87396",
                                          "exceptionConstraints": []
                                        }
                                      ],
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What is done when 'Debit account' refuses because 'Account is open' does not hold.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "a58f3bce-9775-55f9-83f3-6d1d4c60141e",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "329c4476-ab44-5f69-8645-0e790403096f",
                                      "name": "handle Account is open not met",
                                      "variant": "ExceptionHandler",
                                      "exception": "30330a8d-5a5b-5917-8844-81df8b4d9340"
                                    },
                                    {
                                      "activities": [
                                        {
                                          "annotations": [
                                            {
                                              "annotations": [],
                                              "body": "The ledger refused the amount: refuse the withdrawal for the same reason.",
                                              "formalizationOf": [],
                                              "formalizationSnapshots": [],
                                              "id": "16e3dbad-8a98-55bc-9c9c-32197182ce14",
                                              "language": "en",
                                              "markup": "text_plain",
                                              "name": "Description",
                                              "purpose": "shortDescription"
                                            }
                                          ],
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "bf1e07f6-d301-5c02-8f04-966512b33596",
                                          "name": "Refuse: Amount is positive not met",
                                          "variant": "RaiseException",
                                          "exception": "5b03abec-cb1d-51d8-873b-76a3606cd043",
                                          "exceptionConstraints": []
                                        }
                                      ],
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What is done when 'Debit account' refuses because 'Amount is positive' does not hold.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "b0bce97f-daf4-5e30-986f-11fecde655c3",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "05079dc5-7c62-5cac-bf51-5b0b4e10a6a8",
                                      "name": "handle Amount is positive not met",
                                      "variant": "ExceptionHandler",
                                      "exception": "259be77f-5f34-5b80-ba09-fc1fb797ae12"
                                    },
                                    {
                                      "activities": [
                                        {
                                          "annotations": [
                                            {
                                              "annotations": [],
                                              "body": "The balance fell below the amount after it was read: refuse, stating the shortfall then.",
                                              "formalizationOf": [],
                                              "formalizationSnapshots": [],
                                              "id": "ae9773ba-d5d5-57bb-8748-319cff5ec805",
                                              "language": "en",
                                              "markup": "text_plain",
                                              "name": "Description",
                                              "purpose": "shortDescription"
                                            }
                                          ],
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "072befb9-28dd-5811-898b-1430a5781ce1",
                                          "name": "Refuse: Sufficient funds not met",
                                          "variant": "RaiseException",
                                          "exception": "e40d09f5-789a-503e-971e-4890abde432d",
                                          "exceptionConstraints": [
                                            {
                                              "annotations": [
                                                {
                                                  "annotations": [],
                                                  "body": "What the exception's shortfall is.",
                                                  "formalizationOf": [],
                                                  "formalizationSnapshots": [],
                                                  "id": "fd263368-ff72-59dc-ace1-20b62c67d676",
                                                  "language": "en",
                                                  "markup": "text_plain",
                                                  "name": "Description",
                                                  "purpose": "shortDescription"
                                                }
                                              ],
                                              "formalizationOf": [],
                                              "formalizationSnapshots": [],
                                              "id": "df5f9f30-94f7-56e1-8067-3139b532e014",
                                              "name": "shortfall",
                                              "formalSpecification": {
                                                "body": "raised.shortfall = request.amount - found.account.balance",
                                                "specificationLanguage": "OCL"
                                              },
                                              "variant": "ExceptionConstraint"
                                            }
                                          ]
                                        }
                                      ],
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What is done when 'Debit account' refuses because 'Sufficient funds' does not hold.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "9e8fae6b-6c70-5932-8bb4-f7863c49c1cf",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "c4f70bcc-48cc-596d-9b00-db4eef06666f",
                                      "name": "handle Sufficient funds not met",
                                      "variant": "ExceptionHandler",
                                      "exception": "3a71daec-1c71-55e9-ac09-4b495e055abf"
                                    }
                                  ],
                                  "messageHandlers": [],
                                  "responseVariable": {
                                    "annotations": [
                                      {
                                        "annotations": [],
                                        "body": "The balance after the debit.",
                                        "formalizationOf": [],
                                        "formalizationSnapshots": [],
                                        "id": "2ea68671-5b6a-5672-bcbc-3bb0adce9613",
                                        "language": "en",
                                        "markup": "text_plain",
                                        "name": "Description",
                                        "purpose": "shortDescription"
                                      }
                                    ],
                                    "formalizationOf": [],
                                    "formalizationSnapshots": [],
                                    "id": "59ff36fc-a9a5-5360-871c-8c08a0111872",
                                    "name": "debited",
                                    "invariances": [],
                                    "dataType": "40ed6199-3900-5728-ae6c-a84b13c05532",
                                    "multiplicity": "1"
                                  }
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "Taken when funds suffice.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "2a866bfc-c7e5-5db8-95b1-d5444e0bc612",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "4a261234-af09-5008-bc7e-316acfff5739",
                              "name": "Funds suffice",
                              "variant": "ConditionalFlow",
                              "formalSpecification": {
                                "body": "found.account.balance >= request.amount",
                                "specificationLanguage": "OCL"
                              }
                            }
                          ],
                          "defaultFlow": {
                            "activities": [
                              {
                                "annotations": [
                                  {
                                    "annotations": [],
                                    "body": "Refuse the withdrawal: the account holds less than the amount.",
                                    "formalizationOf": [],
                                    "formalizationSnapshots": [],
                                    "id": "cc4fe923-2de9-5130-a112-06248ed82b52",
                                    "language": "en",
                                    "markup": "text_plain",
                                    "name": "Description",
                                    "purpose": "shortDescription"
                                  }
                                ],
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "e044479c-622b-5deb-9d6a-48df4154e57e",
                                "name": "Refuse: insufficient funds",
                                "variant": "RaiseException",
                                "exception": "e40d09f5-789a-503e-971e-4890abde432d",
                                "exceptionConstraints": [
                                  {
                                    "annotations": [
                                      {
                                        "annotations": [],
                                        "body": "What the exception's shortfall is.",
                                        "formalizationOf": [],
                                        "formalizationSnapshots": [],
                                        "id": "31138b0e-f0e4-5e6c-95d3-4d3f802f2316",
                                        "language": "en",
                                        "markup": "text_plain",
                                        "name": "Description",
                                        "purpose": "shortDescription"
                                      }
                                    ],
                                    "formalizationOf": [],
                                    "formalizationSnapshots": [],
                                    "id": "7446a37f-5059-5b17-a3c9-2081b0688f1e",
                                    "name": "shortfall",
                                    "formalSpecification": {
                                      "body": "raised.shortfall = request.amount - found.account.balance",
                                      "specificationLanguage": "OCL"
                                    },
                                    "variant": "ExceptionConstraint"
                                  }
                                ]
                              }
                            ],
                            "annotations": [],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "6d4146cc-4419-5603-9f88-0bd352e45b79",
                            "name": "otherwise",
                            "variant": "ActivitySequence"
                          }
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d6e4cc92-98f2-5d01-851b-8f6eb4a89022",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "There is no such account, so it is not open either: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "18275627-b543-5431-b5ff-375960219147",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "019a2e5e-c0e8-5ae3-8e5e-0600acb20310",
                            "name": "Refuse: Account is open not met",
                            "variant": "RaiseException",
                            "exception": "2b6e54b9-b747-5685-a1b7-6d3a93a87396",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Retrieve account' refuses because 'Account exists' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "e00461ac-dfcf-5548-9090-0693a3bb4802",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "36953f4c-b162-5900-bce2-1b2556ac2baa",
                        "name": "handle Account exists not met",
                        "variant": "ExceptionHandler",
                        "exception": "979918bb-fdf2-55af-b102-9efc5a4e9ac0"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account as it stands.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "93b58cca-57e1-5ce0-af21-bf0babafb521",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "231e92e4-1b84-5816-be94-3bbdf64ec129",
                      "name": "found",
                      "invariances": [],
                      "dataType": "539f368b-3983-5986-82ba-70b12526d204",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Enough in the account?' is the step that discharges 'Sufficient funds'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "4798ef53-cf74-5aff-874f-8f0ffd2d8358",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ee7c3e9d-dc38-50f6-88d8-55290a2f75e3",
                    "name": "Sufficient funds ← Enough in the account?",
                    "toAddress": "f459abbd-7df5-5ed2-ba88-e753ab5a48a2",
                    "addressedBy": "f8671ea3-7112-527d-82d2-af967dac74bd"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Debit account' is the step that discharges 'Balance reduced'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1e564e17-a696-5737-8aeb-c518478a754b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ed65d6d0-6420-5414-9f29-f134424d5183",
                    "name": "Balance reduced ← Debit account",
                    "toAddress": "2456df04-87cc-5270-88aa-5fcd59fb7006",
                    "addressedBy": "f1b217b5-292d-5f5b-b5ca-0864a4198b6c"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Report the new balance' is the step that discharges 'New balance reported'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2f4e26f7-3519-5b25-8373-dbe695b59948",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c08c39c1-999a-5f81-8872-2360a9d7f379",
                    "name": "New balance reported ← Report the new balance",
                    "toAddress": "e3b8c7b5-7331-5701-b655-57012e05bd7e",
                    "addressedBy": "f6ed317f-5d58-54bf-b158-e73a8893cd8c"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "1096fafe-5849-573a-a623-330c75cbba48-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Posts the transfer through the ledger as one posting, then advises both parties at once.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "2848169c-b4b9-5797-bfa6-d393e27446b8",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "The process does **not** debit one account and credit the other itself: a transfer must happen entirely or not at all, so it is allocated to the ledger's *Post transfer*, which guarantees that. One step therefore addresses two requirements.\n\n**Concurrent flows.** The payer and the payee are advised at the same time: neither advice depends on the other, and the response waits for both.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3850246e-4e78-57df-894d-e090aea24512",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "0caccd6c-a3d4-55da-b5ea-ef74dc6e63f2",
                "name": "Transfer funds",
                "serviceContract": "372c06fb-ca72-54a5-aaa1-2d9235771a07",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Amount is positive' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a903966d-10f8-5513-9029-dee66309dc6b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a9b55b52-8ccc-5706-9ca7-0ada476e34e3",
                    "name": "Amount is positive",
                    "preCondition": "6c866dff-8434-598b-aa56-f9d90c2c8662",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Within the transfer limit' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2f1fe600-4f62-5c25-9ede-36acc2bb6f92",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e9c32a92-f5d8-5e5b-86c7-4fd84f09b06b",
                    "name": "Within the transfer limit",
                    "preCondition": "1ad76e95-6398-5ae6-abce-c83d3e3b2af1",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Different accounts' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "f03f35ec-a078-582a-a3e1-87916a54a76b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a09d0d5e-4ca6-5104-b22d-2e7b0e2362ae",
                    "name": "Different accounts",
                    "preCondition": "aa66f495-3ca4-5925-b1c8-db0edd3eb97c",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Both accounts are open' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "41d314ca-7a3e-5a95-8c98-6ddfe12d6324",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "535fa224-c40a-51a2-b212-ee9cf9aa01a8",
                    "name": "Both accounts are open",
                    "preCondition": "8f9c64d7-e1d2-5aeb-bbe8-17a21314ef74",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Requested by the holder' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8158acdc-6cb1-53a5-9f63-cac45bdf00c3",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9075ad3d-9daf-5347-9d6a-15b8a92b486f",
                    "name": "Requested by the holder",
                    "preCondition": "19635201-386e-573a-9140-41da8112ebbd",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Sufficient funds' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d84a9958-49ab-53e9-8237-c64a46bcfed1",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "85967aa9-432c-57c9-91c8-e177e8919e5f",
                    "name": "Sufficient funds",
                    "preCondition": "960f4ecb-13e2-5f0f-b745-09a46c3fd936",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Move the money as one indivisible posting.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "53f8ad05-963b-5178-b62c-bfc65f287c95",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "fbff8354-b982-546b-974f-4f89071173f1",
                    "name": "Post transfer",
                    "service": "2f7f6e45-7e52-542e-ba52-bfa3097ff066",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'fromAccount' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "55f99004-90e0-57a3-a122-dff844b93dbe",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "63c28941-defa-591f-9b3f-a457da1a0772",
                        "name": "fromAccount",
                        "formalSpecification": {
                          "body": "providerRequest.fromAccount = request.fromAccount",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'toAccount' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "a697504b-38c5-5c97-8fd6-088a90c1fcd9",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "03cad20f-7b95-5d88-9468-026a22e2bc42",
                        "name": "toAccount",
                        "formalSpecification": {
                          "body": "providerRequest.toAccount = request.toAccount",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'amount' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "ddd0a3c6-aed4-54ad-8684-d2f7fa0d805a",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "52d7e827-c837-5a4b-a86b-5de94ece35fb",
                        "name": "amount",
                        "formalSpecification": {
                          "body": "providerRequest.amount = request.amount",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "The payer and the payee are told at the same time.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "89cf72b6-27bc-5159-abcd-24d5043d88d9",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "9133743d-866d-52a1-b570-9c1ceefab020",
                          "name": "Advise both parties",
                          "variant": "ConcurrentFlows",
                          "concurrentFlows": [
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "Tell the payer the transfer was made.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "4eb1df10-b9c6-58d6-a709-319f37465b17",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "09866a7a-2cb9-58ac-9942-154fb2b0befb",
                                  "name": "Send AccountAdvice",
                                  "variant": "SendMessage",
                                  "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                                  "distribution": "notification",
                                  "messageConstraints": [
                                    {
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What the message's accountNumber is.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "b667cca9-b0c4-596a-991e-1f9f3c22d4a9",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "d7c49903-ca7d-5248-b836-99e8bbda4f9f",
                                      "name": "accountNumber",
                                      "formalSpecification": {
                                        "body": "sent.accountNumber = request.fromAccount",
                                        "specificationLanguage": "OCL"
                                      },
                                      "variant": "MessageConstraint"
                                    },
                                    {
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What the message's notice is.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "67915fa9-b57c-541e-b52e-8415689f708b",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "f60a8af2-8556-5a50-9607-6525739b600c",
                                      "name": "notice",
                                      "formalSpecification": {
                                        "body": "sent.notice = 'Your transfer was made.'",
                                        "specificationLanguage": "OCL"
                                      },
                                      "variant": "MessageConstraint"
                                    }
                                  ],
                                  "recipient": "da52fff1-738b-57ed-a694-218d358d17b8",
                                  "recipientSelector": "request.fromAccount"
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "The payer's advice.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "ce907205-2a8b-51ba-a4cb-f3e53ea7e87b",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "2648407a-de57-5999-8244-22e331ddf2c4",
                              "name": "Advise the payer",
                              "variant": "ActivitySequence"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "Tell the payee money arrived.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "ea4f5dd5-c938-5d48-8d4e-3f7c2f91e059",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "8ace895b-6c74-5a18-a7dc-9745e328d6c8",
                                  "name": "Send AccountAdvice",
                                  "variant": "SendMessage",
                                  "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                                  "distribution": "notification",
                                  "messageConstraints": [
                                    {
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What the message's accountNumber is.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "1a53b356-7c6c-5c93-9325-d1f1d83cb088",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "4f618a81-454b-56f2-8a98-6f2c5041c0e5",
                                      "name": "accountNumber",
                                      "formalSpecification": {
                                        "body": "sent.accountNumber = request.toAccount",
                                        "specificationLanguage": "OCL"
                                      },
                                      "variant": "MessageConstraint"
                                    },
                                    {
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "What the message's notice is.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "00c1de71-994c-51a2-8b8e-5951630a762e",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "7eaef2cd-3484-53a9-a89b-855055b1d8d6",
                                      "name": "notice",
                                      "formalSpecification": {
                                        "body": "sent.notice = 'Money arrived in your account.'",
                                        "specificationLanguage": "OCL"
                                      },
                                      "variant": "MessageConstraint"
                                    }
                                  ],
                                  "recipient": "da52fff1-738b-57ed-a694-218d358d17b8",
                                  "recipientSelector": "request.toAccount"
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "The payee's advice.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "67f096b7-d481-537e-bee4-ffd459863e88",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "fe2d86ad-ac9b-5b45-b181-82df350e9ef2",
                              "name": "Advise the payee",
                              "variant": "ActivitySequence"
                            }
                          ]
                        },
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the paying account's new balance.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "8de767f1-d526-53dc-b127-f1d514b20915",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "5973bf4b-5a39-5784-ba65-fbc7cd0e4ba1",
                          "name": "Report the new balance",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's newBalance is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "7dea2867-563a-556f-b46e-82d5463adff3",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "95122947-b744-52af-8233-2912a469ebad",
                              "name": "newBalance",
                              "formalSpecification": {
                                "body": "response.newBalance = posted.newBalance",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1722cf52-7bbe-580e-86cf-b8c304a71e6a",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The ledger refused for a reason this service names too: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "dc719cff-98b4-5f54-820f-5bee85f87ee9",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "da4163a9-c35f-5ff9-a72e-f93300d99221",
                            "name": "Refuse: Both accounts are open not met",
                            "variant": "RaiseException",
                            "exception": "7c657d24-cb13-5904-b7e4-9f55989429dd",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Post transfer' refuses because 'Both accounts are open' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "e154d6a4-3c8c-557d-9954-8f866247c481",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "414b95ea-6e49-561a-8bb4-365482f6c88d",
                        "name": "handle Both accounts are open not met",
                        "variant": "ExceptionHandler",
                        "exception": "b5686694-5f77-5f26-9b24-7bfba2f15f2f"
                      },
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The ledger refused for a reason this service names too: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "d01ef1f4-c3cb-5d52-b783-67fd0a3ccfec",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "bebe827a-d8c8-5809-a20b-506dbd80b4ba",
                            "name": "Refuse: Different accounts not met",
                            "variant": "RaiseException",
                            "exception": "d97d9190-4b52-5ec7-8252-7f323178b106",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Post transfer' refuses because 'Different accounts' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "24a99540-f56f-5dcb-8e5d-645fd77e157a",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ae2fce27-2b14-5385-aa5a-51fb2ca373f1",
                        "name": "handle Different accounts not met",
                        "variant": "ExceptionHandler",
                        "exception": "24c8a310-4adb-5aaf-9021-e60536a12922"
                      },
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The ledger refused for a reason this service names too: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "83569cd1-7fbb-5250-bc39-3eef3d9e6e7a",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "04044015-ad39-5f30-87e8-25dbdd2a80be",
                            "name": "Refuse: Amount is positive not met",
                            "variant": "RaiseException",
                            "exception": "d155a5f9-0b2e-5f2b-a491-9e7d006daff7",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Post transfer' refuses because 'Amount is positive' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "821aca4e-db28-5154-97ba-b1c18e6685b4",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e69b2829-59cf-5f8d-97a4-ee4b7fddfb7f",
                        "name": "handle Amount is positive not met",
                        "variant": "ExceptionHandler",
                        "exception": "1e8e35be-562c-50b1-8089-3290e4fb9e7c"
                      },
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The transfer limit is the ledger's posting limit, so this is the same refusal.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "52d2f1f7-4456-5776-975f-58698266c259",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "4cfee656-addc-5065-972a-e174de8f137f",
                            "name": "Refuse: Within the transfer limit not met",
                            "variant": "RaiseException",
                            "exception": "50b79a3d-5bf2-5cc0-aa8f-2527e13a112d",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Post transfer' refuses because 'Within the posting limit' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "2d27d1a3-aa0b-58a0-a2ed-8309920393b2",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c52e75c1-002e-5e23-a051-81368c139d6e",
                        "name": "handle Within the posting limit not met",
                        "variant": "ExceptionHandler",
                        "exception": "a061974e-e841-597e-8b38-f674b1650542"
                      },
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The ledger refused for a reason this service names too: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "6434cd60-e080-5694-8155-2f45d9bcb4e8",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "f077bba3-9f66-5280-98bd-434cc9d6506a",
                            "name": "Refuse: Sufficient funds not met",
                            "variant": "RaiseException",
                            "exception": "233d34fd-a196-5b29-8781-7ebafeb19a6a",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Post transfer' refuses because 'Sufficient funds' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "23bab519-7900-57b9-84bb-d334d0461a84",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a7737e67-e6e4-5d87-a35b-0a83aac6feb0",
                        "name": "handle Sufficient funds not met",
                        "variant": "ExceptionHandler",
                        "exception": "70b7fd41-0cec-599f-8dcf-e58ec354815e"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The paying account's balance after the transfer.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0283c446-9f44-50a0-8e1d-36bfccc997f3",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "438bfe14-ede5-532f-be02-51c15716f18e",
                      "name": "posted",
                      "invariances": [],
                      "dataType": "9232d34c-2bd9-5f1a-ab1c-d58413a0936b",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Post transfer' is the step that discharges 'Funds moved'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ddebb6e2-d7b8-5dcf-912b-ab5fc0cb8d38",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "4d327015-7f01-5ef9-8a0c-46e11bee224e",
                    "name": "Funds moved ← Post transfer",
                    "toAddress": "e6cc97ec-b15e-542c-9da2-19a255e185a8",
                    "addressedBy": "fbff8354-b982-546b-974f-4f89071173f1"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Post transfer' is the step that discharges 'Money is conserved'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1899d6af-2cc4-55ad-a85f-649e7791f76b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a8f0bc28-0e88-5fa1-af34-55ed300d66a6",
                    "name": "Money is conserved ← Post transfer",
                    "toAddress": "7192dbb8-3048-5f64-bd6a-ab435bec23a9",
                    "addressedBy": "fbff8354-b982-546b-974f-4f89071173f1"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Send AccountAdvice' is the step that discharges 'Payer advised'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d0d42e19-c6dc-5c95-a04e-39f7c8338449",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "dfbddc76-fe0c-5043-9706-e533419a5f91",
                    "name": "Payer advised ← Send AccountAdvice",
                    "toAddress": "449fc694-521b-581a-89d4-d94b35b00479",
                    "addressedBy": "09866a7a-2cb9-58ac-9942-154fb2b0befb"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Send AccountAdvice' is the step that discharges 'Payee advised'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "039b7e69-6cba-541b-8a31-2a95f66ed97c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9607559e-ad8f-5c05-92f0-8fa7f8e0551b",
                    "name": "Payee advised ← Send AccountAdvice",
                    "toAddress": "a189ffbe-96b1-5da7-9152-51bd249c7660",
                    "addressedBy": "8ace895b-6c74-5a18-a7dc-9745e328d6c8"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Report the new balance' is the step that discharges 'New balance reported'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a17fdffe-1149-562b-9ae2-1d7114e9baa6",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "146e90eb-671b-5643-9ed3-d84044a4d493",
                    "name": "New balance reported ← Report the new balance",
                    "toAddress": "44d5323c-2bbc-55c0-bdb2-7f0cf8f420b4",
                    "addressedBy": "5973bf4b-5a39-5784-ba65-fbc7cd0e4ba1"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "0caccd6c-a3d4-55da-b5ea-ef74dc6e63f2-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Posts each salary in turn, then reports the employer's balance.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5aaf47c7-c76d-58cb-81f6-179dcbc1b63d",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "**For-each.** The batch is a collection in the request, and each payment is posted by the same step — so the step is written once, inside a loop over `request.payments`. The loop is sequential: each posting draws on the same paying account.\n\nOnly what a loop carries outlives it, and this one carries nothing: the balance it leaves behind is the account's, which only the ledger knows, so it is looked up afterwards rather than folded through the loop.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "320cd30f-9971-5680-9841-8f7ef89f6dd9",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "df5a6fec-29f6-5ea8-9049-8ef206266203",
                "name": "Pay salaries",
                "serviceContract": "125f7ef9-1ddd-5ceb-8718-93cfc3c349e0",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Requested by the holder' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "048664b8-8855-50b2-b2ac-d0bbe795c0e8",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d8d0b34f-850c-5538-b8b0-4c10ab520e18",
                    "name": "Requested by the holder",
                    "preCondition": "6e3a2032-349d-5479-9a1a-bdaa8c79f214",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Payer account is open' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c904d901-ac30-54db-9fa2-ea23b4a51c43",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "36c45d7a-a203-562b-9003-b8ca7511b530",
                    "name": "Payer account is open",
                    "preCondition": "b1dc1060-79e4-573f-b9e0-a4fcb1ac5429",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Payees are open accounts' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "6b579451-5fd8-587d-ae40-bfcc2dad4c4e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "55d77dd0-50a5-5eae-ac76-0daade69c928",
                    "name": "Payees are open accounts",
                    "preCondition": "bc22dda6-4871-5072-9872-71c7332940a8",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Each payee once' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "4a2795e4-4df0-5f42-a3cb-b6dec66b6ff2",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0bdb17b8-216c-5e1b-af5b-144f9f8ef553",
                    "name": "Each payee once",
                    "preCondition": "8f6d1bf6-7757-5247-ba9c-14148c461c90",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Not paying itself' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0294cf2a-4dbc-5ff9-8998-d0ffa85cd648",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "aa628955-19ec-5c50-b292-be67612a111f",
                    "name": "Not paying itself",
                    "preCondition": "3d8b876c-7248-5a40-bf05-0455de52ee8c",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Amounts within the posting limit' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "25d943f5-c008-5501-be83-929e2eb8cf64",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "485f7a49-cbbc-5035-a6fa-533c8b8deabc",
                    "name": "Amounts within the posting limit",
                    "preCondition": "c0e88a29-e13c-56dc-8a29-775c5489aa5a",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Sufficient funds' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "74c3c51d-ca11-5383-943c-1012ec940dee",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "cd6191c0-eabd-5187-8cf7-469993b0f245",
                    "name": "Sufficient funds",
                    "preCondition": "5030fd2a-bc89-58eb-9045-2ff72ef43af5",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Pay every salary in the batch, one after another.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bfb6e06d-f0b2-52b2-bb7b-412c3ffbc517",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d7c57ace-724b-50e0-b066-0cf275548ad2",
                    "name": "Each payment",
                    "variant": "ForEach",
                    "processingMode": "sequential",
                    "sourceCollection": {
                      "body": "request.payments",
                      "specificationLanguage": "OCL"
                    },
                    "elementVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The salary being paid.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "9efbc7f7-05ad-5936-b41a-70f0e04ae0d8",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "c2f12b8b-0e9d-5312-ace6-e8cdef292b67",
                      "name": "payment",
                      "invariances": [],
                      "dataType": "5f6abb6d-e827-5c77-aaec-cc5858c75c29",
                      "multiplicity": "1"
                    },
                    "activitySequence": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Pay this salary as one posting.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "6c560a7a-5fa8-5050-beee-7274df832876",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "e81265a0-52be-54a6-b094-ee2df25357da",
                          "name": "Post transfer",
                          "service": "2f7f6e45-7e52-542e-ba52-bfa3097ff066",
                          "instanceKind": "singleInstance",
                          "processingMode": "parallel",
                          "variant": "RequestService",
                          "requestConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How 'fromAccount' is populated for this request.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "54441847-efbd-50ef-84e1-12ad29c8d731",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "599d9351-5d8d-5c36-93a9-f9c6481d62af",
                              "name": "fromAccount",
                              "formalSpecification": {
                                "body": "providerRequest.fromAccount = request.fromAccount",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "RequestConstraint"
                            },
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How 'toAccount' is populated for this request.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "e13091f6-1dde-52a1-8085-70e8b3733b8a",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "dacb65ea-cc1d-5f0c-84d1-c42f413ad153",
                              "name": "toAccount",
                              "formalSpecification": {
                                "body": "providerRequest.toAccount = payment.toAccount",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "RequestConstraint"
                            },
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How 'amount' is populated for this request.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "e3a09f56-1254-5ae6-8b16-85b862304ce0",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "9619d34c-68f8-5eb6-8427-ce73296d2704",
                              "name": "amount",
                              "formalSpecification": {
                                "body": "providerRequest.amount = payment.amount",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "RequestConstraint"
                            }
                          ],
                          "defaultFlow": {
                            "activities": [],
                            "annotations": [],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "fb81f025-6ff7-583d-8867-4204af16cc31",
                            "name": "default",
                            "variant": "ActivitySequence"
                          },
                          "exceptionHandlers": [
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger names both accounts in one refusal; this service names each in its own.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "d68f0807-51ce-5925-b84a-6d3ea9ed79b5",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "11d0239c-2e7a-50c0-bd9c-7b32e91424ef",
                                  "name": "Which account is closed?",
                                  "variant": "AlternateFlows",
                                  "conditionalFlows": [
                                    {
                                      "activities": [
                                        {
                                          "annotations": [
                                            {
                                              "annotations": [],
                                              "body": "The payee's account was closed after the check: The ledger refused this salary; those already paid stay paid, and the batch is refused in this service's terms.",
                                              "formalizationOf": [],
                                              "formalizationSnapshots": [],
                                              "id": "e56b98b7-5f90-5e01-8cf8-a0eec6d56ea3",
                                              "language": "en",
                                              "markup": "text_plain",
                                              "name": "Description",
                                              "purpose": "shortDescription"
                                            }
                                          ],
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "deeb5d30-1b8d-528d-aeb7-65247ff0ab3b",
                                          "name": "Refuse: Payees are open accounts not met",
                                          "variant": "RaiseException",
                                          "exception": "1abb0035-53d7-5fca-87eb-00059c6447f5",
                                          "exceptionConstraints": []
                                        }
                                      ],
                                      "annotations": [
                                        {
                                          "annotations": [],
                                          "body": "Taken when the employer's account is open.",
                                          "formalizationOf": [],
                                          "formalizationSnapshots": [],
                                          "id": "c54fbef6-8f09-5c31-bad0-b191004983d8",
                                          "language": "en",
                                          "markup": "text_plain",
                                          "name": "Description",
                                          "purpose": "shortDescription"
                                        }
                                      ],
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "ccd1d50e-4b92-593c-b273-fb37be55231b",
                                      "name": "The employer's account is open",
                                      "variant": "ConditionalFlow",
                                      "formalSpecification": {
                                        "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.status = AccountStatus::open",
                                        "specificationLanguage": "OCL"
                                      }
                                    }
                                  ],
                                  "defaultFlow": {
                                    "activities": [
                                      {
                                        "annotations": [
                                          {
                                            "annotations": [],
                                            "body": "The employer's account was closed after the check: The ledger refused this salary; those already paid stay paid, and the batch is refused in this service's terms.",
                                            "formalizationOf": [],
                                            "formalizationSnapshots": [],
                                            "id": "8d4a047c-c90a-562f-8732-5183b14abc30",
                                            "language": "en",
                                            "markup": "text_plain",
                                            "name": "Description",
                                            "purpose": "shortDescription"
                                          }
                                        ],
                                        "formalizationOf": [],
                                        "formalizationSnapshots": [],
                                        "id": "404e5485-4ea2-5507-b33c-4be7092c7ca7",
                                        "name": "Refuse: Payer account is open not met",
                                        "variant": "RaiseException",
                                        "exception": "aca1779d-b641-5dab-8062-4de2c004de8a",
                                        "exceptionConstraints": []
                                      }
                                    ],
                                    "annotations": [],
                                    "formalizationOf": [],
                                    "formalizationSnapshots": [],
                                    "id": "8798f9ec-c17c-57b1-9e0d-49fa00cea01f",
                                    "name": "otherwise",
                                    "variant": "ActivitySequence"
                                  }
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Both accounts are open' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "a0e6f46f-9dfe-5c63-97e2-b75ff5dada52",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "115e7a8c-634f-5b21-8b96-5a2c8cb9cb6e",
                              "name": "handle Both accounts are open not met",
                              "variant": "ExceptionHandler",
                              "exception": "b5686694-5f77-5f26-9b24-7bfba2f15f2f"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this salary; those already paid stay paid, and the batch is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "78071edf-00ed-5088-91b5-ae0d13fc7a96",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "627c5230-201d-5b2f-b84f-511e007a2643",
                                  "name": "Refuse: Not paying itself not met",
                                  "variant": "RaiseException",
                                  "exception": "c10763d9-6e05-5cb6-ad13-2d6210c29050",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Different accounts' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "15ec4a76-59e8-5743-8e01-55e3305915f1",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "cc58e139-8f20-5a3b-93d6-53a0369eb70d",
                              "name": "handle Different accounts not met",
                              "variant": "ExceptionHandler",
                              "exception": "24c8a310-4adb-5aaf-9021-e60536a12922"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this salary; those already paid stay paid, and the batch is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "23e5fea6-b072-53da-bbf3-6f2f667c9136",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "42e4c1f0-2b63-55ff-8831-099fe3a90dca",
                                  "name": "Refuse: Amounts within the posting limit not met",
                                  "variant": "RaiseException",
                                  "exception": "64727d2a-9426-5caf-8e10-399c6fd11a8a",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Amount is positive' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "1a4e3d56-809b-53fb-9f0c-fabd8cb7f3ee",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "45125d77-cc04-5b4c-b1ec-db73e4bb7edc",
                              "name": "handle Amount is positive not met",
                              "variant": "ExceptionHandler",
                              "exception": "1e8e35be-562c-50b1-8089-3290e4fb9e7c"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this salary; those already paid stay paid, and the batch is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "95950302-963c-529e-b7e4-e0053dcbaab6",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "baf02168-06b3-5936-962c-b8388bb0a569",
                                  "name": "Refuse: Amounts within the posting limit not met",
                                  "variant": "RaiseException",
                                  "exception": "64727d2a-9426-5caf-8e10-399c6fd11a8a",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Within the posting limit' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "2d4d145e-8c5b-5bc1-874d-57b143cc6bda",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "69ee9294-9499-585c-8046-c4aeaee84058",
                              "name": "handle Within the posting limit not met",
                              "variant": "ExceptionHandler",
                              "exception": "a061974e-e841-597e-8b38-f674b1650542"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this salary; those already paid stay paid, and the batch is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "bbdee367-f528-5c78-99bd-37f96f0b12fa",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "a5029ac3-1642-57ae-a958-f43e9e170f4f",
                                  "name": "Refuse: Sufficient funds not met",
                                  "variant": "RaiseException",
                                  "exception": "f296e33a-0032-5593-b070-34a4f8d54608",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Sufficient funds' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "8362a25b-b772-5012-86ec-8db0eddff33f",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "4ca5da8c-ffe3-5b94-8047-d0fd11d9f24a",
                              "name": "handle Sufficient funds not met",
                              "variant": "ExceptionHandler",
                              "exception": "70b7fd41-0cec-599f-8dcf-e58ec354815e"
                            }
                          ],
                          "messageHandlers": []
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "009b7152-2706-51f0-96f9-d51085b81de1",
                      "name": "body",
                      "variant": "ActivitySequence"
                    },
                    "carriedVariables": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Look the employer's account up once all are paid.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "dd60a5e6-5c22-5cd2-9f20-f1e049ba04c8",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7d1493e4-0e88-50db-9d0d-e03383a6357c",
                    "name": "Retrieve account",
                    "service": "32fc8143-0e59-5f8f-a7c8-d196357d97aa",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "f3e4a86f-8206-5774-866d-84737c8db3a2",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "24d14200-57a5-5e7f-b1f1-2ddfac7eec10",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "providerRequest.accountNumber = request.fromAccount",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the employer's balance afterwards.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "5b9745e3-9fb2-555e-a073-159fd137f083",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "20457714-3595-5e94-8189-d42a12955e71",
                          "name": "Report the new balance",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's newBalance is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "10f0b17c-03a0-5dad-9e31-7c2ba94236fe",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "c9d7f3b0-f79b-549e-8183-c73eb49d0c67",
                              "name": "newBalance",
                              "formalSpecification": {
                                "body": "response.newBalance = found.account.balance",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "5f1e922b-6668-55d2-85e5-7da12d9b1710",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The employer's account has gone: it is not open either.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "7b1cbdaf-d2cf-579d-876b-bb1b1061a9e3",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "84358d82-2476-5036-9cbf-8db375caec01",
                            "name": "Refuse: Payer account is open not met",
                            "variant": "RaiseException",
                            "exception": "aca1779d-b641-5dab-8062-4de2c004de8a",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Retrieve account' refuses because 'Account exists' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "af0d6d14-8b8f-58a3-96fe-7eac8007b952",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "14103d9d-3c57-5f6d-bec9-be0694ad2517",
                        "name": "handle Account exists not met",
                        "variant": "ExceptionHandler",
                        "exception": "979918bb-fdf2-55af-b102-9efc5a4e9ac0"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The employer's account as it stands.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "498d2a6f-6bd2-5ea2-9f83-9e47b890078e",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "0c31c4b7-3187-5a28-b574-cc462d1c9920",
                      "name": "found",
                      "invariances": [],
                      "dataType": "539f368b-3983-5986-82ba-70b12526d204",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Each payment' is the step that discharges 'Payees credited'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "03781bbd-b3b1-5031-a6a3-924137c29e97",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9dd90e98-d113-51e7-a819-191653223d6d",
                    "name": "Payees credited ← Each payment",
                    "toAddress": "d2d87788-0cbf-5c18-9321-923e576712e2",
                    "addressedBy": "d7c57ace-724b-50e0-b066-0cf275548ad2"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Each payment' is the step that discharges 'Payer debited by the total'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c5518d8a-25e3-5e5a-a532-d50fe6e003db",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "cc1e60cb-7f8d-5585-992b-38654535d364",
                    "name": "Payer debited by the total ← Each payment",
                    "toAddress": "0384cbff-ea71-513b-8562-038926fe1edd",
                    "addressedBy": "d7c57ace-724b-50e0-b066-0cf275548ad2"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Report the new balance' is the step that discharges 'New balance reported'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9007cd24-c6ac-501f-91eb-5e487cc1fe85",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "eacb61f2-e951-567c-a41f-4ad843107262",
                    "name": "New balance reported ← Report the new balance",
                    "toAddress": "8afdbb5b-5695-5dc3-9d6d-5e01055c3970",
                    "addressedBy": "20457714-3595-5e94-8189-d42a12955e71"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "df5a6fec-29f6-5ea8-9049-8ef206266203-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Posts the amount in tranches of at most the posting limit, while anything remains.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "284a7d81-49bd-50c0-a61d-438da84e6f61",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "**While.** The loop carries what remains to be paid: it starts at the whole amount, and each time round a tranche — the posting limit, or what remains if that is less — is posted and taken off. The loop goes round **while** something remains.\n\nIt states an iteration bound of 1000, which is what *Within the large-transfer limit* guarantees is enough. A loop with no bound is reported, because nothing then says it ends.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "63f6300d-14a5-5c62-b49a-b11aa478f43a",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "abcf6bce-67cf-5f64-86d0-602e7c72541a",
                "name": "Transfer large amount",
                "serviceContract": "8e52e684-192a-568b-a799-3ef63b7ff1b2",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Amount is positive' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "24d54522-0bbc-5dc2-b30e-e92a5fdab9df",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "aae02f28-9344-5f31-aca7-c6f0b7478e3d",
                    "name": "Amount is positive",
                    "preCondition": "cea8c094-b119-53d5-b524-af4cd7334745",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Within the large-transfer limit' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bdb23044-d72c-590a-84dc-840a90615276",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f82d135a-5bea-5f87-950a-06c269787738",
                    "name": "Within the large-transfer limit",
                    "preCondition": "91122703-a786-56ff-93dc-3b4eeb6d8084",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Different accounts' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8206088c-415d-5f3d-ab60-33a992893b09",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "12aecb91-3ae5-5e70-bd74-5eff62a8a988",
                    "name": "Different accounts",
                    "preCondition": "d4799039-72a6-5b8d-aecd-868fd90a1ca0",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Both accounts are open' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "67b0f3b9-6214-5a39-84cf-f559baef5291",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0f488410-7e63-5747-bf37-9e44e4b34ec0",
                    "name": "Both accounts are open",
                    "preCondition": "0e18cbc2-2bff-5690-8ff3-7c37ac7ad1df",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Requested by the holder' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e8810399-90eb-555e-902f-78055f4f6a43",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "20461855-3ede-568d-b8fd-692010529743",
                    "name": "Requested by the holder",
                    "preCondition": "4d8ec968-d5c6-572b-9c6c-e8b346c214ce",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Sufficient funds' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "cd81c472-089f-58b3-bbfd-60a699ebce8a",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "38140163-a3d3-5aaf-87b1-f415c84eaa4c",
                    "name": "Sufficient funds",
                    "preCondition": "cd7d788c-7465-52b7-867f-f45abd3fd6e5",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Post a tranche at a time while anything remains to be paid.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "fa3cad6a-c464-5d58-aa3d-f8cbf43b7449",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "627a6555-a7dc-5477-bca0-82cdb6b60a20",
                    "name": "Until all is paid",
                    "variant": "While",
                    "continueWhile": {
                      "body": "remaining > 0",
                      "specificationLanguage": "OCL"
                    },
                    "testBefore": true,
                    "carriedVariables": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is still to be paid.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "d83debb2-bbc3-5293-923b-4d0c307c3b9f",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "32b61b90-57ba-5db9-b405-3ab9e218743d",
                        "name": "remaining",
                        "invariances": [],
                        "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                        "multiplicity": "1",
                        "initialiser": {
                          "body": "request.amount",
                          "specificationLanguage": "OCL"
                        },
                        "next": {
                          "body": "remaining - tranche",
                          "specificationLanguage": "OCL"
                        }
                      }
                    ],
                    "activitySequence": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "This time round's tranche: the posting limit, or what remains if less.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "2826e746-4a2a-52c4-99cf-0d4fe1286d07",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "32c6bd59-6ab4-5d1f-9fee-7b94e8fd8f01",
                          "name": "tranche",
                          "variant": "DefineVariable",
                          "variable": {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "This time round's tranche: the posting limit, or what remains if less.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "3073fb63-c2c6-523d-8368-3fd795fbe8ee",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "33222e5c-93f9-50eb-95a2-1d0466ef798b",
                            "name": "tranche",
                            "invariances": [],
                            "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                            "multiplicity": "1"
                          },
                          "initialiser": {
                            "body": "if remaining > 50000 then 50000 else remaining endif",
                            "specificationLanguage": "OCL"
                          }
                        },
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Move this tranche as one posting.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "51164ec3-08c0-5269-9a18-87b3c118840d",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0891ea26-c276-5751-8d18-dc12e00f0513",
                          "name": "Post transfer",
                          "service": "2f7f6e45-7e52-542e-ba52-bfa3097ff066",
                          "instanceKind": "singleInstance",
                          "processingMode": "parallel",
                          "variant": "RequestService",
                          "requestConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How 'fromAccount' is populated for this request.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "4dda98c0-523e-5f31-a883-96487e856b15",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "f2800ab6-9bd5-56d3-bd6f-99e7430fcbfd",
                              "name": "fromAccount",
                              "formalSpecification": {
                                "body": "providerRequest.fromAccount = request.fromAccount",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "RequestConstraint"
                            },
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How 'toAccount' is populated for this request.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "9efa015c-86a2-5173-9b48-68fb87293af4",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "6c61963f-0a5a-51b9-9b2e-e2ada113ba38",
                              "name": "toAccount",
                              "formalSpecification": {
                                "body": "providerRequest.toAccount = request.toAccount",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "RequestConstraint"
                            },
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How 'amount' is populated for this request.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "c5e3e332-e1a9-57a8-91ce-969df4301b6e",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "1ffe738b-1083-5d97-adf2-2a185db0515a",
                              "name": "amount",
                              "formalSpecification": {
                                "body": "providerRequest.amount = tranche",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "RequestConstraint"
                            }
                          ],
                          "defaultFlow": {
                            "activities": [],
                            "annotations": [],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "e9d3313c-35e0-534f-a79e-1af2295e8529",
                            "name": "default",
                            "variant": "ActivitySequence"
                          },
                          "exceptionHandlers": [
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this tranche; those already posted stay posted, and the transfer is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "69aaab97-4e66-5bd0-b333-f1a9362c6ed6",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "a35da82b-5cbc-5b44-9669-e79482c0590b",
                                  "name": "Refuse: Both accounts are open not met",
                                  "variant": "RaiseException",
                                  "exception": "6fee2dfc-4a41-5e71-b7bf-e26a8fe6d14c",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Both accounts are open' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "cd8c99b1-f394-5706-8432-fcdda933c54f",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "bc63dcca-9989-5e17-ab85-9cd28cac6067",
                              "name": "handle Both accounts are open not met",
                              "variant": "ExceptionHandler",
                              "exception": "b5686694-5f77-5f26-9b24-7bfba2f15f2f"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this tranche; those already posted stay posted, and the transfer is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "94cd91af-feaf-5b3b-bafc-6cb90d25334d",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "3a549e99-f242-5b4c-aa22-e7c2879924eb",
                                  "name": "Refuse: Different accounts not met",
                                  "variant": "RaiseException",
                                  "exception": "311b152c-c6f0-56f5-b043-84270b37621a",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Different accounts' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "780d7788-4511-531b-a5f5-16a7fae36a34",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "509462da-cc60-50f3-ad34-ea6f83cc77ec",
                              "name": "handle Different accounts not met",
                              "variant": "ExceptionHandler",
                              "exception": "24c8a310-4adb-5aaf-9021-e60536a12922"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this tranche; those already posted stay posted, and the transfer is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "21e76189-2eaa-5930-a0b9-2b908f7ab9cb",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "a234b392-d0ac-5383-9820-ea3f5ea9fbcb",
                                  "name": "Refuse: Amount is positive not met",
                                  "variant": "RaiseException",
                                  "exception": "688e2acf-fcee-5bca-98c3-cb7a4fd8518b",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Amount is positive' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "76de676f-f4a5-5e23-82a3-4ccf512ac37a",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "0d151003-a6b9-5ca0-afd6-b7431102e03b",
                              "name": "handle Amount is positive not met",
                              "variant": "ExceptionHandler",
                              "exception": "1e8e35be-562c-50b1-8089-3290e4fb9e7c"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger would not post a tranche this size, so the amount cannot be moved in tranches: The ledger refused this tranche; those already posted stay posted, and the transfer is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "22c44761-9c7b-5607-8b92-467cb7423643",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "efd44741-0590-5381-996f-fd0a73bc7cde",
                                  "name": "Refuse: Within the large-transfer limit not met",
                                  "variant": "RaiseException",
                                  "exception": "218dd6d1-109f-519f-9297-07f9ae750b9c",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Within the posting limit' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "cbc3513f-97ee-5cf0-a2f1-32f326ed5754",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "0361b8e4-7156-5323-b542-7dfde2abf88f",
                              "name": "handle Within the posting limit not met",
                              "variant": "ExceptionHandler",
                              "exception": "a061974e-e841-597e-8b38-f674b1650542"
                            },
                            {
                              "activities": [
                                {
                                  "annotations": [
                                    {
                                      "annotations": [],
                                      "body": "The ledger refused this tranche; those already posted stay posted, and the transfer is refused in this service's terms.",
                                      "formalizationOf": [],
                                      "formalizationSnapshots": [],
                                      "id": "a2601f3e-b8a0-5442-bb8f-043fcaf6ea8e",
                                      "language": "en",
                                      "markup": "text_plain",
                                      "name": "Description",
                                      "purpose": "shortDescription"
                                    }
                                  ],
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "22b4797a-658e-5af8-8f50-d0c6dac069a4",
                                  "name": "Refuse: Sufficient funds not met",
                                  "variant": "RaiseException",
                                  "exception": "7aab9d9f-0269-5d4f-add8-a8d64c694d97",
                                  "exceptionConstraints": []
                                }
                              ],
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "What is done when 'Post transfer' refuses because 'Sufficient funds' does not hold.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "78e4c072-f9c7-5f69-ad64-fad93b744d14",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "af49d899-3311-5280-8bb6-6b9b3458a83e",
                              "name": "handle Sufficient funds not met",
                              "variant": "ExceptionHandler",
                              "exception": "70b7fd41-0cec-599f-8dcf-e58ec354815e"
                            }
                          ],
                          "messageHandlers": []
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1b3d76b0-8e5b-5260-b99c-ef0bc10c0fd4",
                      "name": "body",
                      "variant": "ActivitySequence"
                    },
                    "maxIterations": 1000
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Look the paying account up once all is paid.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a2b2661a-eeb3-54df-8ef9-f622bdbd8eda",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "572ddbc1-2695-519e-9d4e-eb08d6ecdfd5",
                    "name": "Retrieve account",
                    "service": "32fc8143-0e59-5f8f-a7c8-d196357d97aa",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "aae9cd34-e5bc-5aaf-801e-d293a92ec956",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d76e6c62-a2fe-52c6-aabb-2312af04d8c0",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "providerRequest.accountNumber = request.fromAccount",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the paying account's new balance.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "a86f18f3-edda-51ab-b2bc-80ff1efc4c98",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "8e4e89a0-0e39-5827-9d42-b4d1680037a2",
                          "name": "Report the new balance",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's newBalance is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "de0a37a2-ad8b-5608-8a26-e2e97f8ec907",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "5db19226-eb6c-564b-837b-49dda1680ab4",
                              "name": "newBalance",
                              "formalSpecification": {
                                "body": "response.newBalance = found.account.balance",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "a2c9620f-bd1e-57c6-8a66-ff03026175e4",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The paying account has gone: it is not open either.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "eb0f9213-f15c-5bae-9e12-63af0b160957",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "b6260aa0-e27d-5f8e-b157-c3d5de0f1057",
                            "name": "Refuse: Both accounts are open not met",
                            "variant": "RaiseException",
                            "exception": "6fee2dfc-4a41-5e71-b7bf-e26a8fe6d14c",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Retrieve account' refuses because 'Account exists' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "6295a7f8-dce3-5df7-a3ce-6bb99fe25c64",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9dcada18-1d92-5b7e-9698-a570286ee9af",
                        "name": "handle Account exists not met",
                        "variant": "ExceptionHandler",
                        "exception": "979918bb-fdf2-55af-b102-9efc5a4e9ac0"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The paying account as it stands.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "1f4aa475-5cfd-574a-972e-f822a7115cbc",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "3946be7c-1b39-55e5-9c76-396bc262ae61",
                      "name": "found",
                      "invariances": [],
                      "dataType": "539f368b-3983-5986-82ba-70b12526d204",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Until all is paid' is the step that discharges 'Funds moved'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3564cd0d-89fd-5ad6-bc7e-e8bfc944944d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f9bc6cd9-3015-5a01-a0ea-cc5974152af7",
                    "name": "Funds moved ← Until all is paid",
                    "toAddress": "36bd40bc-59f7-5487-b3a8-6c951561f1a7",
                    "addressedBy": "627a6555-a7dc-5477-bca0-82cdb6b60a20"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Until all is paid' is the step that discharges 'Money is conserved'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1aa6553a-f8e7-5bb0-977d-5f88e375d8d9",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "2db7d709-91db-55f7-bbd9-ce092aced83f",
                    "name": "Money is conserved ← Until all is paid",
                    "toAddress": "f4f2eb57-76eb-5abf-adf0-173da7cb0aad",
                    "addressedBy": "627a6555-a7dc-5477-bca0-82cdb6b60a20"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Report the new balance' is the step that discharges 'New balance reported'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9ed99c56-8105-5644-b743-b1ff3566e155",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8890de40-43a5-540a-9dca-89cb12ced1ce",
                    "name": "New balance reported ← Report the new balance",
                    "toAddress": "8a84e5a9-c654-5da8-9155-29d47576660e",
                    "addressedBy": "8e4e89a0-0e39-5827-9d42-b4d1680037a2"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "abcf6bce-67cf-5f64-86d0-602e7c72541a-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Looks the account up and reports its balance.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3a621723-ebac-5a0b-b6a5-d3317f8d81c4",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A function's process may only be orchestrated across functions — which *Retrieve account* is.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "54ebbdfd-639a-5157-8c34-f81d328833cf",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "473a2499-e4bc-5015-997e-b0693d42c00d",
                "name": "Get balance",
                "serviceContract": "87dc5357-051a-5d05-acf3-c7409c1e571e",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Account exists' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "abc9bf23-6a49-5495-84ee-72addf922451",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d8767b09-c9be-53ce-838e-f03801598f50",
                    "name": "Account exists",
                    "preCondition": "c9c178a2-30a2-5bf3-bef7-a6644256b090",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Look the account up.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2b245d97-4c19-5b03-a7ee-d5a18a6dfc50",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d7dec329-1479-5dd3-8c40-ff51c5f14fb8",
                    "name": "Retrieve account",
                    "service": "32fc8143-0e59-5f8f-a7c8-d196357d97aa",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "244bf687-2b66-5f09-b240-5e38941680c0",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "4f486ccc-99fc-5c3a-87fb-ec883dd8f9aa",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "providerRequest.accountNumber = request.accountNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "Return the account's balance.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "8fb6e90f-d115-50ae-be21-69abd0efddd6",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "1a3cf182-d220-5a8c-aedf-c09d777db6d5",
                          "name": "Report the balance",
                          "variant": "PopulateResponse",
                          "responseConstraints": [
                            {
                              "annotations": [
                                {
                                  "annotations": [],
                                  "body": "How the response's balance is populated.",
                                  "formalizationOf": [],
                                  "formalizationSnapshots": [],
                                  "id": "e9125e75-d70d-54d1-9a61-862cf457958a",
                                  "language": "en",
                                  "markup": "text_plain",
                                  "name": "Description",
                                  "purpose": "shortDescription"
                                }
                              ],
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "f2b673e2-1921-516b-8d18-16f1fadc07c5",
                              "name": "balance",
                              "formalSpecification": {
                                "body": "response.balance = found.account.balance",
                                "specificationLanguage": "OCL"
                              },
                              "variant": "ResponseConstraint"
                            }
                          ]
                        }
                      ],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "2151c566-95bd-5be7-a1df-33e2ab93d160",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The account went after the check: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "9966b3b5-7bf9-5d5a-9da6-0c45299ad87c",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "48369fe1-225d-5b30-abc8-069dab4f88c2",
                            "name": "Refuse: Account exists not met",
                            "variant": "RaiseException",
                            "exception": "1ada446c-3982-5dab-8804-8f4367b94520",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Retrieve account' refuses because 'Account exists' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "ad32d880-4c3b-50cb-bf6d-3bbd945353f6",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c67fd4fc-e9ba-50f8-b4d1-db9988a508fb",
                        "name": "handle Account exists not met",
                        "variant": "ExceptionHandler",
                        "exception": "979918bb-fdf2-55af-b102-9efc5a4e9ac0"
                      }
                    ],
                    "messageHandlers": [],
                    "responseVariable": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account as it stands.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b30c3dc7-b6b8-5340-847f-923d37dbbf2e",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "57e54328-ea07-5a92-ab8c-589c04f2c135",
                      "name": "found",
                      "invariances": [],
                      "dataType": "539f368b-3983-5986-82ba-70b12526d204",
                      "multiplicity": "1"
                    }
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Report the balance' is the step that discharges 'Balance reported'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "20106ad7-f8f6-580a-ac23-2194df21c65e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "fdc5770f-958b-5ea6-80d2-1279a6843db6",
                    "name": "Balance reported ← Report the balance",
                    "toAddress": "9a1da814-ea9a-5fd4-9aba-2db11fa47356",
                    "addressedBy": "1a3cf182-d220-5a8c-aedf-c09d777db6d5"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "473a2499-e4bc-5015-997e-b0693d42c00d-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Closes the account record, then advises the holder.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a1a4bf6e-4807-5000-9936-ff43ed315d08",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "95db523a-5028-5619-9f1c-b3fa093924d4",
                "name": "Close account",
                "serviceContract": "59fb64c1-2d28-51f3-834d-e0714aab52e9",
                "activities": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Account is open' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d4214a72-e40a-572c-9820-812b73a83ba4",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3d1f3701-287a-5795-9d58-dd38a49f47ad",
                    "name": "Account is open",
                    "preCondition": "caa3e04d-8adb-5413-b00b-5113460a8463",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Requested by the holder' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "17e151f3-0ac1-5439-975b-3b5d6829dce5",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ae5555b4-be3b-585a-95bb-7ec8dab4ec7e",
                    "name": "Requested by the holder",
                    "preCondition": "0e298ebf-1cc3-5193-a724-5282ff6ab222",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Refuse unless 'Account is empty' holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5d56998b-0410-51ed-8b3c-ed806b8a3055",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "fe1aa27d-03d5-568f-af10-e09b024eb4b8",
                    "name": "Account is empty",
                    "preCondition": "6a1f7f9d-c85d-5cba-b5e6-724d9e8078c1",
                    "variant": "CheckPreCondition"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Mark the account closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "76d1ee94-5e53-5084-9765-dec10f21a608",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c004dc60-3d8f-5c61-b115-248ae2c3c0e4",
                    "name": "Close account record",
                    "service": "fecbca21-9c41-5bfc-b7a9-d8bed0d2a8d8",
                    "instanceKind": "singleInstance",
                    "processingMode": "parallel",
                    "variant": "RequestService",
                    "requestConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "How 'accountNumber' is populated for this request.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "8baac69c-54cb-5e26-b378-9c1a0e66c039",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e35b9d14-b491-56ee-bc6d-ad60c1cff943",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "providerRequest.accountNumber = request.accountNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "RequestConstraint"
                      }
                    ],
                    "defaultFlow": {
                      "activities": [],
                      "annotations": [],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "31d4dbd2-2738-5791-83d4-a44b0a51d133",
                      "name": "default",
                      "variant": "ActivitySequence"
                    },
                    "exceptionHandlers": [
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "The account was closed after the check: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "2989c04d-a757-513c-a887-d80ee353935b",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "caa53988-f488-53b8-aa36-a597163b9f89",
                            "name": "Refuse: Account is open not met",
                            "variant": "RaiseException",
                            "exception": "8ee00221-5392-570f-a829-09b3e03708c0",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Close account record' refuses because 'Account is open' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "a234ac55-044f-5d6c-8f06-9563349c34d1",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "aaa395f4-2cae-55a2-96ae-e5870b6def7f",
                        "name": "handle Account is open not met",
                        "variant": "ExceptionHandler",
                        "exception": "9fe55256-07e6-52a1-9eb1-18c6918a5274"
                      },
                      {
                        "activities": [
                          {
                            "annotations": [
                              {
                                "annotations": [],
                                "body": "Money arrived after the check: refuse in this service's terms.",
                                "formalizationOf": [],
                                "formalizationSnapshots": [],
                                "id": "a3f3df6a-d5ed-5836-8f81-21ef8a14d889",
                                "language": "en",
                                "markup": "text_plain",
                                "name": "Description",
                                "purpose": "shortDescription"
                              }
                            ],
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "e96a0657-99bb-50bd-a3c9-1fea27e8bf6e",
                            "name": "Refuse: Account is empty not met",
                            "variant": "RaiseException",
                            "exception": "2c9ec923-3393-56a0-9cee-8a0debb78a71",
                            "exceptionConstraints": []
                          }
                        ],
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What is done when 'Close account record' refuses because 'Account is empty' does not hold.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "79b0c83e-458d-53d8-b811-70ce7c83bd2c",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ddc2760b-d5a9-5632-a7ec-4e17dd64d6f2",
                        "name": "handle Account is empty not met",
                        "variant": "ExceptionHandler",
                        "exception": "d327347c-bbc3-561d-bcfd-5646b9442509"
                      }
                    ],
                    "messageHandlers": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Tell the holder the account is closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "eb350085-274e-5fd2-9d91-1c5f0d5ca541",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "81d6c967-a5b6-55e8-a0b1-bab656a769f6",
                    "name": "Send AccountAdvice",
                    "variant": "SendMessage",
                    "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                    "distribution": "notification",
                    "messageConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What the message's accountNumber is.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "2a961d33-c52a-5517-b1df-34577c089871",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5fff62d7-5193-541f-90af-8b22a99b0cf5",
                        "name": "accountNumber",
                        "formalSpecification": {
                          "body": "sent.accountNumber = request.accountNumber",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "MessageConstraint"
                      },
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What the message's notice is.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "bb298531-4f41-503c-8f44-bb93806fe003",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "f4547976-fda3-5ceb-82c5-0829bca4c0d7",
                        "name": "notice",
                        "formalSpecification": {
                          "body": "sent.notice = 'Your account is closed.'",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "MessageConstraint"
                      }
                    ],
                    "recipient": "da52fff1-738b-57ed-a694-218d358d17b8",
                    "recipientSelector": "request.accountNumber"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Answer that the account is closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "61635cbb-4fec-5ff3-b92e-bf531454bbf8",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d05f95fa-84a0-58bf-bcf6-f478726fea84",
                    "name": "Confirm the closure",
                    "variant": "PopulateResponse",
                    "responseConstraints": []
                  }
                ],
                "requirementAllocations": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Close account record' is the step that discharges 'Account closed'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "251e4468-9df3-5fb2-a4b9-ac484a8327e0",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9309a1ca-3e1e-5e68-9ce4-25a6620baa44",
                    "name": "Account closed ← Close account record",
                    "toAddress": "aa2189f9-4eee-511c-8609-1a52f91758e0",
                    "addressedBy": "c004dc60-3d8f-5c61-b115-248ae2c3c0e4"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "'Send AccountAdvice' is the step that discharges 'Holder advised'.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e15509eb-e88c-5310-b851-ffe582c54e52",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7c4d1c72-796b-5b5a-bdf3-e334986a0b37",
                    "name": "Holder advised ← Send AccountAdvice",
                    "toAddress": "3e49a2ce-91fe-56f9-92c0-72c6d79281cc",
                    "addressedBy": "81d6c967-a5b6-55e8-a0b1-bab656a769f6"
                  }
                ],
                "unplacedActivities": {
                  "activities": [],
                  "annotations": [],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "95db523a-5028-5619-9f1c-b3fa093924d4-unplaced",
                  "name": "unplaced",
                  "variant": "ActivitySequence"
                },
                "variant": "Process"
              }
            ],
            "responsibilityDomains": [],
            "serviceContracts": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "A person becomes a customer of the bank.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "133bb214-a8f1-52b5-8cf1-6e57b52be6f3",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "The login the customer registers with is not in the request: it is `caller`, the identity that asked. The post-condition says so, which is how a model ties a login identity to a business entity.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "470fa4c1-022a-5102-8f17-984cf361c5cd",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "6dec6376-d9f8-57eb-b8cc-93166e8ef491",
                "name": "Register as customer",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Register as customer'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "909851b8-944d-5597-a998-1dce404e3ad0",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "b03150e3-9b15-5d27-a282-3897a016fb34",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The person's name.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b3b81e37-e223-51b4-91f6-6b123a193d71",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "187bf50e-bb51-58fe-9d0b-ae76ada43c33",
                      "name": "name",
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The number on their identity document.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "656383fc-b570-56b5-93a9-e4e632a87ab9",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "20e4e875-7267-5380-941e-80afd45e1858",
                      "name": "identityNumber",
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Register as customer' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "13b49fab-5ede-5646-828f-bbe2093dfff5",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "8c7bae22-0606-51be-ac32-3ebd323cc369",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Their new customer number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "4fd22cb3-fedb-549a-87bf-35f2e8bf6e60",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "fe090bda-fb92-5b02-a64d-65071992f853",
                      "name": "customerNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Each person is registered once.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "45b143cb-c9d1-5089-8689-f2b8365b6bbd",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "Asked of *Customer Register*, which keeps the customers, through its generated `findCustomerByIdentityNumber`.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3f95213a-6f8f-5898-bba9-07cf3631ddf8",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "06cb86b1-b803-54c7-8800-8d70cc3d470e",
                    "name": "Identity not yet registered",
                    "formalSpecification": {
                      "body": "findCustomerByIdentityNumber(Tuple{identityNumber = request.identityNumber}) = null",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Register as customer' is requested while 'Identity not yet registered' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a0c2a800-b240-5040-99a4-6113e6bfd55b",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "88c03e16-2a76-50fd-86f5-3e5a7bc6cb55",
                      "name": "Identity not yet registered not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The person is a customer, under the login they asked with.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a36aae23-2746-523b-8e0b-016a96428107",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9e437801-8792-5049-b022-b5ff1df03109",
                    "name": "Customer registered",
                    "formalSpecification": {
                      "body": "Customer.allInstances()->exists(c | c.customerNumber = response.customerNumber and c.name = request.name and c.login = caller)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "A customer opens a new account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7024e1d4-4edd-53a0-8604-240bc2f3624c",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "811d4abc-8d99-5779-ab37-54d321a69dbc",
                "name": "Open account",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Open account'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "147ba2ea-12af-5059-b7d7-e2af6b4b6b80",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "9bf01942-2d6a-549f-8d77-5bedb4e0bfdf",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The customer opening it.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "4da63bc3-46df-5b3b-9c34-988519f2386d",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "c958dd11-626e-5a8c-ab3e-f5868aa676f2",
                      "name": "customerNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Current or savings.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "ca3bffcd-cbe0-54a3-9273-e7d7ecd4df96",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f52952db-392b-528a-bc8a-3650aa954139",
                      "name": "accountType",
                      "dataType": "dafbd62c-6a4b-5e99-8589-053569be0f64",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Open account' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e0e4c29e-447a-539f-90af-34f17ba1d843",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "c6dc9467-ebdc-529d-811f-267ed4b71118",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The new account's number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "2d9e86b8-76b7-5f81-b6a9-25f3539b9e8c",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "8dca536e-ffa4-5f57-ac0c-39e4d307b371",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a customer can open an account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9d9bf464-7413-5519-a056-aca1d581c3ee",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5b0ee8cb-1083-56bb-9965-a8db7b19c2ca",
                    "name": "Customer is registered",
                    "formalSpecification": {
                      "body": "getCustomer(Tuple{customerNumber = request.customerNumber}) <> null",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Open account' is requested while 'Customer is registered' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "94ad28bd-2c9e-5154-bdea-8bc323214548",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "dcbe869a-8f7f-536d-986c-b8ee5467ed83",
                      "name": "Customer is registered not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An open, empty account of that type now exists for the customer.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "53a6dd68-b9ec-5723-b053-a83693ba4b06",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "09187624-e765-52d2-a106-c583bb44476c",
                    "name": "Account opened",
                    "formalSpecification": {
                      "body": "Account.allInstances()->exists(a | a.accountNumber = response.accountNumber and a.holder = request.customerNumber and a.accountType = request.accountType and a.balance = 0 and a.status = AccountStatus::open)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer is told the account is open.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "90bf1b6b-6b20-5b35-b50e-311c02bbb0cc",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "An AccountAdvice for the new account is sent to the customer.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b3932c50-8bc4-5cc1-b687-a5c9a88f635e-formalSpecification-prose",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "formalSpecification (informal)",
                        "purpose": "informalRequirement"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "b3932c50-8bc4-5cc1-b687-a5c9a88f635e",
                    "name": "Holder advised",
                    "messageSendEvents": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "Tells the customer their new account is open.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "2ef591df-9bcd-58b4-b025-5d8be29b53a7",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9bb9c826-0e8f-5a5e-9ac5-7273a84cb2cd",
                        "name": "AccountAdvice sent",
                        "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                        "distribution": "notification",
                        "isEvent": true,
                        "variant": "MessageSendEvent",
                        "recipient": "da52fff1-738b-57ed-a694-218d358d17b8"
                      }
                    ],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Cash is paid into an account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "97f0f1cc-dbc8-5522-850d-0a3c70141da0",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "Anyone may pay into an account, so — unlike a withdrawal — nothing here asks who the caller is.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c1339684-8adb-5c6d-9aef-2881180cea97",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "3d431e6a-406e-58bc-95cf-f5137154c153",
                "name": "Deposit cash",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Deposit cash'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "122fb2fe-c3d1-5eb9-8473-52e888b2e3af",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "01217551-957b-57ae-92a2-850a6d3d6efb",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account paid into.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a41325e8-b404-5f78-8afc-c73b811152dd",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "08d20dbf-a31f-5127-86b8-fe5783da0fd3",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "9eee8e90-7b4d-5fe6-80c0-465de4c730e9",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e45fe0d3-26bd-5821-9814-05e009093f1b",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Deposit cash' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d9a46900-371f-5fd7-8f39-e2ba3ab5b3ea",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "6342abd2-f42d-55f4-b8ab-dd6b58ba7c47",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The balance after the deposit.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a3741688-e897-5aea-8391-65ed85fde321",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d1116c11-4a03-5ad6-854a-54ff467519fb",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is deposited.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ebc8d034-2827-5257-befd-a9cb48635c4c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ffc2687e-5078-5e4d-835c-4bea9bf5f650",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Deposit cash' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "59a0b142-eb45-5d8a-907b-a3ab98d23c47",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "57867959-c0d2-5342-b989-0ef870399115",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only an open account is paid into.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5e031f57-43d4-5b21-aba2-5bda548a3519",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "43d316a2-f5bc-522d-802d-47d2ff0a300d",
                    "name": "Account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Deposit cash' is requested while 'Account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "bb18e196-1a5e-5ebf-9ade-116dcce6ffe8",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "905b13e5-1730-5109-894f-6bb4ad21f960",
                      "name": "Account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The balance went up by exactly the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "21ed9c0a-2e2e-5b07-a469-27949774fe65",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c0b14fd5-babd-5757-889b-11e68c5e2497",
                    "name": "Balance increased",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | a.balance = a.balance@pre + request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the balance after the deposit.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "450d13b7-a75f-528e-b8eb-84646689da52",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8d59f222-6bfb-5071-8bec-90c972cbad36",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The holder takes cash out of their account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "730e90fc-1bba-507c-88a1-4ec7301ed5bf",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "2434a418-f1be-535d-a990-ab254229e747",
                "name": "Withdraw cash",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Withdraw cash'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "ea5c1eca-5cc3-57bb-82e7-9e8a8d1e7b07",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "c8606076-4000-5743-ad85-024b3accbd5d",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account withdrawn from.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "8ad7c822-45fc-5a8a-a9af-d933481d1984",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f33463c0-7a0e-5497-9c88-4b2dad32240a",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "608af503-302d-5bef-b59e-941621c1847a",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e670f4db-8534-540e-aa5b-397fa2ad720c",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Withdraw cash' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "3cc8cb8c-9fc3-5da7-aefd-fa01fd9e80b8",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e8b459e7-28d6-5596-a59d-b5e23728d0f9",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The balance after the withdrawal.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "65469844-bb1d-5bf9-9fbb-b0472bc9c21f",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "89c3ba47-3ed3-555b-bf10-451a6811f760",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is withdrawn.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9db2c60e-ce22-57ae-98a7-86be2db00c64",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "84962f18-91e7-5a3d-b435-e6d4a2e1f424",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Withdraw cash' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0341df24-5831-5b4a-a5fe-576c7efc4812",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "5b03abec-cb1d-51d8-873b-76a3606cd043",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only an open account is withdrawn from.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5ca6879e-f12d-5d52-aa28-c9c9bff22a9d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "739affb4-c838-55b4-bb43-b745d5be44c0",
                    "name": "Account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Withdraw cash' is requested while 'Account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "1f2a6dcd-5094-52bb-a0d9-d1ec13794fe4",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "2b6e54b9-b747-5685-a1b7-6d3a93a87396",
                      "name": "Account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only the account's holder may take money out of it.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "87bdd3dd-a4d4-5009-b2f4-62eea222dc98",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "`caller` is the login identity that asked; the customer record says whose login it is. A security requirement stated as an ordinary pre-condition.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ef6f6918-72e9-5793-8e5c-042e403dec8c",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "75535ba9-fe57-5bb6-bd6c-340fd2026405",
                    "name": "Requested by the holder",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and (let c = findCustomerByLogin(Tuple{login = caller}) in c <> null and a.holder = c.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Withdraw cash' is requested while 'Requested by the holder' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "7119c7a3-2e8e-5160-9058-75f5337bc044",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1cf9e28e-afa4-5f1a-979b-61554e982d94",
                      "name": "Requested by the holder not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account holds at least the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "97f335db-5703-538d-ab86-4a9c4c77cc64",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "**An exception that carries a value.** Refused, the customer is told by how much the account falls short: the exception has a field, `shortfall`, and the condition states it for the refusal it raises.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "087f1178-093c-57e5-b9a2-040a6b0b0d81",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f459abbd-7df5-5ed2-ba88-e753ab5a48a2",
                    "name": "Sufficient funds",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.balance >= request.amount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Withdraw cash' is requested while 'Sufficient funds' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a5e37d63-93cb-501a-9488-6d724b15e98f",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e40d09f5-789a-503e-971e-4890abde432d",
                      "name": "Sufficient funds not met",
                      "abstract": false,
                      "fields": [
                        {
                          "annotations": [
                            {
                              "annotations": [],
                              "body": "How much more the withdrawal needs than the account holds.",
                              "formalizationOf": [],
                              "formalizationSnapshots": [],
                              "id": "bea81b34-56e5-5bb5-b737-763ebddffa4a",
                              "language": "en",
                              "markup": "text_plain",
                              "name": "Description",
                              "purpose": "shortDescription"
                            }
                          ],
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "84647a30-d14a-5652-9ce6-08d55e22cc34",
                          "name": "shortfall",
                          "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                          "invariances": [],
                          "multiplicity": "1",
                          "relationship": "composition"
                        }
                      ],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "What the exception's shortfall is.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "d694c4d6-bafc-51fa-ad0d-92221e361682",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3403db98-fd3e-5ce8-b277-9da2889c941e",
                        "name": "shortfall",
                        "formalSpecification": {
                          "body": "raised.shortfall = request.amount - getAccount(Tuple{accountNumber = request.accountNumber}).balance",
                          "specificationLanguage": "OCL"
                        },
                        "variant": "ExceptionConstraint"
                      }
                    ],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The balance went down by exactly the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "afa41f33-08e0-5dfa-81ed-0a626f359552",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "2456df04-87cc-5270-88aa-5fcd59fb7006",
                    "name": "Balance reduced",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | a.balance = a.balance@pre - request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the balance after the withdrawal.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e658f861-4d7e-5ad1-887d-74a0dea19cfa",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e3b8c7b5-7331-5701-b655-57012e05bd7e",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The holder of one account pays money into another.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ebb99b7a-58af-5d97-8fb2-bbb2bdead407",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "372c06fb-ca72-54a5-aaa1-2d9235771a07",
                "name": "Transfer funds",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Transfer funds'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "9882b0de-9185-528b-8c33-b80a7732296d",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e54ce704-d6b6-5f63-905f-3ad8649a77b3",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The holder's account, which pays.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "daeabeec-b013-58c8-ab32-ae021b7e8663",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "64bccdc7-762f-5da8-89c7-feb27794aea0",
                      "name": "fromAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account paid.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "786442b3-78a7-5c67-a078-af201785c1ba",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "75c76c26-7c5a-552e-8017-4bb8309ab6f0",
                      "name": "toAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "8e9320d2-0f57-5a7d-abbe-afeda94f2329",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "20e39816-b8e7-59cb-a02c-cadf22c98743",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Transfer funds' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "66c13102-48d3-5083-ab0c-e8a47e78200c",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "f158ad14-0233-5133-90e6-3cf0818db361",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The paying account's balance after the transfer.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "42476c4e-5a8e-5e6a-b606-3a2c2156d143",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "540a419a-d154-5be6-9ff4-e01fcd29436f",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is transferred.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c89cd2fb-0cbc-55f0-ac9c-a0d3769ef355",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6c866dff-8434-598b-aa56-f9d90c2c8662",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer funds' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "25756dab-e625-51f0-a864-2a84bde80c39",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d155a5f9-0b2e-5f2b-a491-9e7d006daff7",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "At most 50 000 is transferred at once.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a225564d-b4a0-566a-a28e-00d15ddf8a0a",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "The ledger's posting limit, stated here because this service makes one posting. A larger amount is *Transfer large amount*'s.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "85116790-c7f9-56e4-a0e7-29ad9c00dbef",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1ad76e95-6398-5ae6-abce-c83d3e3b2af1",
                    "name": "Within the transfer limit",
                    "formalSpecification": {
                      "body": "request.amount <= 50000",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer funds' is requested while 'Within the transfer limit' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "31b4c028-6f28-53a0-863a-6a917fb0f190",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "50b79a3d-5bf2-5cc0-aa8f-2527e13a112d",
                      "name": "Within the transfer limit not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An account is not paid from itself.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "dbc247e9-6cf7-55b5-a653-9bbdb272ad4f",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "aa66f495-3ca4-5925-b1c8-db0edd3eb97c",
                    "name": "Different accounts",
                    "formalSpecification": {
                      "body": "request.fromAccount <> request.toAccount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer funds' is requested while 'Different accounts' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "cb9ca2f2-7103-5bf2-95f4-94a2edac079e",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d97d9190-4b52-5ec7-8252-7f323178b106",
                      "name": "Different accounts not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Money moves only between open accounts.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8ceca05b-1c91-52c6-a2e6-bd8f8b18537c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8f9c64d7-e1d2-5aeb-bbe8-17a21314ef74",
                    "name": "Both accounts are open",
                    "formalSpecification": {
                      "body": "(let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.status = AccountStatus::open) and (let a = getAccount(Tuple{accountNumber = request.toAccount}) in a <> null and a.status = AccountStatus::open)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer funds' is requested while 'Both accounts are open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "f63d7859-038a-5c7f-8e9c-24f83b2cb7bd",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "7c657d24-cb13-5904-b7e4-9f55989429dd",
                      "name": "Both accounts are open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only the paying account's holder may transfer out of it.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "538f7980-7631-5745-86e9-57eceba19d15",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "19635201-386e-573a-9140-41da8112ebbd",
                    "name": "Requested by the holder",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and (let c = findCustomerByLogin(Tuple{login = caller}) in c <> null and a.holder = c.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer funds' is requested while 'Requested by the holder' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b34ecc5f-1e3e-5c0e-be34-9cf4e13372f0",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "2893c666-43d7-502b-855e-5632749b411d",
                      "name": "Requested by the holder not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account holds at least the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "733c1faf-bed5-5eea-a033-fad470ac3b04",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "960f4ecb-13e2-5f0f-b745-09a46c3fd936",
                    "name": "Sufficient funds",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.balance >= request.amount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer funds' is requested while 'Sufficient funds' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "fc17c69e-f905-51b0-9021-3766c68fb5d1",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "233d34fd-a196-5b29-8781-7ebafeb19a6a",
                      "name": "Sufficient funds not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account went down, and the one paid went up, by the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "75c5c983-b13c-5e9b-aece-b75eb6b2e447",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e6cc97ec-b15e-542c-9da2-19a255e185a8",
                    "name": "Funds moved",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | a.balance = a.balance@pre - request.amount) and Account.allInstances()->select(a | a.accountNumber = request.toAccount)->forAll(a | a.balance = a.balance@pre + request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The bank holds as much money in total as before.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "62867aaf-2e40-5f17-aedc-55772d84aad5",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7192dbb8-3048-5f64-bd6a-ab435bec23a9",
                    "name": "Money is conserved",
                    "formalSpecification": {
                      "body": "Account.allInstances()->collect(a | a.balance)->sum() = Account.allInstances@pre()->collect(a | a.balance)->sum()",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the paying account's new balance.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "48f86a56-aa7a-5985-902e-7ecbabd69a78",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "44d5323c-2bbc-55c0-bdb2-7f0cf8f420b4",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying customer is told of the transfer.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c18d46fd-92c1-564c-b212-08b035350419",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "An AccountAdvice for the paying account is sent to its holder.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "449fc694-521b-581a-89d4-d94b35b00479-formalSpecification-prose",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "formalSpecification (informal)",
                        "purpose": "informalRequirement"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "449fc694-521b-581a-89d4-d94b35b00479",
                    "name": "Payer advised",
                    "messageSendEvents": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "Tells the payer the transfer was made.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "690a93b2-60a2-52b5-92f1-90d956e1e9fd",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1fb65484-dbb4-55f7-9aef-bef8207cafc3",
                        "name": "AccountAdvice sent",
                        "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                        "distribution": "notification",
                        "isEvent": true,
                        "variant": "MessageSendEvent",
                        "recipient": "da52fff1-738b-57ed-a694-218d358d17b8"
                      }
                    ],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer paid is told of the transfer.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "99075c47-77e2-5812-8d33-9a32f534ccd5",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "An AccountAdvice for the account paid is sent to its holder.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a189ffbe-96b1-5da7-9152-51bd249c7660-formalSpecification-prose",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "formalSpecification (informal)",
                        "purpose": "informalRequirement"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a189ffbe-96b1-5da7-9152-51bd249c7660",
                    "name": "Payee advised",
                    "messageSendEvents": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "Tells the payee money arrived.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "e601a649-edd7-5e91-9423-ef1cadc58893",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "ec7fa73e-23d3-5f28-837f-8f47e2318bf5",
                        "name": "AccountAdvice sent",
                        "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                        "distribution": "notification",
                        "isEvent": true,
                        "variant": "MessageSendEvent",
                        "recipient": "da52fff1-738b-57ed-a694-218d358d17b8"
                      }
                    ],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "An employer pays a batch of salaries from one account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "500c05c2-8965-5678-9a32-c8de2eac90c8",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "Each salary is its own posting, made one after another — a **for-each** over the batch. The batch as a whole is not one posting: the ledger guarantees each transfer, and the pre-conditions rule out every reason one could be refused before the first is made.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "13a61393-1a8c-5bbc-9ca6-429283a4b640",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "125f7ef9-1ddd-5ceb-8718-93cfc3c349e0",
                "name": "Pay salaries",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Pay salaries'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "30c89fc4-afbe-59d4-9a4e-56e3c93db00e",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "3f7b6dfc-a0b4-5c5b-8afe-bb26456acbdf",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The employer's account, which pays.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "26fa9d62-f615-5ea8-9b7d-992971bb80de",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "ff3f439b-5a0a-549f-b8b9-80417ed11982",
                      "name": "fromAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Who is paid, and how much.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "e8ec876a-b4ab-51cd-87db-d241309b244f",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "ffa65ccb-d453-59da-95d8-d23a30613232",
                      "name": "payments",
                      "dataType": "5f6abb6d-e827-5c77-aaec-cc5858c75c29",
                      "invariances": [],
                      "multiplicity": "1..*",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Pay salaries' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f80cb9ee-23a6-53fd-b964-6f5768ab64be",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "a327453f-812d-59ea-838a-831169ae3d6a",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The employer's balance once every salary is paid.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "bb9329f1-5eb0-5930-be14-865ef8bda81f",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "48b3968d-6547-5f73-a5f0-f0c99b1eac7a",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only the paying account's holder may pay from it.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "cf0bd118-b163-5b08-bf2a-0ef4ea0612f1",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6e3a2032-349d-5479-9a1a-bdaa8c79f214",
                    "name": "Requested by the holder",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and (let c = findCustomerByLogin(Tuple{login = caller}) in c <> null and a.holder = c.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Requested by the holder' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "eedc1545-e07c-507e-9e36-252919638c09",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "b4dcbb14-a98d-5533-b743-66417611a5c3",
                      "name": "Requested by the holder not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Salaries are paid only from an open account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3c09d687-503d-5de9-9d02-6d6424a160db",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "b1dc1060-79e4-573f-b9e0-a4fcb1ac5429",
                    "name": "Payer account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Payer account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "88cd24a4-2ce7-5737-b587-a8029d7a4da6",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "aca1779d-b641-5dab-8062-4de2c004de8a",
                      "name": "Payer account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Every account paid is open.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "f49750fd-29df-597d-8ff4-2cea65bb2b65",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "Asked of *Accounts* in one question, `allAccountsOpen`, rather than once per payee: a function is answered for what it is applied to, and here that is the whole list.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c6053bc3-d4a2-52f1-b4de-75bc03eb817e",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "bc22dda6-4871-5072-9872-71c7332940a8",
                    "name": "Payees are open accounts",
                    "formalSpecification": {
                      "body": "allAccountsOpen(Tuple{accountNumbers = request.payments->collect(p | p.toAccount)}).allOpen",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Payees are open accounts' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a3520348-63d2-5a51-b084-8ca785ca4dab",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1abb0035-53d7-5fca-87eb-00059c6447f5",
                      "name": "Payees are open accounts not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "No account is paid twice in one batch.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "6318adf4-1a47-5cb2-8754-76492976e087",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "Without it the post-condition below could not say what each payee's balance became: two payments to one account would each claim the whole difference.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3264b576-38be-5270-b975-39332cc6f076",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8f6d1bf6-7757-5247-ba9c-14148c461c90",
                    "name": "Each payee once",
                    "formalSpecification": {
                      "body": "request.payments->forAll(p | request.payments->select(q | q.toAccount = p.toAccount)->size() = 1)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Each payee once' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "8d5f5ba6-dd9f-5373-a88f-6b356be27826",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "27fb959d-db2b-5745-9da8-74bc4ce38fba",
                      "name": "Each payee once not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The employer's account is not one of the payees.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b6c1519b-4e7a-5a1f-b054-c95a022e60a4",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3d8b876c-7248-5a40-bf05-0455de52ee8c",
                    "name": "Not paying itself",
                    "formalSpecification": {
                      "body": "request.payments->forAll(p | p.toAccount <> request.fromAccount)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Not paying itself' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "dc0afd84-33ed-5896-8a74-c104a2194e96",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "c10763d9-6e05-5cb6-ad13-2d6210c29050",
                      "name": "Not paying itself not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Every salary is positive and at most 50 000.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2b77437c-651c-553b-ba43-760cb5720358",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c0e88a29-e13c-56dc-8a29-775c5489aa5a",
                    "name": "Amounts within the posting limit",
                    "formalSpecification": {
                      "body": "request.payments->forAll(p | p.amount > 0 and p.amount <= 50000)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Amounts within the posting limit' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "943caa41-8af6-5ed0-b0fb-623d33370416",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "64727d2a-9426-5caf-8e10-399c6fd11a8a",
                      "name": "Amounts within the posting limit not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The employer's account holds at least the batch's total.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "94ebc01b-ce0e-591b-8860-3d838384cf72",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5030fd2a-bc89-58eb-9045-2ff72ef43af5",
                    "name": "Sufficient funds",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.balance >= request.payments->collect(p | p.amount)->sum()",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Pay salaries' is requested while 'Sufficient funds' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "172dc277-3f23-5e99-bab9-4096ba3b7e28",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f296e33a-0032-5593-b070-34a4f8d54608",
                      "name": "Sufficient funds not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Every payee's balance went up by their salary.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3d84ee4d-f837-50b7-b550-b29a20098061",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d2d87788-0cbf-5c18-9321-923e576712e2",
                    "name": "Payees credited",
                    "formalSpecification": {
                      "body": "request.payments->forAll(p | Account.allInstances()->select(a | a.accountNumber = p.toAccount)->forAll(a | a.balance = a.balance@pre + p.amount))",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The employer's balance went down by the batch's total.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bca11e31-b60b-5b66-a142-032e492a1a9d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0384cbff-ea71-513b-8562-038926fe1edd",
                    "name": "Payer debited by the total",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | a.balance = a.balance@pre - request.payments->collect(p | p.amount)->sum())",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the employer's balance afterwards.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "00d71d38-3a70-5212-8771-1999ebcfaa69",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8afdbb5b-5695-5dc3-9d6d-5e01055c3970",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The holder moves more than one posting allows — up to 1000 postings' worth.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ec25ba03-6dca-594e-880a-c70f43864b39",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "Posted in tranches of at most the posting limit, **while** anything remains to be paid. How many tranches depends on the amount, which is what makes this a `while` rather than a `for-each`: there is no collection to walk, only a condition to keep testing.\n\nEach tranche is a posting, and so indivisible; the transfer as a whole is not. That is a real consequence of the posting limit, and the model states it rather than hiding it.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1eb56a23-3d7d-5846-84d6-2133f6da8fa7",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "8e52e684-192a-568b-a799-3ef63b7ff1b2",
                "name": "Transfer large amount",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Transfer large amount'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "753d4e5a-a11d-5d23-941a-567ceb99887e",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "020a7cb9-5501-5f18-b368-e90d069a51c3",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The holder's account, which pays.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "fd758249-0fb3-5e4a-8873-db7894b6b793",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "55d0a5b0-10d9-55d0-b2a9-029691060256",
                      "name": "fromAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account paid.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "040a8d79-701d-5052-9ced-d69cd6c0ee1d",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "4c2d2954-613a-5bfa-8559-c3edbfc38aad",
                      "name": "toAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much, in all.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "e8967201-56b4-5d95-9cec-f7d6bc4861d7",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "544b6ca6-5ca3-52f5-9ada-70d3513ce4fe",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Transfer large amount' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "8043fd01-5def-563e-a0a8-4b8b6a83ac9c",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "f6e73704-19fa-56ec-8a72-cab1b792f1ce",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The paying account's balance after the transfer.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "576b88ae-92ff-57b3-9388-8f1f1fed54ba",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d2925f31-2391-54ac-a298-87d62cd10f4b",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is transferred.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c3809453-144b-5dea-8a16-dce39eed76e9",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "cea8c094-b119-53d5-b524-af4cd7334745",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer large amount' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "f3ec570b-4394-5bae-a5cc-9356311f06cb",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "688e2acf-fcee-5bca-98c3-cb7a4fd8518b",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "At most 1000 postings' worth is transferred at once.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b49affa2-e513-5f57-9b72-8360fad14905",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "What bounds the loop: at most 1000 tranches are ever needed, so the loop can state that as its iteration bound.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "6bdd2cdf-fc5c-510e-8bba-dea04e992134",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "91122703-a786-56ff-93dc-3b4eeb6d8084",
                    "name": "Within the large-transfer limit",
                    "formalSpecification": {
                      "body": "request.amount <= 50000000",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer large amount' is requested while 'Within the large-transfer limit' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "31f232fe-ca2d-561c-a5ac-5a729b262feb",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "218dd6d1-109f-519f-9297-07f9ae750b9c",
                      "name": "Within the large-transfer limit not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An account is not paid from itself.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bca2f0b3-2edc-5dac-b0c0-792eb1d0be0f",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d4799039-72a6-5b8d-aecd-868fd90a1ca0",
                    "name": "Different accounts",
                    "formalSpecification": {
                      "body": "request.fromAccount <> request.toAccount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer large amount' is requested while 'Different accounts' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "442948ab-1ebc-5af4-900a-f960d8275960",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "311b152c-c6f0-56f5-b043-84270b37621a",
                      "name": "Different accounts not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Money moves only between open accounts.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a91e103e-bd82-582a-bee1-b94633356146",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0e18cbc2-2bff-5690-8ff3-7c37ac7ad1df",
                    "name": "Both accounts are open",
                    "formalSpecification": {
                      "body": "(let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.status = AccountStatus::open) and (let a = getAccount(Tuple{accountNumber = request.toAccount}) in a <> null and a.status = AccountStatus::open)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer large amount' is requested while 'Both accounts are open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "017a8e8d-9c84-53d3-8b63-400a168d4a3b",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "6fee2dfc-4a41-5e71-b7bf-e26a8fe6d14c",
                      "name": "Both accounts are open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only the paying account's holder may transfer out of it.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "cae205d0-7511-5568-98c0-4a23e02525d6",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "4d8ec968-d5c6-572b-9c6c-e8b346c214ce",
                    "name": "Requested by the holder",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and (let c = findCustomerByLogin(Tuple{login = caller}) in c <> null and a.holder = c.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer large amount' is requested while 'Requested by the holder' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "fd54a999-cf9d-5933-8c66-d56cc85a5d17",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "517be1ca-6b0b-5a30-bf69-b009241e635d",
                      "name": "Requested by the holder not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account holds at least the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3f743c61-857f-55ee-867f-ade9eb75e343",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "cd7d788c-7465-52b7-867f-f45abd3fd6e5",
                    "name": "Sufficient funds",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.balance >= request.amount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Transfer large amount' is requested while 'Sufficient funds' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b19e8339-1bb1-5c70-80b1-304e08e687c3",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "7aab9d9f-0269-5d4f-add8-a8d64c694d97",
                      "name": "Sufficient funds not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account went down, and the one paid went up, by the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "71a635b7-41cb-51fb-96da-52fa9ab52988",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "36bd40bc-59f7-5487-b3a8-6c951561f1a7",
                    "name": "Funds moved",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | a.balance = a.balance@pre - request.amount) and Account.allInstances()->select(a | a.accountNumber = request.toAccount)->forAll(a | a.balance = a.balance@pre + request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The bank holds as much money in total as before.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d0b91a5f-d8fb-517a-8632-823a2df86e23",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f4f2eb57-76eb-5abf-adf0-173da7cb0aad",
                    "name": "Money is conserved",
                    "formalSpecification": {
                      "body": "Account.allInstances()->collect(a | a.balance)->sum() = Account.allInstances@pre()->collect(a | a.balance)->sum()",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the paying account's new balance.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a9f77d26-af61-5fea-b35f-99183f354d0e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8a84e5a9-c654-5da8-9155-29d47576660e",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Reports what an account holds.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e1db0492-9441-50aa-8dd2-e7bb37de5fa4",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A **function**, and so it cannot ask who is asking: two callers asking about one account must get the same answer, and `caller` would let them differ. Who may see a balance is therefore decided by whom the service is published to, not by a pre-condition — a real trade-off, and one a model should state rather than hide.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ec920684-bbec-57f6-94d0-5ad4054babfd",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "87dc5357-051a-5d05-acf3-c7409c1e571e",
                "name": "Get balance",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Get balance'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "4eba2895-53a6-58b5-97a9-ab81625dd1b8",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "bfa21d6f-49ac-5c01-a876-eb2a2fa9f004",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "f4c2f31c-9543-54b9-a9af-1ba8284c5a05",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f0901605-098c-5672-ada8-65cf9452b547",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Get balance' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "2cf31c4b-2667-575a-b896-73b4db170a10",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "2a563c13-715b-54df-852a-fc3e163dba74",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "What it holds.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "2a545609-835b-559d-bd2b-992e9a942000",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "95c8c3be-cb44-5949-8bab-54141dfd2d55",
                      "name": "balance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "There is an account with that number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a193650d-5c8f-56b9-95b5-3a4985bc2d62",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c9c178a2-30a2-5bf3-bef7-a6644256b090",
                    "name": "Account exists",
                    "formalSpecification": {
                      "body": "getAccount(Tuple{accountNumber = request.accountNumber}) <> null",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Get balance' is requested while 'Account exists' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "3b4ea881-83a1-50ee-9f47-c5ff4391bbac",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1ada446c-3982-5dab-8804-8f4367b94520",
                      "name": "Account exists not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the account's balance.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9ce855cd-b063-54cd-9529-b1d5f2b1eb63",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9a1da814-ea9a-5fd4-9aba-2db11fa47356",
                    "name": "Balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | response.balance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": true
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The holder closes an account they have emptied.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3fe32583-7ae8-51b7-b21f-75678d673f3c",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "59fb64c1-2d28-51f3-834d-e0714aab52e9",
                "name": "Close account",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Close account'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "70c9b819-8587-5fc6-a988-17d316778868",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "a43e9ab2-9009-5072-b035-dcc5c9c9024c",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account to close.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "2242585e-6997-5925-83c3-3b1184462e2d",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "72d3eace-cd55-5ac8-8d3f-a33581e52e3b",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Close account' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e4b39cdf-9e0f-5bf3-836a-2912152b468d",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "fc769da6-75ff-5ef7-9afd-d2e294c6200a",
                  "name": "Response",
                  "abstract": false,
                  "fields": [],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only an open account can be closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "78531cb9-b3bf-595e-9e9a-49906da42415",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "caa3e04d-8adb-5413-b00b-5113460a8463",
                    "name": "Account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Close account' is requested while 'Account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0d2aa041-c9c7-5f8f-9ef8-c14558ba28e5",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "8ee00221-5392-570f-a829-09b3e03708c0",
                      "name": "Account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only the holder may close the account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b0fc10e2-bf7b-5dc2-999f-5b9fe289da50",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0e298ebf-1cc3-5193-a724-5282ff6ab222",
                    "name": "Requested by the holder",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and (let c = findCustomerByLogin(Tuple{login = caller}) in c <> null and a.holder = c.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Close account' is requested while 'Requested by the holder' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0fe9d8bf-f937-5c4f-8421-d40942032665",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "6f2f12de-f8f7-5bbd-b8a1-436d9125442a",
                      "name": "Requested by the holder not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An account is closed only once nothing is left in it.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "08e695d2-af35-554a-9aba-5352ac1e4f1d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6a1f7f9d-c85d-5cba-b5e6-724d9e8078c1",
                    "name": "Account is empty",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.balance = 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Close account' is requested while 'Account is empty' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "bf19658d-64cd-59a0-9191-b2ce506bd529",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "2c9ec923-3393-56a0-9cee-8a0debb78a71",
                      "name": "Account is empty not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account is closed, and its record kept.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0034fadd-ab1c-5ac5-921c-997854a2c72b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "aa2189f9-4eee-511c-8609-1a52f91758e0",
                    "name": "Account closed",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | a.status = AccountStatus::closed) and Account.allInstances()->size() = Account.allInstances@pre()->size()",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer is told the account is closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "449415c5-30a0-51a7-b8c0-76ef3078b806",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "An AccountAdvice for the closed account is sent to its holder.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "3e49a2ce-91fe-56f9-92c0-72c6d79281cc-formalSpecification-prose",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "formalSpecification (informal)",
                        "purpose": "informalRequirement"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3e49a2ce-91fe-56f9-92c0-72c6d79281cc",
                    "name": "Holder advised",
                    "messageSendEvents": [
                      {
                        "annotations": [
                          {
                            "annotations": [],
                            "body": "Tells the customer the account is closed.",
                            "formalizationOf": [],
                            "formalizationSnapshots": [],
                            "id": "e73892ab-0384-5093-929c-a1e8b20037ba",
                            "language": "en",
                            "markup": "text_plain",
                            "name": "Description",
                            "purpose": "shortDescription"
                          }
                        ],
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2cbd1290-83d1-5319-99f7-fadc1746f0fa",
                        "name": "AccountAdvice sent",
                        "dataStructure": "8319e7a2-6d49-5478-9106-610c76d16b93",
                        "distribution": "notification",
                        "isEvent": true,
                        "variant": "MessageSendEvent",
                        "recipient": "da52fff1-738b-57ed-a694-218d358d17b8"
                      }
                    ],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "da52fff1-738b-57ed-a694-218d358d17b8"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              }
            ]
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "Who the bank's customers are.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "7b2de24a-0b1c-5497-a95b-6be115a6a736",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "1395320b-9da6-56fc-8a31-4255c6e3d2b7",
            "name": "Customer Register",
            "dataTypes": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The bank's record of one customer.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6f78bb42-a0e0-5517-8d2e-ffd91820f4af",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A **view** onto the `Customer` entity. `customerNumber` identifies the instance; the others state its data. The identity number is personal data the bank must retain for as long as the law obliges it to (know-your-customer), which is why it is `retentionObligated` and the rest `standard`.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "32433afb-a4b1-5679-9017-69c82ce5e897",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "dafda720-8e8f-56e5-98c2-17f2dc9f2bdd",
                "name": "CustomerRecord",
                "abstract": false,
                "fields": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer's number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c3de91f1-e46f-5cdb-be3f-bb50d4b54010",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5375ef56-d390-5b70-ab1c-294abc9c2e5d",
                    "name": "customerNumber",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "identifies"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer's name.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5384a216-b699-5919-98fd-e829d6919133",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "299f2d86-7834-55c5-9bf9-a7f466e5d3a8",
                    "name": "name",
                    "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states",
                    "personalData": "standard"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The number on the identity document the customer registered with.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8c2208a4-a49a-50f9-b0cc-37ddde7bafde",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6cbc24bf-10f2-5fb1-a10f-c927bb8a32d4",
                    "name": "identityNumber",
                    "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states",
                    "personalData": "retentionObligated",
                    "unique": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The login identity the customer uses — what `caller` is compared with.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0cc9e18a-2215-5f4e-9887-fc0249660ba8",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9d9d44e1-1829-52f0-ad35-d50186a8cdea",
                    "name": "login",
                    "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states",
                    "personalData": "standard",
                    "unique": true
                  }
                ],
                "invariances": [],
                "variant": "DataStructure",
                "entityRef": "fe03d30c-7c2b-5b84-9270-811a6ab8338a"
              }
            ],
            "entities": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "A person the bank has registered as a customer.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c0600e37-22f6-517a-a237-dda300312d28",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "An entity: a business object with an identity, whose state the bank keeps. Its fields are those of the views that project it — here `CustomerRecord`.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "793c7baf-c787-5459-a4ee-82ea65c9e9d6",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "fe03d30c-7c2b-5b84-9270-811a6ab8338a",
                "name": "Customer",
                "readableBy": []
              }
            ],
            "exceptions": [],
            "processes": [],
            "responsibilityDomains": [],
            "serviceContracts": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Records a new customer and issues their customer number.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "2f1a5942-00b9-5f4a-8f08-281ce51313be",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "9fc85d24-76a6-54b7-82f6-42deaaf03593",
                "name": "Record customer",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Record customer'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "32f698a9-041c-5a78-b74d-4a3c630dfa7e",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e681512e-3e75-5995-9c84-105f1971df47",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The customer's name.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "c44b78ed-1aab-5638-81d9-cc77ccc21fa4",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "cc312437-c529-515b-94c6-0f087ef6ecde",
                      "name": "name",
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The number on their identity document.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b20c0306-f2ed-5d54-a417-2676bee3ed5e",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e194f4e5-48d2-572d-9445-d27d7b163bc0",
                      "name": "identityNumber",
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The login identity they will use.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "3a9b06f2-f961-5b13-964e-5852326bd671",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "682b7932-dd4c-5f46-8d58-c453004e810d",
                      "name": "login",
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Record customer' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "bed840cd-94c7-535d-9d0c-b1c4d5907ce8",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "f9451c70-1da4-5563-bcf6-0f7d82b98d40",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The number issued.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "671a0ffb-32c7-5c37-8b03-a803d3617aed",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "b5c99103-581f-52ae-a75d-20f67967d170",
                      "name": "customerNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Each person is registered once, by their identity document.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "73b67750-7db5-52ee-a28d-55007eed6e1b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5a328cb3-252e-5590-b9e8-ed0cf45e4bc6",
                    "name": "Identity not yet registered",
                    "formalSpecification": {
                      "body": "Customer.allInstances()->forAll(c | c.identityNumber <> request.identityNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Record customer' is requested while 'Identity not yet registered' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a73b3d95-4f76-5f88-a565-575d8a06de8d",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e08f6526-8111-56ec-b92d-94fd53cae883",
                      "name": "Identity not yet registered not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer is on record with the details given.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "994c88a5-a9c9-50e2-b870-72fafa367a91",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "33d79e4d-5652-5a09-bbf6-64473aaae1b8",
                    "name": "Customer recorded",
                    "formalSpecification": {
                      "body": "Customer.allInstances()->exists(c | c.customerNumber = response.customerNumber and c.name = request.name and c.identityNumber = request.identityNumber and c.login = request.login)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The number issued belonged to no customer before.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "a9ceb647-a4ee-582e-a77f-166ba2cc6408",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "`@pre` reads the population as it was before the service — the one way to say \"new\" formally.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c8fa02f7-a04c-5921-9cc3-aa5944edb3b8",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "b611465d-c883-529f-8c9b-af0417618c62",
                    "name": "Customer number is new",
                    "formalSpecification": {
                      "body": "Customer.allInstances@pre()->forAll(c | c.customerNumber <> response.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "id": "51e395bb-556e-8d36-9a95-48bf20bdebeb",
                "name": "getCustomer",
                "annotations": [
                  {
                    "id": "6c83bc3d-b03b-8e5f-9d83-4b7cd1c3a3e6",
                    "name": "Description",
                    "annotations": [],
                    "body": "Gives the customer with the customer number asked for, as its owning domain holds it. Generated from the entity; generate again rather than editing it.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "language": "en",
                    "markup": "text_plain",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "isQuery": true,
                "generatedFor": "fe03d30c-7c2b-5b84-9270-811a6ab8338a",
                "provisionalStakeholders": [],
                "publishedTo": [],
                "waivedPreConditions": [],
                "requestDataStructure": {
                  "id": "8753de5c-f66c-8bbd-992b-100e05b7e68a",
                  "name": "Request",
                  "annotations": [
                    {
                      "id": "1f26ef4c-d344-8208-88df-dd887dadcab3",
                      "name": "Description",
                      "annotations": [],
                      "body": "What is supplied when requesting 'getCustomer'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "a11f7751-762e-830b-8b8d-e9f632c018da",
                      "name": "customerNumber",
                      "annotations": [
                        {
                          "id": "e7c88705-0090-8d86-9b46-54e3c9b302c3",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer number of the customer asked for.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "id": "469d2c57-a5e6-85e3-805b-606b8f67e5c6",
                  "name": "Response",
                  "annotations": [
                    {
                      "id": "72f76559-b6a6-8fee-8d1b-36d77f95ffaf",
                      "name": "Description",
                      "annotations": [],
                      "body": "What 'getCustomer' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "c2b0b0d7-fb0e-83e5-a88d-274bb9b32b6e",
                      "name": "customerNumber",
                      "annotations": [
                        {
                          "id": "5a94bc94-ac5e-8640-86a2-edd11b0ec667",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's customer number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "46d267b9-a598-85eb-b476-589d2d4ed4b0",
                      "name": "identityNumber",
                      "annotations": [
                        {
                          "id": "1d9874c7-bff6-8de6-87ad-569c9345ac81",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's identity number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "retentionObligated"
                    },
                    {
                      "id": "8beb0cad-54e6-81f9-a5e2-e675e677d1e8",
                      "name": "login",
                      "annotations": [
                        {
                          "id": "a26dc502-d47f-8774-b3c0-240e177dff29",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's login.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "standard"
                    },
                    {
                      "id": "701c53c1-b60d-8a9f-9058-e531fbd98450",
                      "name": "name",
                      "annotations": [
                        {
                          "id": "c02f710a-295a-869a-ac7f-ea247c739da1",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's name.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "standard"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "id": "ee0369cd-52eb-8f34-9ad7-10b3d84b3245",
                    "name": "Customer exists",
                    "annotations": [
                      {
                        "id": "b3d10eb8-7d03-8ba5-b751-6ec06795d8a0",
                        "name": "Description",
                        "annotations": [],
                        "body": "There is a customer with that customer number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "Customer.allInstances()->exists(e | e.customerNumber = request.customerNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "id": "adc4f4c1-b08b-8131-a423-b9cf37c6f442",
                      "name": "Customer exists not met",
                      "annotations": [
                        {
                          "id": "16b9487f-a863-875c-ac75-ecefdc7bf7db",
                          "name": "Description",
                          "annotations": [],
                          "body": "Raised when 'getCustomer' is requested while 'Customer exists' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "id": "8f403236-d897-8ca1-829e-4a58200348ce",
                    "name": "Customer given",
                    "annotations": [
                      {
                        "id": "5daf864f-349e-80cc-a053-d3b64c1da0c7",
                        "name": "Description",
                        "annotations": [],
                        "body": "Every stored field of the customer with that customer number, an association as its target's identity.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "response.customerNumber = Customer.allInstances()->any(e | e.customerNumber = request.customerNumber).customerNumber and response.identityNumber = Customer.allInstances()->any(e | e.customerNumber = request.customerNumber).identityNumber and response.login = Customer.allInstances()->any(e | e.customerNumber = request.customerNumber).login and response.name = Customer.allInstances()->any(e | e.customerNumber = request.customerNumber).name",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ]
              },
              {
                "id": "4ce98e89-e68d-8603-9d3d-ecc1b598be4a",
                "name": "findCustomerByIdentityNumber",
                "annotations": [
                  {
                    "id": "11ac8d1a-fbee-868e-89fd-ff55d39e50f3",
                    "name": "Description",
                    "annotations": [],
                    "body": "Gives the customer with the identity number asked for, as its owning domain holds it. Generated from the entity; generate again rather than editing it.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "language": "en",
                    "markup": "text_plain",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "isQuery": true,
                "generatedFor": "fe03d30c-7c2b-5b84-9270-811a6ab8338a",
                "provisionalStakeholders": [],
                "publishedTo": [],
                "waivedPreConditions": [],
                "requestDataStructure": {
                  "id": "76a6e38e-c864-8f92-9dd1-9e0025ce00c9",
                  "name": "Request",
                  "annotations": [
                    {
                      "id": "2fedcef7-65bc-8b6b-a451-308906b93004",
                      "name": "Description",
                      "annotations": [],
                      "body": "What is supplied when requesting 'findCustomerByIdentityNumber'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "f34271f9-5409-85a4-9168-a09572c5f6f9",
                      "name": "identityNumber",
                      "annotations": [
                        {
                          "id": "5d3c610f-c9f0-83d5-ab3c-b5619ff04c74",
                          "name": "Description",
                          "annotations": [],
                          "body": "The identity number of the customer asked for.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "id": "180b1abd-d4cb-881e-9c09-30de1dd6eab7",
                  "name": "Response",
                  "annotations": [
                    {
                      "id": "b1b359a6-1a83-8997-901c-883da1a7c362",
                      "name": "Description",
                      "annotations": [],
                      "body": "What 'findCustomerByIdentityNumber' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "84df09fe-a98f-8146-bd92-6edf295c7851",
                      "name": "customerNumber",
                      "annotations": [
                        {
                          "id": "ecda517c-4387-832f-ba33-53bfe9408efc",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's customer number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "127c8716-6d29-89e8-84bb-a3a53f7be177",
                      "name": "identityNumber",
                      "annotations": [
                        {
                          "id": "868b3f3a-d33f-8729-a640-8c66aa4dfca2",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's identity number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "retentionObligated"
                    },
                    {
                      "id": "8c061fbd-b7f5-8f30-85c8-0a800a2482a5",
                      "name": "login",
                      "annotations": [
                        {
                          "id": "94d97e8c-6e0f-8f01-ae5c-f264a8587780",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's login.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "standard"
                    },
                    {
                      "id": "b570354e-1101-8fc8-8113-a9f58bc841ab",
                      "name": "name",
                      "annotations": [
                        {
                          "id": "4abd7325-8c87-8e09-9d12-919e9d45d326",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's name.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "standard"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "id": "ff5bef61-9579-8e7d-bcc9-2b6a823de078",
                    "name": "Customer with that identity number exists",
                    "annotations": [
                      {
                        "id": "2343f44c-96e6-8548-93e9-4e60be6520f9",
                        "name": "Description",
                        "annotations": [],
                        "body": "There is a customer with that identity number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "Customer.allInstances()->exists(e | e.identityNumber = request.identityNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "id": "fca1513b-2814-836a-8b9e-20055e576b95",
                      "name": "Customer with that identity number exists not met",
                      "annotations": [
                        {
                          "id": "367cd8c5-8719-8a13-b2a7-119f3639f3f0",
                          "name": "Description",
                          "annotations": [],
                          "body": "Raised when 'findCustomerByIdentityNumber' is requested while 'Customer with that identity number exists' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "id": "25e35881-35a3-81f6-bee6-bd022c3fc96d",
                    "name": "Customer given",
                    "annotations": [
                      {
                        "id": "90c45062-4fbd-809f-837f-f0c1d4dacd38",
                        "name": "Description",
                        "annotations": [],
                        "body": "Every stored field of the customer with that identity number, an association as its target's identity.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "response.customerNumber = Customer.allInstances()->any(e | e.identityNumber = request.identityNumber).customerNumber and response.identityNumber = Customer.allInstances()->any(e | e.identityNumber = request.identityNumber).identityNumber and response.login = Customer.allInstances()->any(e | e.identityNumber = request.identityNumber).login and response.name = Customer.allInstances()->any(e | e.identityNumber = request.identityNumber).name",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ]
              },
              {
                "id": "fb9c7228-ca11-838b-bcc8-8d6c2bf2414c",
                "name": "findCustomerByLogin",
                "annotations": [
                  {
                    "id": "8e80622b-0f83-8606-931f-ef6416b512cd",
                    "name": "Description",
                    "annotations": [],
                    "body": "Gives the customer with the login asked for, as its owning domain holds it. Generated from the entity; generate again rather than editing it.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "language": "en",
                    "markup": "text_plain",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "isQuery": true,
                "generatedFor": "fe03d30c-7c2b-5b84-9270-811a6ab8338a",
                "provisionalStakeholders": [],
                "publishedTo": [],
                "waivedPreConditions": [],
                "requestDataStructure": {
                  "id": "55258401-676a-85aa-9f61-8418289bc743",
                  "name": "Request",
                  "annotations": [
                    {
                      "id": "cca3af5c-1e3c-84d3-8c9b-c1053215b94e",
                      "name": "Description",
                      "annotations": [],
                      "body": "What is supplied when requesting 'findCustomerByLogin'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "35d3675d-42d2-8db4-b62a-dac1f66d7459",
                      "name": "login",
                      "annotations": [
                        {
                          "id": "15ad9c0b-03c4-8225-9a33-98e911b1f1d4",
                          "name": "Description",
                          "annotations": [],
                          "body": "The login of the customer asked for.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "id": "b7441427-0f71-8166-8b9d-68d5d577f131",
                  "name": "Response",
                  "annotations": [
                    {
                      "id": "fbb41bec-00cf-874f-a776-a068cf8fa75c",
                      "name": "Description",
                      "annotations": [],
                      "body": "What 'findCustomerByLogin' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "75cb291a-1b49-8fce-ac83-5d7482dd74e7",
                      "name": "customerNumber",
                      "annotations": [
                        {
                          "id": "a65ab609-c20a-87c7-b9d1-9225dbe0d992",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's customer number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "574f935c-a5f0-8190-b01b-e8b152863ce1",
                      "name": "identityNumber",
                      "annotations": [
                        {
                          "id": "a18b0801-65ea-8d61-816d-16eea355848c",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's identity number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "retentionObligated"
                    },
                    {
                      "id": "6431a99f-a558-8388-8852-225a30f7990f",
                      "name": "login",
                      "annotations": [
                        {
                          "id": "e912190d-353c-8549-a2fa-d0f4b6dc600a",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's login.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "standard"
                    },
                    {
                      "id": "14fe5910-88ef-8970-a437-cd6c19a61041",
                      "name": "name",
                      "annotations": [
                        {
                          "id": "fccd0eb1-dacd-8dc1-a7c9-bbc37ff53fec",
                          "name": "Description",
                          "annotations": [],
                          "body": "The customer's name.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "20f75653-b68c-56af-a0d3-c85adc0efd8e",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition",
                      "personalData": "standard"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "id": "545d66a1-b13c-80e5-b4f5-e3c8150b09d6",
                    "name": "Customer with that login exists",
                    "annotations": [
                      {
                        "id": "77103818-6413-8340-b12d-4bb470a65e7f",
                        "name": "Description",
                        "annotations": [],
                        "body": "There is a customer with that login.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "Customer.allInstances()->exists(e | e.login = request.login)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "id": "e49ef2c7-2c74-8362-8b3c-d8f9f1e7f663",
                      "name": "Customer with that login exists not met",
                      "annotations": [
                        {
                          "id": "988dc6fe-5c52-86fb-aa0e-9ad8c5fea86e",
                          "name": "Description",
                          "annotations": [],
                          "body": "Raised when 'findCustomerByLogin' is requested while 'Customer with that login exists' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "id": "ba313be2-31fc-8dee-8ac1-f8003981c273",
                    "name": "Customer given",
                    "annotations": [
                      {
                        "id": "a915dde5-eb9a-80e7-8a6f-691adf72dfbe",
                        "name": "Description",
                        "annotations": [],
                        "body": "Every stored field of the customer with that login, an association as its target's identity.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "response.customerNumber = Customer.allInstances()->any(e | e.login = request.login).customerNumber and response.identityNumber = Customer.allInstances()->any(e | e.login = request.login).identityNumber and response.login = Customer.allInstances()->any(e | e.login = request.login).login and response.name = Customer.allInstances()->any(e | e.login = request.login).name",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ]
              }
            ]
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "The bank's accounts: opening, looking up and closing them.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "17957e02-a8d8-5712-9b23-a5a11d834cda",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              },
              {
                "annotations": [],
                "body": "Accounts does not change a balance — that is the ledger's alone.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "42d2a6ba-9fd7-5510-bd39-7816180adb91",
                "language": "en",
                "markup": "text_markdown",
                "name": "Details",
                "purpose": "detailedDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "9b1cb1f0-1efb-5a47-8736-f03abd3f28f0",
            "name": "Accounts",
            "dataTypes": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The bank's record of one account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "556f4222-3074-5e31-ba38-d8d5e8c8920c",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A view onto the `Account` entity. Its invariance — no overdraft — holds of every account at every moment, which is what lets the withdrawal and transfer services state *Sufficient funds* as a pre-condition rather than leave it to a process to discover.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "22d75e58-eda9-54fb-92f9-c3c71f3389bc",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "26019995-b033-51b6-8afe-9ccf9ab29fe0",
                "name": "AccountRecord",
                "abstract": false,
                "fields": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account's number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c92b0508-52f0-5eea-8b9c-63aa666dc695",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0cf78f43-3456-546e-a0ec-64cc5b2f8b25",
                    "name": "accountNumber",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "identifies"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The customer number of the account's holder.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e55497b6-1708-58bb-8db2-879c63742b0a",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "fdb2848c-33d7-528a-99d7-e8b88a53394a",
                    "name": "holder",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Current or savings.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8ba43330-c803-5b90-a57f-212a73d23036",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7feca72e-669b-59e0-a556-44833c67b126",
                    "name": "accountType",
                    "dataType": "dafbd62c-6a4b-5e99-8589-053569be0f64",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "What the account holds.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "77f97be7-0f13-50b7-ac70-32ef1f32052c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3ba6763c-bc48-5b74-a082-13b0699c5ff2",
                    "name": "balance",
                    "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Open or closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bdee6a8d-e80f-5787-8a1d-abc7dcf43b1c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "8b349012-8ba2-5851-83e7-781ebbbf2305",
                    "name": "status",
                    "dataType": "003e4b86-0a53-5766-80d0-1a03c71b7075",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  }
                ],
                "invariances": [
                  {
                    "annotations": [],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "155a7e43-3887-5132-9fa9-c367b0a2c5b7",
                    "name": "No overdraft",
                    "formalSpecification": {
                      "body": "self.balance >= 0",
                      "specificationLanguage": "OCL"
                    },
                    "requiredBy": [],
                    "isInvariance": true
                  }
                ],
                "variant": "DataStructure",
                "entityRef": "578b0e7f-b237-58eb-ab44-239ae949c02d"
              }
            ],
            "entities": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "A customer's account at the bank.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "3f1c585f-9642-577f-900d-03587ea7678a",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "Identified by its account number. Its balance is changed only by the ledger.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1a362fbf-7c8f-5e8e-8bc3-fa379af61534",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "578b0e7f-b237-58eb-ab44-239ae949c02d",
                "name": "Account",
                "readableBy": []
              }
            ],
            "exceptions": [],
            "processes": [],
            "responsibilityDomains": [],
            "serviceContracts": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Says whether every account in a list is open.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5216d2ee-8e69-5ef3-9296-446e811826e0",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A query service written by hand, beside the generated `getAccount`: a payroll asks about every payee's account at once, and a function is answered for what it is applied to — here the whole list, which is what lets *Pay salaries* ask it in one pre-condition (`docs/design/domainOwnedEntityData.md` P2).",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "bd3b63c4-5800-5bab-b6e7-79a262384c01",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "6c36f062-6221-564d-ae0c-be1522d45841",
                "name": "allAccountsOpen",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'allAccountsOpen'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1abefbe0-dc19-52e9-82aa-afd36f782a31",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "60282bd8-3d28-5051-a3d1-f745bfcac5db",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The accounts asked about.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "75d630f9-35f2-5460-a4f9-b3fc29693f29",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "bc8defca-00af-58c4-b196-abbc97268a53",
                      "name": "accountNumbers",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "0..*",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'allAccountsOpen' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f9fa1074-5147-5312-b093-604c064d1fec",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "99973fb5-6340-55ec-83a7-c9c186dc6a7d",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Whether every one of them is an open account.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "4883721f-5e2a-545a-9fc7-28f741ac09c9",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "93bda27f-0d93-5c25-8ff9-7671fc6b70f5",
                      "name": "allOpen",
                      "dataType": "67051e77-402b-58f5-aa79-4b35808d3983",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Whether each account named is on record and open.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "2e4f04fa-7656-58cb-931a-274fb504ff23",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ccac70c0-cf3b-551c-a176-6c11d3a0cf30",
                    "name": "Openness given",
                    "formalSpecification": {
                      "body": "response.allOpen = request.accountNumbers->forAll(n | Account.allInstances()->exists(a | a.accountNumber = n and a.status = AccountStatus::open))",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [],
                "waivedPreConditions": [],
                "isQuery": true
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Opens a new, empty account for a registered customer.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a1f18889-a169-5c8e-a662-c0ae048b1f6a",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "fd563d9a-4d51-57a9-8af3-a3a1daf4bae1",
                "name": "Create account",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Create account'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "a6f1e13a-08f7-5337-b96e-9ce396a116ae",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "d1c65182-ebf4-5811-a8ba-f0f9a79ee29d",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The customer number of the holder.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "1a5afd14-fe0c-5c73-bb69-fb4652e2c4a8",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d31aa26a-e6d2-524a-a90e-e2c9225fa36e",
                      "name": "holder",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The kind of account.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "e3764465-e5ee-5acc-86be-297123121143",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "10febffd-9827-5383-9504-4ab23ad8e85f",
                      "name": "accountType",
                      "dataType": "dafbd62c-6a4b-5e99-8589-053569be0f64",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Create account' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "0589f16e-9428-555a-a11d-c59bba169608",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "5bc520f7-4624-515c-9221-37328aa54125",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The number issued.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "c466a4ea-7709-5ced-8f85-fa9e72d12010",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "b4290ca6-a515-5b53-a2a5-d9635a79c30e",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An account is opened only for a registered customer.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "4bbb03a0-01fd-5d1c-a3c1-38dc89309d5c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "Asked of *Customer Register* through its `getCustomer`.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d1eec36d-06d7-5f12-895d-06b17a3a0415",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ba679c9a-bf08-5061-9bdd-71318a91019a",
                    "name": "Holder is registered",
                    "formalSpecification": {
                      "body": "getCustomer(Tuple{customerNumber = request.holder}) <> null",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Create account' is requested while 'Holder is registered' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "861817fb-d177-57fb-a160-98d043f352ae",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "57ed1214-3715-5810-89d8-b117cb6310eb",
                      "name": "Holder is registered not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An open, empty account of the type asked for exists for the holder.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b106512b-7236-556f-9399-0dfddd435dc9",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "2410803a-a301-5e2c-9d29-b88043601d19",
                    "name": "Account created",
                    "formalSpecification": {
                      "body": "Account.allInstances()->exists(a | a.accountNumber = response.accountNumber and a.holder = request.holder and a.accountType = request.accountType and a.balance = 0 and a.status = AccountStatus::open)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The number issued belonged to no account before.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "68de05de-3e76-5d12-a82d-357deb79e8c3",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ecd752a9-2bfa-51c0-ab11-ea6f16dd8aa7",
                    "name": "Account number is new",
                    "formalSpecification": {
                      "body": "Account.allInstances@pre()->forAll(a | a.accountNumber <> response.accountNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Looks an account up by its number.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "437da681-d8a6-528b-918f-9684f0570240",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "A **function**: asking changes nothing, so it may be asked any number of times, cached, and applied inside a constraint. It may only be orchestrated across other functions, and its own conditions may not depend on `caller` or `now()`.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "eb47025a-8dea-5665-8448-ab145f1542b2",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "32fc8143-0e59-5f8f-a7c8-d196357d97aa",
                "name": "Retrieve account",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Retrieve account'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "3a7f1ff7-ac30-556b-ae0f-2903eb6c1f33",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "69bf918b-c6a9-5c10-83d4-fe4626ebcafe",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account to look up.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "bed13666-aba5-58bd-9622-efd4655f3a01",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "b67ee8d2-8ecc-5c30-8a60-da53ade41d0c",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Retrieve account' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "9ed0ad8a-a14d-5fa0-acbc-fac703769696",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "539f368b-3983-5986-82ba-70b12526d204",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account as it stands.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "4e4c574b-ae06-5141-b0ed-953b92407dfe",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "8fefc4e9-ba53-5807-8cce-45016291a2d7",
                      "name": "account",
                      "dataType": "26019995-b033-51b6-8afe-9ccf9ab29fe0",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "There is an account with that number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5542f691-279b-5d25-8a27-c43e1f6f725f",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "885d9295-40ae-53ac-93b3-62fea356b2c2",
                    "name": "Account exists",
                    "formalSpecification": {
                      "body": "Account.allInstances()->exists(a | a.accountNumber = request.accountNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Retrieve account' is requested while 'Account exists' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "ee63fc62-f262-56c1-a7d8-b7e76ead9df7",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "979918bb-fdf2-55af-b102-9efc5a4e9ac0",
                      "name": "Account exists not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account is reported as it stands.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "25be806e-5781-529d-9750-36774269d33d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "0080cf78-ad09-5af7-b318-472e87ff3b9c",
                    "name": "Account reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | response.account.accountNumber = a.accountNumber and response.account.holder = a.holder and response.account.balance = a.balance and response.account.status = a.status)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": true
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Marks an emptied account closed, keeping its record.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e9f0ada0-3a9a-5f73-894b-02f67575b5eb",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "fecbca21-9c41-5bfc-b7a9-d8bed0d2a8d8",
                "name": "Close account record",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Close account record'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "cbd227a5-23ba-5a44-80e0-9abcaf61206b",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "c67da177-00bb-5950-a643-3aed6c810725",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account to close.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "2a9a2d40-31fc-545e-9417-4529fb834291",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "a130eeed-3f08-553a-bd17-645ddb19407b",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Close account record' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "ea4190b7-c1e8-5e65-b830-7dcf4141ba02",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e636cb67-5807-5b1b-bd21-ae1e44dd0ad4",
                  "name": "Response",
                  "abstract": false,
                  "fields": [],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only an open account can be closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0d05ba06-6f79-5aee-89c4-4af077ed073b",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "cee2ce25-bc0a-5620-9933-12b2fb2a3b03",
                    "name": "Account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Close account record' is requested while 'Account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "fadb6e39-feea-5e58-9ecc-d1e03bb4d3eb",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "9fe55256-07e6-52a1-9eb1-18c6918a5274",
                      "name": "Account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An account is closed only once nothing is left in it.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "84938e7a-3f0b-5e0d-b59b-c5fe3cac6021",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "40a93de6-b7b9-51c9-8920-ad11cf86a9fb",
                    "name": "Account is empty",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.balance = 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Close account record' is requested while 'Account is empty' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "b3ba2aa0-4da4-506f-845b-56344998dfec",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d327347c-bbc3-561d-bcfd-5646b9442509",
                      "name": "Account is empty not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account is closed.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "9b165ef2-7b50-5dbe-ac08-e424f09990f3",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "4d8edc5d-b955-5118-8bf7-81077c2f83ca",
                    "name": "Account closed",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | a.status = AccountStatus::closed)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "No account record is removed — closing is not deleting.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0974fbe8-f8ce-5a8a-a31b-4dfc60d73830",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "41e704d2-3e09-55bd-b954-78b8949223ed",
                    "name": "Account record kept",
                    "formalSpecification": {
                      "body": "Account.allInstances()->size() = Account.allInstances@pre()->size()",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "id": "231c45c3-e178-8630-8c7b-6533d6d67cc5",
                "name": "getAccount",
                "annotations": [
                  {
                    "id": "b8b1cc62-50d7-8601-9895-b734d1305b20",
                    "name": "Description",
                    "annotations": [],
                    "body": "Gives the account with the account number asked for, as its owning domain holds it. Generated from the entity; generate again rather than editing it.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "language": "en",
                    "markup": "text_plain",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "isQuery": true,
                "generatedFor": "578b0e7f-b237-58eb-ab44-239ae949c02d",
                "provisionalStakeholders": [],
                "publishedTo": [],
                "waivedPreConditions": [],
                "requestDataStructure": {
                  "id": "39b946b7-ca57-824f-a217-8eb752ce3b24",
                  "name": "Request",
                  "annotations": [
                    {
                      "id": "cbb39bc4-a11a-8dca-8cbc-d38d7679a155",
                      "name": "Description",
                      "annotations": [],
                      "body": "What is supplied when requesting 'getAccount'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "39a10bf2-d595-809e-964d-0f0d8197bee1",
                      "name": "accountNumber",
                      "annotations": [
                        {
                          "id": "1224fdf3-af2c-8a17-96fe-0ec19ee0668c",
                          "name": "Description",
                          "annotations": [],
                          "body": "The account number of the account asked for.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "id": "bb32e24e-f98d-88d5-a482-3ea4ca3993a8",
                  "name": "Response",
                  "annotations": [
                    {
                      "id": "0dd4e8f9-0bee-86b0-b73d-8e1ba0a13669",
                      "name": "Description",
                      "annotations": [],
                      "body": "What 'getAccount' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "language": "en",
                      "markup": "text_plain",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "abstract": false,
                  "fields": [
                    {
                      "id": "282818ff-067a-8e5c-bc4e-ee1e21d5618d",
                      "name": "accountNumber",
                      "annotations": [
                        {
                          "id": "befc38f4-cc17-8fdd-bd5e-b3189b125ad8",
                          "name": "Description",
                          "annotations": [],
                          "body": "The account's account number.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "0ff581fa-b650-83b9-b5e7-7afe3f7ecaf4",
                      "name": "accountType",
                      "annotations": [
                        {
                          "id": "b761e1a2-0d0a-85b4-a719-0aa2dd181fe5",
                          "name": "Description",
                          "annotations": [],
                          "body": "The account's account type.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "dafbd62c-6a4b-5e99-8589-053569be0f64",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "7827daf9-9b12-8402-9fde-847aca3ae54b",
                      "name": "balance",
                      "annotations": [
                        {
                          "id": "16a9ea38-3f45-8f1b-b94f-5635a6310f46",
                          "name": "Description",
                          "annotations": [],
                          "body": "The account's balance.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "a75e5f0a-d0d5-8b64-ad62-dc19dae1c78f",
                      "name": "holder",
                      "annotations": [
                        {
                          "id": "086e7dcd-1f98-8815-b9cc-ca6ed6f2868a",
                          "name": "Description",
                          "annotations": [],
                          "body": "The account's holder.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "id": "ad4c3d40-076a-8af0-8d2e-c75986a9da6f",
                      "name": "status",
                      "annotations": [
                        {
                          "id": "d9c2cec2-c070-8741-81e3-801fb97f22ea",
                          "name": "Description",
                          "annotations": [],
                          "body": "The account's status.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "dataType": "003e4b86-0a53-5766-80d0-1a03c71b7075",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "id": "af6c2186-3753-824a-a004-d4bf53e2af8b",
                    "name": "Account exists",
                    "annotations": [
                      {
                        "id": "fe03ff19-3514-84f3-9965-5928d8222206",
                        "name": "Description",
                        "annotations": [],
                        "body": "There is a account with that account number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "Account.allInstances()->exists(e | e.accountNumber = request.accountNumber)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "id": "c1c72d9c-5fa7-85e7-a9a3-88ff4628a268",
                      "name": "Account exists not met",
                      "annotations": [
                        {
                          "id": "17279042-48d9-8a92-a061-8b8cb55a27a9",
                          "name": "Description",
                          "annotations": [],
                          "body": "Raised when 'getAccount' is requested while 'Account exists' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "language": "en",
                          "markup": "text_plain",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "id": "116355bd-7563-8e6f-8add-7f7a8ca3e7b4",
                    "name": "Account given",
                    "annotations": [
                      {
                        "id": "2f1db7d4-22cf-86ea-a41f-eade61a8dc25",
                        "name": "Description",
                        "annotations": [],
                        "body": "Every stored field of the account with that account number, an association as its target's identity.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "language": "en",
                        "markup": "text_plain",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "formalSpecification": {
                      "body": "response.accountNumber = Account.allInstances()->any(e | e.accountNumber = request.accountNumber).accountNumber and response.accountType = Account.allInstances()->any(e | e.accountNumber = request.accountNumber).accountType and response.balance = Account.allInstances()->any(e | e.accountNumber = request.accountNumber).balance and response.holder = Account.allInstances()->any(e | e.accountNumber = request.accountNumber).holder and response.status = Account.allInstances()->any(e | e.accountNumber = request.accountNumber).status",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ]
              }
            ]
          },
          {
            "annotations": [
              {
                "annotations": [],
                "body": "The only thing that moves money, and the record of every movement.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "1c3d87f4-d34c-5e5d-ae69-00a70d823cbd",
                "language": "en",
                "markup": "text_plain",
                "name": "Description",
                "purpose": "shortDescription"
              },
              {
                "annotations": [],
                "body": "Every change to a balance is a ledger posting, and every posting leaves entries behind. A transfer is one posting, so it happens entirely or not at all.",
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "2ef41f1e-0648-583c-b909-118af867c32e",
                "language": "en",
                "markup": "text_markdown",
                "name": "Details",
                "purpose": "detailedDescription"
              }
            ],
            "formalizationOf": [],
            "formalizationSnapshots": [],
            "id": "25d6fce5-a117-5002-aeed-2d531e035b92",
            "name": "Ledger",
            "dataTypes": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "The ledger's record of one entry.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6a79f0fa-c857-5970-a298-760a6d0251b4",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "76fb6f0e-b3df-5984-add5-16a6023a2ba2",
                "name": "LedgerEntryRecord",
                "abstract": false,
                "fields": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The entry's number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "f119081e-0702-5f22-bf27-bfeba4dd0f7c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c909d21c-fb38-5e37-b4ab-149839141003",
                    "name": "entryNumber",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "identifies"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account it moved money in or out of.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5b5c023c-31de-5bf5-9e4a-13743d0a82fc",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9794a6f0-b393-5909-8c05-37ea657efad5",
                    "name": "accountNumber",
                    "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "How much moved.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "4045dcf1-3a3a-5394-adf7-e96e4aa66018",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5f21bb47-16af-55a5-931e-0e599679cdb2",
                    "name": "amount",
                    "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Credit or debit.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "8108ada2-f873-556c-b782-61aa4803da34",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "200c8449-c365-5581-ac5d-48c9eaa15259",
                    "name": "kind",
                    "dataType": "8353956f-b202-59b7-87fd-5d8bd331a974",
                    "invariances": [],
                    "multiplicity": "1",
                    "relationship": "composition",
                    "entityRole": "states"
                  }
                ],
                "invariances": [],
                "variant": "DataStructure",
                "entityRef": "b890d6b9-1b3f-59ab-a387-20866695f0c9"
              }
            ],
            "entities": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "One movement of money into or out of one account.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f45a6aee-69e7-5363-9123-20a3052b74b9",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "The ledger's audit trail. Every change to a balance leaves exactly one entry per account it touched.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "026fe33e-2abf-56fe-a996-2b60c21129db",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "b890d6b9-1b3f-59ab-a387-20866695f0c9",
                "name": "LedgerEntry",
                "readableBy": []
              }
            ],
            "exceptions": [],
            "processes": [],
            "responsibilityDomains": [],
            "serviceContracts": [
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Adds money to an account and records the entry.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "30f6f3ce-bcc4-5fd8-899b-0b1dc33dafcc",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "d70ecf09-3aef-55eb-92b7-a27c419e8a88",
                "name": "Credit account",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Credit account'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "347f17c0-6705-5abe-aecf-a38f3d2c2f5d",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "9f34ba59-36e0-5ac6-b07e-9e45f338dc20",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account to credit.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "e1a1b4ad-4a0d-5d77-8cc4-31e7b8eb23b2",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "75d6db8e-2b40-5270-9ee1-9f676d40e337",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much to add.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "387d8e01-171d-56db-b93e-1a1090b078a1",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "08b008c1-d09b-5d97-adf5-30284aa06080",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Credit account' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "97b39a85-4b56-5681-b594-eedaf9242bfc",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "93292d4e-bc45-5ced-a4d4-5f49cd164c6c",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The balance after the credit.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "cfa88ba6-5759-5f2a-8c32-6e15b93a89d9",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d24131e8-739e-5822-8e96-21db4694efd9",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Money is moved only into an open account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "f184fcfb-5ecf-523f-a341-c14969b32074",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "6dcd9750-b0a1-5580-b734-106c21ae8514",
                    "name": "Account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Credit account' is requested while 'Account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "34c20133-f9ff-538c-9cb6-663b6ffc68e1",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1d9ce1c1-ad00-5b45-93d7-cb04c9e3da54",
                      "name": "Account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is credited.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "39ff8821-e283-5870-a9b5-e6c735a34672",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "83c0d50e-4ef0-5532-93fc-560074f1f799",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Credit account' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "32fa5c2d-69ab-5f44-8fc9-2c5b60f9461f",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "66a3b20e-2707-5d78-8581-3e82684644c9",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The balance went up by exactly the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0377fdff-1fa0-5391-9266-268f3530c666",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "The defining use of `@pre`: `a` is the account after the service, `a.balance@pre` the same account's balance before it, matched by its account number.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "e3df44bc-3a54-541e-9453-1753054e477e",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "bb0196b2-bace-5503-b5a4-0f5738f9e018",
                    "name": "Balance increased",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | a.balance = a.balance@pre + request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the balance after the credit.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "37a4fab1-cf2a-5d9a-97c9-94760f663a5f",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ddbad2c1-e19e-5feb-9cc1-fd390a5c76b2",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Exactly one ledger entry was added.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "c5b861d9-8f3f-53ec-8424-2be09a3335e6",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1a098cc0-8236-5453-858e-b4601c74ae3e",
                    "name": "Entry recorded",
                    "formalSpecification": {
                      "body": "LedgerEntry.allInstances()->size() = LedgerEntry.allInstances@pre()->size() + 1",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Takes money out of an account and records the entry.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5844843b-3071-506f-b92c-df6ab4896c4a",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "e568d0c3-102a-57c7-a834-3a34ad6b32ef",
                "name": "Debit account",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Debit account'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "b0251a5a-5ac8-53ae-bc69-5713dd2467d2",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "ce1d3da8-6bc8-5c4a-9548-f92444b0b046",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account to debit.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "bc3f9748-86e3-534c-be82-f9070ee4292e",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1d289b5f-ee84-5eff-89f5-29b2116ae99b",
                      "name": "accountNumber",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much to take.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "28b2a855-fb62-53e4-9768-642cabacc167",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "30c77408-c9c0-527b-9689-466f01abf65c",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Debit account' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1ef6d37b-5b5d-5579-b441-e4c7e5ce104c",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "40ed6199-3900-5728-ae6c-a84b13c05532",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The balance after the debit.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "240a498d-cec5-547d-87bd-ec03ecbe1c48",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "68483f4f-27c8-5c9d-bb7b-44988867ba05",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Money is moved only out of an open account.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b0fd8ad6-2097-53ca-8267-e01efd5573b3",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7c6f4e2b-2920-5164-9c14-9bd6daf28243",
                    "name": "Account is open",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.status = AccountStatus::open",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Debit account' is requested while 'Account is open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "6e6caaa1-1fc2-5d4c-b31b-a3b181990187",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "30330a8d-5a5b-5917-8844-81df8b4d9340",
                      "name": "Account is open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is debited.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "deecc621-7df6-514a-871e-6dbc942f8039",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "961fd421-c5c8-5888-965c-8a107de54688",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Debit account' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "97b50c4e-7e1b-5e63-bdb1-658ef80b4bcb",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "259be77f-5f34-5b80-ba09-fc1fb797ae12",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account holds at least the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "bb6eee65-83e9-529f-b09b-e8c9f317cc6e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "bc49c121-8ada-5e7b-93ef-17853cc15108",
                    "name": "Sufficient funds",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.accountNumber}) in a <> null and a.balance >= request.amount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Debit account' is requested while 'Sufficient funds' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0643364a-5e82-5d55-b1e6-d07864f4716b",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "3a71daec-1c71-55e9-ac09-4b495e055abf",
                      "name": "Sufficient funds not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The balance went down by exactly the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "243bf2fe-36ec-5f27-b6e5-42ba6489a4a6",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "4da5161f-0e3e-58d6-9f6e-462f7dcfc2c0",
                    "name": "Balance reduced",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | a.balance = a.balance@pre - request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the balance after the debit.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "572d64ac-52b3-5db5-9715-b4cc73cd488d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "a5ea63ae-ded3-5601-9eda-e4aaa78cdb90",
                    "name": "New balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.accountNumber)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Exactly one ledger entry was added.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "dbaf0c86-28c9-523c-8dc2-fd80127ebe33",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "2c313405-b888-53ff-8fc9-2b61ec936b9c",
                    "name": "Entry recorded",
                    "formalSpecification": {
                      "body": "LedgerEntry.allInstances()->size() = LedgerEntry.allInstances@pre()->size() + 1",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Moves a posted transfer's amount back, as one indivisible posting.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "e98614f5-e39e-5614-9ca8-12d1e8c54070",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "What undoes a *Post transfer* (its compensation): a transfer that refused partway through a batch leaves earlier postings in place, and a pre-condition exception means the service had no net effect. A reversal can itself fail — the payee may have spent the money — and a failed compensation needs a person to resolve.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d638298d-9981-5c0d-98b8-d3061a644ac7",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "1610b2f6-7e95-5927-9560-69ee9342758b",
                "name": "Reverse transfer",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Reverse transfer'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "39747ccb-5c94-520a-b6b6-55164d038272",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "188a747c-f6e3-5d1e-a924-249072ce89cc",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account the transfer paid from, which is paid back.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0e2d5686-f4f0-50fb-acc4-e715c61ca0b5",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "747f817e-22f2-59c9-8d48-ef2f19301937",
                      "name": "fromAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account the transfer paid, which pays it back.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "3e5eeea0-955a-57b4-a288-85e753dcbd0b",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "16b82b42-6289-5a37-9dcc-c34e08aec6ae",
                      "name": "toAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The amount the transfer moved.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0f41248c-de55-54a5-a62c-4a981790c889",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "79fe6538-f0d9-59a5-9f39-9e87156416fd",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Reverse transfer' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "57a0ced4-1f1f-57db-887c-6b7322909b8d",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e13f3b3d-16fb-5f62-8954-daecd2f0e285",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The original paying account's balance after the reversal.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "ce82f26c-cd1b-5083-9a50-4ba2d8f6149a",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "9d99c76c-cebd-5593-b2a6-733c480cf665",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account paid still holds the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b2c69308-cd85-526c-a45f-381cd1814c3e",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "acaadb4e-109b-5ed9-a70b-397a4e25385d",
                    "name": "Payee can repay",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.toAccount}) in a <> null and a.balance >= request.amount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Reverse transfer' is requested while 'Payee can repay' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "1e61bd19-fc01-54bb-972b-17dea75e18e2",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "5b9cc9a8-8c4e-5d52-9ace-195cbcfce145",
                      "name": "Payee can repay not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account paid went down by the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "47ab7b7a-ad6d-5c9c-8498-a95929e31a34",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "9d7bf519-56f7-572b-bfcb-efef1ed46bf5",
                    "name": "Payee debited",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.toAccount)->forAll(a | a.balance = a.balance@pre - request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account went up by the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "33b8f79f-d20a-56c1-a801-f37a0d2dfcb8",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "dfd3f8c3-35d2-5da2-854c-883f34044dad",
                    "name": "Payer credited",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | a.balance = a.balance@pre + request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the paying account's new balance.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "5033d865-6337-5a77-9d87-e7134a15a2ef",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1ca43c44-0ca1-5e11-a8ee-91c203152816",
                    "name": "Payer balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Exactly two ledger entries were added: a debit and a credit.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0d61d645-f285-595f-884d-ad404e459e31",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "7ddbab55-8274-5a7d-be91-46df377bdfa9",
                    "name": "Entries recorded",
                    "formalSpecification": {
                      "body": "LedgerEntry.allInstances()->size() = LedgerEntry.allInstances@pre()->size() + 2",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [],
                "waivedPreConditions": [],
                "isQuery": false
              },
              {
                "annotations": [
                  {
                    "annotations": [],
                    "body": "Moves money from one account to another as one indivisible posting.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "b6786f9b-cf11-55a1-9837-2e9892e8d252",
                    "language": "en",
                    "markup": "text_plain",
                    "name": "Description",
                    "purpose": "shortDescription"
                  },
                  {
                    "annotations": [],
                    "body": "Why a service of its own rather than a debit followed by a credit: a transfer must happen **entirely or not at all**. Requested as two services, a failure between them would leave money taken and not delivered. Atomicity is therefore allocated to the ledger, which is the domain able to guarantee it. Undone by *Reverse transfer*, for a process that refuses after posting.",
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "afa58ebe-e893-5dc2-8b25-e0944c8a2c4f",
                    "language": "en",
                    "markup": "text_markdown",
                    "name": "Details",
                    "purpose": "detailedDescription"
                  }
                ],
                "formalizationOf": [],
                "formalizationSnapshots": [],
                "id": "2f7f6e45-7e52-542e-ba52-bfa3097ff066",
                "name": "Post transfer",
                "requestDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What is supplied when requesting 'Post transfer'.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "69d5130f-a8da-568a-91a4-9a33214ca1da",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "892f7191-73a3-587a-a908-45e13bcefc09",
                  "name": "Request",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account paying.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "829e44bf-3988-5306-97e8-d6cd743fd79a",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "0c4165b9-add4-5b0e-9108-2e3948bfffb3",
                      "name": "fromAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The account paid.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "8f956fd7-06da-56b4-aaf7-d5b3c3101bd8",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "f2e8d71a-c7b2-5d33-9041-5cb3fd011185",
                      "name": "toAccount",
                      "dataType": "9b674c86-8d9e-5b07-9423-d106c79100a7",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How much to move.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "7f3668b6-5d10-506a-8b8d-fe0327f76d49",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "ffea26a2-b5c1-5a1f-855f-05104e0d98ef",
                      "name": "amount",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "responseDataStructure": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "What 'Post transfer' yields once rendered.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "c417318f-03ee-5277-a174-647acfc156ea",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "9232d34c-2bd9-5f1a-ab1c-d58413a0936b",
                  "name": "Response",
                  "abstract": false,
                  "fields": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "The paying account's balance after the transfer.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "ddf47c20-8085-5538-8777-8a1290b7f394",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "e4a71983-a968-521a-a1b0-46514a1cdcf6",
                      "name": "newBalance",
                      "dataType": "cd4f6ae2-5f75-58ff-9621-f159a8ab8ade",
                      "invariances": [],
                      "multiplicity": "1",
                      "relationship": "composition"
                    }
                  ],
                  "invariances": [],
                  "variant": "DataStructure"
                },
                "preConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Money moves only between open accounts.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "717c0fa5-eb32-540d-9386-06f03adc8b39",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "17baafc2-f828-5de4-8c84-29645d77058c",
                    "name": "Both accounts are open",
                    "formalSpecification": {
                      "body": "(let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.status = AccountStatus::open) and (let a = getAccount(Tuple{accountNumber = request.toAccount}) in a <> null and a.status = AccountStatus::open)",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Post transfer' is requested while 'Both accounts are open' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "da52cd6f-3c39-519f-975f-38b1ef872e4e",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "b5686694-5f77-5f26-9b24-7bfba2f15f2f",
                      "name": "Both accounts are open not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "An account is not paid from itself.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "070f712e-341b-5153-a12c-04c9933382cd",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "c9274fc7-8718-5e4b-a56d-3742117467d3",
                    "name": "Different accounts",
                    "formalSpecification": {
                      "body": "request.fromAccount <> request.toAccount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Post transfer' is requested while 'Different accounts' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "90bdcb36-8344-530b-b6bd-6477c61aa567",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "24c8a310-4adb-5aaf-9021-e60536a12922",
                      "name": "Different accounts not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only a positive amount is moved.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1335d246-ae33-537c-bdcc-6bdd611a827c",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "5a1351c0-2825-5f90-b494-d7d628fe3577",
                    "name": "Amount is positive",
                    "formalSpecification": {
                      "body": "request.amount > 0",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Post transfer' is requested while 'Amount is positive' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "a74dd055-c557-55e1-9133-5636ff994224",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "1e8e35be-562c-50b1-8089-3290e4fb9e7c",
                      "name": "Amount is positive not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "No single posting moves more than 50 000.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "d6c739cd-145d-598b-90a1-79ecc6eb25c1",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "A control the ledger enforces on every posting. A larger amount is moved as several postings — see *Transfer large amount*.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "308d3d78-8853-5dde-afae-82f784f3e88e",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "74d41af9-dda5-5a66-bd94-4158003ef62f",
                    "name": "Within the posting limit",
                    "formalSpecification": {
                      "body": "request.amount <= 50000",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Post transfer' is requested while 'Within the posting limit' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "68916554-0571-5776-9c3f-f2700322e248",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "a061974e-e841-597e-8b38-f674b1650542",
                      "name": "Within the posting limit not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account holds at least the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "25f6c137-0fec-57b5-ad68-bef0379af41d",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "948107e2-c643-57da-9340-8bd9b9d74d7e",
                    "name": "Sufficient funds",
                    "formalSpecification": {
                      "body": "let a = getAccount(Tuple{accountNumber = request.fromAccount}) in a <> null and a.balance >= request.amount",
                      "specificationLanguage": "OCL"
                    },
                    "raisedException": {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "Raised when 'Post transfer' is requested while 'Sufficient funds' does not hold.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "9fa1f31b-f0a4-56f7-b60d-3497a62b0376",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "70b7fd41-0cec-599f-8dcf-e58ec354815e",
                      "name": "Sufficient funds not met",
                      "abstract": false,
                      "fields": [],
                      "invariances": [],
                      "variant": "DataStructure"
                    },
                    "exceptionConstraints": [],
                    "requiredBy": []
                  }
                ],
                "postConditions": [
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The paying account went down by the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "0c99a179-77e4-5152-9099-78681c3077cf",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "b8d60994-161a-5a86-bd6c-5f0e202d6040",
                    "name": "Payer debited",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | a.balance = a.balance@pre - request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The account paid went up by the amount.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "669c2013-2e3b-5032-add9-bf29d83d7ebe",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "1657eb69-7f50-5a85-a2cb-f91cc4635427",
                    "name": "Payee credited",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.toAccount)->forAll(a | a.balance = a.balance@pre + request.amount)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The bank holds as much money in total as before.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "1b7d4db7-883f-51f9-ac38-409701107147",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      },
                      {
                        "annotations": [],
                        "body": "Follows from the two above, and is worth stating anyway: it is the property an auditor checks, and stating it lets a reviewer see it was meant.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "799dee84-9497-5057-8fad-156177b9e528",
                        "language": "en",
                        "markup": "text_markdown",
                        "name": "Details",
                        "purpose": "detailedDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "4d9de33b-6ce4-5d29-9c32-3b7b33c420b0",
                    "name": "Money is conserved",
                    "formalSpecification": {
                      "body": "Account.allInstances()->collect(a | a.balance)->sum() = Account.allInstances@pre()->collect(a | a.balance)->sum()",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Only the two accounts' balances moved.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "b498476a-e9f7-5e8d-8641-bdc753d02c40",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "ee21b07b-3683-59be-abce-fcfc70b719d1",
                    "name": "No other account changed",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber <> request.fromAccount and a.accountNumber <> request.toAccount)->forAll(a | a.balance = a.balance@pre)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "The response states the paying account's new balance.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "4b1e3be0-bd67-5e37-9ea0-69e0cdbd0f58",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "d5aa316e-6c7c-551e-8b07-d136025e0d3a",
                    "name": "Payer balance reported",
                    "formalSpecification": {
                      "body": "Account.allInstances()->select(a | a.accountNumber = request.fromAccount)->forAll(a | response.newBalance = a.balance)",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  },
                  {
                    "annotations": [
                      {
                        "annotations": [],
                        "body": "Exactly two ledger entries were added: a debit and a credit.",
                        "formalizationOf": [],
                        "formalizationSnapshots": [],
                        "id": "756233c2-f655-5e9b-8c1d-d552c314352f",
                        "language": "en",
                        "markup": "text_plain",
                        "name": "Description",
                        "purpose": "shortDescription"
                      }
                    ],
                    "formalizationOf": [],
                    "formalizationSnapshots": [],
                    "id": "f87d8b70-ec61-525c-b65c-e3f475e68df3",
                    "name": "Entries recorded",
                    "formalSpecification": {
                      "body": "LedgerEntry.allInstances()->size() = LedgerEntry.allInstances@pre()->size() + 2",
                      "specificationLanguage": "OCL"
                    },
                    "messageSendEvents": [],
                    "requiredBy": [],
                    "isPostCondition": true
                  }
                ],
                "provisionalStakeholders": [],
                "publishedTo": [
                  "d118cbf8-9a30-5345-a868-c2d1b875af4f"
                ],
                "waivedPreConditions": [],
                "isQuery": false,
                "compensation": {
                  "annotations": [
                    {
                      "annotations": [],
                      "body": "A posting is undone by moving its amount back.",
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "6466bf77-4344-5012-acc9-8b2f9e32edac",
                      "language": "en",
                      "markup": "text_plain",
                      "name": "Description",
                      "purpose": "shortDescription"
                    }
                  ],
                  "formalizationOf": [],
                  "formalizationSnapshots": [],
                  "id": "e0ed7f1f-76d3-53e6-a175-ee2fd943cab1",
                  "name": "Undo by Reverse transfer",
                  "service": "1610b2f6-7e95-5927-9560-69ee9342758b",
                  "requestConstraints": [
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How 'fromAccount' is populated for the undo.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "eaddd2b4-34be-51f2-936e-44c5b422a49d",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "5a8372b3-3b7b-575b-82a5-973858a21366",
                      "name": "fromAccount",
                      "formalSpecification": {
                        "body": "providerRequest.fromAccount = request.fromAccount",
                        "specificationLanguage": "OCL"
                      },
                      "variant": "RequestConstraint"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How 'toAccount' is populated for the undo.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "0cf79a2a-436e-50c5-b055-a538385c2632",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "d85fbfd3-f65e-51fc-80c0-dba9150740ce",
                      "name": "toAccount",
                      "formalSpecification": {
                        "body": "providerRequest.toAccount = request.toAccount",
                        "specificationLanguage": "OCL"
                      },
                      "variant": "RequestConstraint"
                    },
                    {
                      "annotations": [
                        {
                          "annotations": [],
                          "body": "How 'amount' is populated for the undo.",
                          "formalizationOf": [],
                          "formalizationSnapshots": [],
                          "id": "ef6e2539-47a3-5800-8273-be57a79eb702",
                          "language": "en",
                          "markup": "text_plain",
                          "name": "Description",
                          "purpose": "shortDescription"
                        }
                      ],
                      "formalizationOf": [],
                      "formalizationSnapshots": [],
                      "id": "964ce58d-aa83-53ba-b6a9-640e6d9dbcbe",
                      "name": "amount",
                      "formalSpecification": {
                        "body": "providerRequest.amount = request.amount",
                        "specificationLanguage": "OCL"
                      },
                      "variant": "RequestConstraint"
                    }
                  ]
                }
              }
            ]
          }
        ],
        "serviceContracts": []
      }
    ]
  }
}
